From 4984788e58195b04c4e512287a7a9b9d42046225 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Tue, 20 Aug 2024 19:57:55 -0400 Subject: [PATCH 01/84] reset to yodarm --- .github/workflows/node.yml | 56 +- .gitignore | 4 +- .npmrc | 2 + .nvmrc | 2 +- .vscode/extensions.json | 3 +- Makefile | 5 +- apps/main/package.json | 20 + apps/main/server.ts | 112 + migrations/0001-createAttachmentPoint.sql | 8 + migrations/0002-createBrand.sql | 10 + migrations/0003-createModel.sql | 35 + migrations/0004-createAbstractPartType.sql | 40 + migrations/0005-createPartGrade.sql | 11 + migrations/0006-createPartType.sql | 17 + migrations/0007-createBrandedPart.sql | 22 + migrations/0008-createPart.sql | 25 + migrations/0009-createDriverClass.sql | 8 + migrations/0010-createPlayerType.sql | 8 + migrations/0011-createPlayer.sql | 90 + migrations/0012-createSkinType.sql | 8 + migrations/0013-createPtSkin.sql | 77 + migrations/0014-createVehicle.sql | 19 + migrations/0015-seedAttachmentPoint.sql | 19 + migrations/0016-seedBrand.sql | 134 + migrations/0017-seedModel.sql | 96122 ++++++++++++++++ migrations/0018-seedAbstractPartType.sql | 1952 + migrations/0019-seedAbstractPartGrade.sql | 8 + migrations/0020-seedAbstractPartType.sql | 16273 +++ migrations/0021-seedBrandedPart.sql | 32092 ++++++ migrations/0022-seedPart.sql | 1 + migrations/0023-seedDriverClass.sql | 6 + migrations/0024-seedPlayerType.sql | 8 + migrations/0025-seedPlayer.sql | 33026 ++++++ migrations/0026-createSVACarClass.sql | 8 + migrations/0027-createSVAModeRestriction.sql | 8 + .../0028-createStockVehicleAtrributes.sql | 31 + migrations/0029-seedSVACarClass.sql | 7 + migrations/0030-seedSVAModeRestriction.sql | 9 + .../0031-seedStockVehicleAttributes.sql | 158 + migrations/0032-createStockAssembly.sql | 28 + migrations/0033-seedStockAssembly.sql | 9303 ++ migrations/0034-seedSkinType.sql | 13 + migrations/0035-seedPTSkin.sql | 77052 +++++++++++++ migrations/0037-createNextPartNumberSeq.sql | 3 + migrations/0038-createWarehouse.sql | 14 + migrations/0039-createLogin.sql | 9 + migrations/0040-createProfile.sql | 26 + migrations/0041-createKey.sql | 7 + package-lock.json | 8534 +- package.json | 27 +- packages/cli/package.json | 28 + packages/cli/test/index.test.ts | 7 + packages/cli/vite.config.ts | 22 + packages/database/package.json | 35 + packages/database/vite.config.ts | 22 + packages/gateway/package.json | 30 + packages/gateway/vite.config.ts | 22 + packages/mcots/ClientConnectionManager.ts | 49 + packages/mcots/errors/ErrorNoKey.ts | 5 + packages/mcots/index.ts | 18 + packages/mcots/messageProcessors/index.ts | 39 + .../messageProcessors/processClientConnect.ts | 86 + .../processClientTracking.ts | 27 + .../messageProcessors/processServerLogin.ts | 35 + .../messageProcessors/processSetOptions.ts | 27 + .../messageProcessors/processStockCarInfo.ts | 107 + .../mcots/messageProcessors/sendSuccess.ts | 17 + packages/mcots/package.json | 25 + .../mcots/payloads/ClientConnectMessage.ts | 72 + .../mcots/payloads/ClientTrackingMessage.ts | 44 + .../mcots/payloads/LoginCompleteMessage.ts | 231 + packages/mcots/payloads/LoginMessage.ts | 86 + packages/mcots/payloads/SetOptionsMessage.ts | 78 + packages/mcots/payloads/StockCar.ts | 122 + packages/mcots/payloads/index.ts | 8 + packages/mcots/test/index.test.ts | 7 + packages/mcots/types.ts | 0 packages/mcots/vite.config.ts | 22 + .../getLobMiniRiffList.ts | 40 + .../getLobMiniUserList.ts | 28 + packages/nps/gameMessageProcessors/index.ts | 88 + .../gameMessageProcessors/lobbyCommands.ts | 15 + .../processCheckPlateText.ts | 33 + .../processCheckProfileName.ts | 33 + .../processCreateProfile.ts | 45 + .../processDeleteProfile.ts | 109 + .../processEncryptedGameCommand.ts | 113 + .../gameMessageProcessors/processGameLogin.ts | 210 + .../processGameLogout.ts | 15 + .../processGetFirstBuddy.ts | 44 + .../processGetProfileInfo.ts | 66 + .../processGetProfileMaps.ts | 71 + .../nps/gameMessageProcessors/processPing.ts | 22 + .../processSelectPersona.ts | 50 + .../gameMessageProcessors/processUserLogin.ts | 72 + packages/nps/index.ts | 53 + packages/nps/messageStructs/GameMessage.ts | 205 + packages/nps/messageStructs/GameProfile.ts | 198 + packages/nps/messageStructs/MiniRiffList.ts | 100 + packages/nps/messageStructs/MiniUserList.ts | 74 + packages/nps/messageStructs/NPSList.ts | 34 + packages/nps/messageStructs/ProfileList.ts | 59 + packages/nps/messageStructs/SessionKey.ts | 113 + packages/nps/messageStructs/UserAction.ts | 133 + packages/nps/messageStructs/UserInfo.ts | 46 + packages/nps/messageStructs/UserStatus.ts | 178 + packages/nps/package.json | 25 + packages/nps/services/account.ts | 44 + packages/nps/services/profile.ts | 74 + packages/nps/services/token.ts | 68 + packages/nps/services/types.ts | 18 + packages/nps/src/EncryptionSession.ts | 68 + packages/nps/src/UserStatusManager.ts | 80 + packages/nps/src/utils/pureCompare.ts | 48 + packages/nps/src/utils/pureGet.ts | 59 + packages/nps/src/utils/purePut.ts | 105 + packages/nps/src/utils/sendNPSAck.ts | 11 + packages/nps/test/index.test.ts | 7 + packages/nps/types.ts | 23 + packages/nps/vite.config.ts | 22 + packages/patch/package.json | 27 + packages/patch/vite.config.ts | 22 + packages/shard/package.json | 27 + packages/shard/vite.config.ts | 22 + packages/shared-packets/index.ts | 11 + packages/shared-packets/package.json | 22 + packages/shared-packets/src/BasePacket.ts | 48 + packages/shared-packets/src/ServerMessage.ts | 372 + packages/shared-packets/src/interfaces.ts | 15 + packages/shared-packets/src/utils.ts | 5 + packages/shared-packets/test/index.test.ts | 7 + packages/shared-packets/tsconfig.json | 109 + packages/shared-packets/vite.config.ts | 22 + packages/shared/index.ts | 31 + packages/shared/package.json | 34 + packages/shared/vite.config.ts | 22 + server.ts | 20 +- 137 files changed, 277729 insertions(+), 2717 deletions(-) create mode 100644 .npmrc create mode 100644 apps/main/package.json create mode 100755 apps/main/server.ts create mode 100644 migrations/0001-createAttachmentPoint.sql create mode 100644 migrations/0002-createBrand.sql create mode 100644 migrations/0003-createModel.sql create mode 100644 migrations/0004-createAbstractPartType.sql create mode 100644 migrations/0005-createPartGrade.sql create mode 100644 migrations/0006-createPartType.sql create mode 100644 migrations/0007-createBrandedPart.sql create mode 100644 migrations/0008-createPart.sql create mode 100644 migrations/0009-createDriverClass.sql create mode 100644 migrations/0010-createPlayerType.sql create mode 100644 migrations/0011-createPlayer.sql create mode 100644 migrations/0012-createSkinType.sql create mode 100644 migrations/0013-createPtSkin.sql create mode 100644 migrations/0014-createVehicle.sql create mode 100644 migrations/0015-seedAttachmentPoint.sql create mode 100644 migrations/0016-seedBrand.sql create mode 100644 migrations/0017-seedModel.sql create mode 100644 migrations/0018-seedAbstractPartType.sql create mode 100644 migrations/0019-seedAbstractPartGrade.sql create mode 100644 migrations/0020-seedAbstractPartType.sql create mode 100644 migrations/0021-seedBrandedPart.sql create mode 100644 migrations/0022-seedPart.sql create mode 100644 migrations/0023-seedDriverClass.sql create mode 100644 migrations/0024-seedPlayerType.sql create mode 100644 migrations/0025-seedPlayer.sql create mode 100644 migrations/0026-createSVACarClass.sql create mode 100644 migrations/0027-createSVAModeRestriction.sql create mode 100644 migrations/0028-createStockVehicleAtrributes.sql create mode 100644 migrations/0029-seedSVACarClass.sql create mode 100644 migrations/0030-seedSVAModeRestriction.sql create mode 100644 migrations/0031-seedStockVehicleAttributes.sql create mode 100644 migrations/0032-createStockAssembly.sql create mode 100644 migrations/0033-seedStockAssembly.sql create mode 100644 migrations/0034-seedSkinType.sql create mode 100644 migrations/0035-seedPTSkin.sql create mode 100644 migrations/0037-createNextPartNumberSeq.sql create mode 100644 migrations/0038-createWarehouse.sql create mode 100644 migrations/0039-createLogin.sql create mode 100644 migrations/0040-createProfile.sql create mode 100644 migrations/0041-createKey.sql create mode 100644 packages/cli/package.json create mode 100644 packages/cli/test/index.test.ts create mode 100644 packages/cli/vite.config.ts create mode 100644 packages/database/package.json create mode 100644 packages/database/vite.config.ts create mode 100644 packages/gateway/package.json create mode 100644 packages/gateway/vite.config.ts create mode 100644 packages/mcots/ClientConnectionManager.ts create mode 100644 packages/mcots/errors/ErrorNoKey.ts create mode 100644 packages/mcots/index.ts create mode 100644 packages/mcots/messageProcessors/index.ts create mode 100644 packages/mcots/messageProcessors/processClientConnect.ts create mode 100644 packages/mcots/messageProcessors/processClientTracking.ts create mode 100644 packages/mcots/messageProcessors/processServerLogin.ts create mode 100644 packages/mcots/messageProcessors/processSetOptions.ts create mode 100644 packages/mcots/messageProcessors/processStockCarInfo.ts create mode 100644 packages/mcots/messageProcessors/sendSuccess.ts create mode 100644 packages/mcots/package.json create mode 100644 packages/mcots/payloads/ClientConnectMessage.ts create mode 100644 packages/mcots/payloads/ClientTrackingMessage.ts create mode 100644 packages/mcots/payloads/LoginCompleteMessage.ts create mode 100644 packages/mcots/payloads/LoginMessage.ts create mode 100644 packages/mcots/payloads/SetOptionsMessage.ts create mode 100644 packages/mcots/payloads/StockCar.ts create mode 100644 packages/mcots/payloads/index.ts create mode 100644 packages/mcots/test/index.test.ts create mode 100644 packages/mcots/types.ts create mode 100644 packages/mcots/vite.config.ts create mode 100644 packages/nps/gameMessageProcessors/getLobMiniRiffList.ts create mode 100644 packages/nps/gameMessageProcessors/getLobMiniUserList.ts create mode 100644 packages/nps/gameMessageProcessors/index.ts create mode 100644 packages/nps/gameMessageProcessors/lobbyCommands.ts create mode 100644 packages/nps/gameMessageProcessors/processCheckPlateText.ts create mode 100644 packages/nps/gameMessageProcessors/processCheckProfileName.ts create mode 100644 packages/nps/gameMessageProcessors/processCreateProfile.ts create mode 100644 packages/nps/gameMessageProcessors/processDeleteProfile.ts create mode 100644 packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts create mode 100644 packages/nps/gameMessageProcessors/processGameLogin.ts create mode 100644 packages/nps/gameMessageProcessors/processGameLogout.ts create mode 100644 packages/nps/gameMessageProcessors/processGetFirstBuddy.ts create mode 100644 packages/nps/gameMessageProcessors/processGetProfileInfo.ts create mode 100644 packages/nps/gameMessageProcessors/processGetProfileMaps.ts create mode 100644 packages/nps/gameMessageProcessors/processPing.ts create mode 100644 packages/nps/gameMessageProcessors/processSelectPersona.ts create mode 100644 packages/nps/gameMessageProcessors/processUserLogin.ts create mode 100644 packages/nps/index.ts create mode 100644 packages/nps/messageStructs/GameMessage.ts create mode 100644 packages/nps/messageStructs/GameProfile.ts create mode 100644 packages/nps/messageStructs/MiniRiffList.ts create mode 100644 packages/nps/messageStructs/MiniUserList.ts create mode 100644 packages/nps/messageStructs/NPSList.ts create mode 100644 packages/nps/messageStructs/ProfileList.ts create mode 100644 packages/nps/messageStructs/SessionKey.ts create mode 100644 packages/nps/messageStructs/UserAction.ts create mode 100644 packages/nps/messageStructs/UserInfo.ts create mode 100644 packages/nps/messageStructs/UserStatus.ts create mode 100644 packages/nps/package.json create mode 100644 packages/nps/services/account.ts create mode 100644 packages/nps/services/profile.ts create mode 100644 packages/nps/services/token.ts create mode 100644 packages/nps/services/types.ts create mode 100644 packages/nps/src/EncryptionSession.ts create mode 100644 packages/nps/src/UserStatusManager.ts create mode 100644 packages/nps/src/utils/pureCompare.ts create mode 100644 packages/nps/src/utils/pureGet.ts create mode 100644 packages/nps/src/utils/purePut.ts create mode 100644 packages/nps/src/utils/sendNPSAck.ts create mode 100644 packages/nps/test/index.test.ts create mode 100644 packages/nps/types.ts create mode 100644 packages/nps/vite.config.ts create mode 100644 packages/patch/package.json create mode 100644 packages/patch/vite.config.ts create mode 100644 packages/shard/package.json create mode 100644 packages/shard/vite.config.ts create mode 100644 packages/shared-packets/index.ts create mode 100644 packages/shared-packets/package.json create mode 100644 packages/shared-packets/src/BasePacket.ts create mode 100644 packages/shared-packets/src/ServerMessage.ts create mode 100644 packages/shared-packets/src/interfaces.ts create mode 100644 packages/shared-packets/src/utils.ts create mode 100644 packages/shared-packets/test/index.test.ts create mode 100644 packages/shared-packets/tsconfig.json create mode 100644 packages/shared-packets/vite.config.ts create mode 100644 packages/shared/index.ts create mode 100644 packages/shared/package.json create mode 100644 packages/shared/vite.config.ts diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index 3659ebfb1..cae065c6d 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -1,52 +1,58 @@ -name: Node.js CI +name: Node.js on: push: - branches: [main] pull_request: - branches: [main] env: MCO_LOG_LEVEL: warn + EXTERNAL_HOST: mcouniverse.com + PRIVATE_KEY_FILE: thebeast/data/private_key.pem # These secrets are stored in the repository and are safe to "leak" + CERTIFICATE_FILE: thebeast/data/mcouniverse.crt # These secrets are stored in the repository and are safe to "leak" + PUBLIC_KEY_FILE: thebeast/data/pub.key # These secrets are stored in the repository and are safe to "leak" jobs: - build: + build-test: runs-on: ubuntu-latest - strategy: - matrix: - node-version: [18.x, 20.x, 21.x] - steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4 with: fetch-depth: 0 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v3 + - name: Use Node.js 22.x + uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: - node-version: ${{ matrix.node-version }} - - run: npm ci install - - name: Test - run: npm run test:only + node-version: 22.x + - name: Install and test + run: | + npm install + export DATABASE_URL=$(npx pg-test start) + npm test + npx pg-test stop + env: + CODECOV_UPLOAD_BUNDLE_TOKEN: ${{ secrets.CODECOV_UPLOAD_BUNDLE_TOKEN }} - name: Codecov - env: # Or as an environment variable + if: ${{ always() }} # using always() to always run this step because i am uploading test results and coverage in one step + env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | pip install --user pytest pip install --user codecov-cli - codecovcli --verbose create-commit --fail-on-error - codecovcli --verbose create-report --fail-on-error + codecovcli --verbose create-commit --fail-on-error + codecovcli --verbose create-report --fail-on-error + codecovcli do-upload --report-type test_results --file mcos.junit.xml + codecovcli --verbose do-upload --fail-on-error --flag cli --name cli-${{ matrix.node-version }} + codecovcli --verbose do-upload --fail-on-error --flag connection --name connection-${{ matrix.node-version }} codecovcli --verbose do-upload --fail-on-error --flag database --name database-${{ matrix.node-version }} codecovcli --verbose do-upload --fail-on-error --flag gateway --name gateway-${{ matrix.node-version }} - codecovcli --verbose do-upload --fail-on-error --flag lobby --name lobby-${{ matrix.node-version }} - codecovcli --verbose do-upload --fail-on-error --flag login --name login-${{ matrix.node-version }} + codecovcli --verbose do-upload --fail-on-error --flag mcots --name mcots-${{ matrix.node-version }} + codecovcli --verbose do-upload --fail-on-error --flag nps --name nps-${{ matrix.node-version }} codecovcli --verbose do-upload --fail-on-error --flag patch --name patch-${{ matrix.node-version }} - codecovcli --verbose do-upload --fail-on-error --flag persona --name persona-${{ matrix.node-version }} codecovcli --verbose do-upload --fail-on-error --flag shard --name shard-${{ matrix.node-version }} - codecovcli --verbose do-upload --fail-on-error --flag transactions --name transactions-${{ matrix.node-version }} - codecovcli --verbose do-upload --fail-on-error --flag core --name core-${{ matrix.node-version }} + codecovcli --verbose do-upload --fail-on-error --flag shared --name shared-${{ matrix.node-version }} + codecovcli --verbose do-upload --fail-on-error --flag shared-packets --name shared-packets-${{ matrix.node-version }} - - uses: actions/upload-artifact@v3 + - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4 with: name: coverage_${{ matrix.node-version }} - path: coverage + path: coverage \ No newline at end of file diff --git a/.gitignore b/.gitignore index b559f032f..53b636c5b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,4 +19,6 @@ dist # Sentry Auth Token .sentryclirc *.map -out/* \ No newline at end of file +out/* +*.junit.xml +mcos.junit.xml diff --git a/.npmrc b/.npmrc new file mode 100644 index 000000000..b549de955 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +node-options="--openssl-legacy-provider" +link-workspace-packages=true \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 8c60e1e54..6ddfd1ad8 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v20.5.1 +22.6.0 \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8ba66b166..d8d18723f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -4,7 +4,6 @@ "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "ms-vscode.makefile-tools", - "usernamehw.errorlens", - "ritwickdey.LiveServer" + "usernamehw.errorlens" ] } diff --git a/Makefile b/Makefile index 582d731be..7dd60683c 100644 --- a/Makefile +++ b/Makefile @@ -9,10 +9,9 @@ certs: test: @clear - @npm test + @pnpm test + -build: - @npm run build:dev start: @EXTERNAL_HOST=mcouniverse.com PRIVATE_KEY_FILE=data/private_key.pem CERTIFICATE_FILE=data/mcouniverse.crt PUBLIC_KEY_FILE=data/pub.key LOG_LEVEL=trace npm run start:dev diff --git a/apps/main/package.json b/apps/main/package.json new file mode 100644 index 000000000..d79f2dfd9 --- /dev/null +++ b/apps/main/package.json @@ -0,0 +1,20 @@ +{ + "name": "rusty-motors-server", + "version": "1.0.0", + "type": "module", + "scripts": { + "start": "tsx --openssl-legacy-provider --env-file=../../.env server.ts" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "@sentry/profiling-node": "^8.0.0", + "rusty-motors-gateway": "^1.0.0", + "rusty-motors-shared": "^1.0.0", + "tsx": "^4.10.2", + "typescript": "^5.4.5" + }, + "description": "" +} diff --git a/apps/main/server.ts b/apps/main/server.ts new file mode 100755 index 000000000..6ecb6109a --- /dev/null +++ b/apps/main/server.ts @@ -0,0 +1,112 @@ +// mcos is a game server, written from scratch, for an old game +// Copyright (C) <2017> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import * as Sentry from "@sentry/node"; +import { nodeProfilingIntegration } from "@sentry/profiling-node"; +import { getServerLogger } from "rusty-motors-shared"; +import { verifyLegacyCipherSupport } from "rusty-motors-shared"; +import { getServerConfiguration } from "rusty-motors-shared"; +import { getGatewayServer } from "rusty-motors-gateway"; + +process.on("unhandledRejection", (reason, promise) => { + console.error("Unhandled Rejection at:", promise, "reason:", reason); + Sentry.captureException(reason); +}); + + +export default async function main() { + const coreLogger = getServerLogger({ + level: "info", + }); + + try { + verifyLegacyCipherSupport(); + } catch (err) { + coreLogger.fatal(`Error in core server: ${String(err)}`); + throw err; + } + + Sentry.init({ + dsn: "https://f4c0126e2fc35876c860dd72fc056db9@o1413557.ingest.sentry.io/4506787875061760", + + // We recommend adjusting this value in production, or using tracesSampler + // for finer control + tracesSampleRate: 1.0, + profilesSampleRate: 1.0, // Profiling sample rate is relative to tracesSampleRate + integrations: [ + nodeProfilingIntegration(), + ], + _experiments: { + metricsAggregator: true, + }, + }); + + try { + if (typeof process.env["EXTERNAL_HOST"] === "undefined") { + console.error("Please set EXTERNAL_HOST"); + process.exit(1); + } + if (typeof process.env["CERTIFICATE_FILE"] === "undefined") { + console.error("Please set CERTIFICATE_FILE"); + process.exit(1); + } + if (typeof process.env["PRIVATE_KEY_FILE"] === "undefined") { + console.error("Please set PRIVATE_KEY_FILE"); + process.exit(1); + } + if (typeof process.env["PUBLIC_KEY_FILE"] === "undefined") { + console.error("Please set PUBLIC_KEY_FILE"); + process.exit(1); + } + const config = getServerConfiguration({ + host: process.env["EXTERNAL_HOST"], + certificateFile: process.env["CERTIFICATE_FILE"], + privateKeyFile: process.env["PRIVATE_KEY_FILE"], + publicKeyFile: process.env["PUBLIC_KEY_FILE"], + }); + + const appLog = getServerLogger(); + + const listeningPortList: number[] = [ + 6660, 7003, 8228, 8226, 8227, + // I don't know what part 9000 is for, but it's in the original list + // 9000, + 9001, 9002, 9003, 9004, 9005, 9006, + 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, + 53303, + ]; + + const gatewayServer = getGatewayServer({ + config, + log: appLog, + listeningPortList, + }); + + await gatewayServer.start(); + } catch (err) { + Sentry.captureException(err); + coreLogger.fatal(`Error in core server: ${String(err)}`); + throw err; + } +} + +try { + await main(); +} catch (error) { + console.error("Error in main server:", error); + process.exit(1); + +} diff --git a/migrations/0001-createAttachmentPoint.sql b/migrations/0001-createAttachmentPoint.sql new file mode 100644 index 000000000..ef813e080 --- /dev/null +++ b/migrations/0001-createAttachmentPoint.sql @@ -0,0 +1,8 @@ +CREATE TABLE + if not exists attachment_point ( + attachment_point_id INTEGER NOT NULL, + attachment_point VARCHAR(100) NOT NULL, + CONSTRAINT SYS_PK_11761 PRIMARY KEY (attachment_point_id) + ); + +CREATE UNIQUE INDEX SYS_IDX_SYS_PK_11761_11762 ON attachment_point (attachment_point_id); \ No newline at end of file diff --git a/migrations/0002-createBrand.sql b/migrations/0002-createBrand.sql new file mode 100644 index 000000000..0ccd4f8bf --- /dev/null +++ b/migrations/0002-createBrand.sql @@ -0,0 +1,10 @@ +create table + if not exists brand ( + brand_id INTEGER NOT NULL, + brand VARCHAR(100) NULL, + pic_name VARCHAR(50) NULL, + is_stock SMALLINT default 0, + CONSTRAINT SYS_PK_11763 PRIMARY KEY (brand_id) + ); + +CREATE UNIQUE INDEX SYS_IDX_SYS_PK_11795_11796 ON brand (brand_id); \ No newline at end of file diff --git a/migrations/0003-createModel.sql b/migrations/0003-createModel.sql new file mode 100644 index 000000000..ac5aa2f45 --- /dev/null +++ b/migrations/0003-createModel.sql @@ -0,0 +1,35 @@ +CREATE TABLE + if not exists model ( + model_id INTEGER NOT NULL, + brand_id INTEGER NOT NULL, + e_model VARCHAR(100), + g_model VARCHAR(100), + f_model VARCHAR(100), + s_model VARCHAR(100), + i_model VARCHAR(100), + j_model VARCHAR(100), + sw_model VARCHAR(100), + b_model VARCHAR(100), + e_extra_info VARCHAR(100), + g_extra_info VARCHAR(100), + f_extra_info VARCHAR(100), + s_extra_info VARCHAR(100), + i_extra_info VARCHAR(100), + j_extra_info VARCHAR(100), + sw_extra_info VARCHAR(100), + b_extra_info VARCHAR(100), + e_short_model VARCHAR(50), + g_short_model VARCHAR(50), + f_short_model VARCHAR(50), + s_short_model VARCHAR(50), + i_short_model VARCHAR(50), + j_short_model VARCHAR(50), + sw_short_model VARCHAR(50), + b_short_model VARCHAR(50), + debug_string VARCHAR(255), + debug_sort_string VARCHAR(50), + CONSTRAINT SYS_PK_11927 PRIMARY KEY (model_id), + CONSTRAINT MODEL_R_172 FOREIGN KEY (brand_id) REFERENCES brand (brand_id) + ); + +CREATE INDEX SYS_IDX_MODEL_R_172_12422 ON model (brand_id); \ No newline at end of file diff --git a/migrations/0004-createAbstractPartType.sql b/migrations/0004-createAbstractPartType.sql new file mode 100644 index 000000000..512fef5ac --- /dev/null +++ b/migrations/0004-createAbstractPartType.sql @@ -0,0 +1,40 @@ +CREATE TABLE + IF NOT EXISTS abstract_part_type ( + abstract_part_type_id INTEGER NOT NULL, + parent_abstract_part_type_id INTEGER, + depends_on INTEGER, + part_filename VARCHAR(20), + eapt VARCHAR(100) NOT NULL, + gapt VARCHAR(100), + faft VARCHAR(100), + saft VARCHAR(100), + iaft VARCHAR(100), + jaft VARCHAR(100), + sw_aft VARCHAR(100), + baft VARCHAR(100), + modified_rule INTEGER DEFAULT 0, + eut TEXT, + gut TEXT, + fut TEXT, + sut TEXT, + iut TEXT, + jut TEXT, + swut TEXT, + but TEXT, + part_paired INTEGER DEFAULT 0, + schematic_picname1 VARCHAR(9), + schematic_picname2 VARCHAR(9), + block_family_compatibility INTEGER DEFAULT 0, + repair_cost_modifier NUMERIC(100, 7) DEFAULT 0, + scrap_value_modifier NUMERIC(100, 7) DEFAULT 0, + garage_category INTEGER DEFAULT 0, + CONSTRAINT sys_pk_11740 PRIMARY KEY (abstract_part_type_id), + CONSTRAINT abstractparttype_r_191 FOREIGN KEY (depends_on) REFERENCES abstract_part_type (abstract_part_type_id), + CONSTRAINT abstractparttype_r2 FOREIGN KEY (parent_abstract_part_type_id) REFERENCES abstract_part_type (abstract_part_type_id) + ); + +CREATE INDEX sys_idx_abstractparttype_r_191_15170 ON abstract_part_type (depends_on); + +CREATE INDEX sys_idx_abstractparttype_r2_15181 ON abstract_part_type (parent_abstract_part_type_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11740_11741 ON abstract_part_type (abstract_part_type_id); \ No newline at end of file diff --git a/migrations/0005-createPartGrade.sql b/migrations/0005-createPartGrade.sql new file mode 100644 index 000000000..5a097a25a --- /dev/null +++ b/migrations/0005-createPartGrade.sql @@ -0,0 +1,11 @@ +CREATE TABLE + IF NOT EXISTS part_grade ( + part_grade_id INTEGER NOT NULL, + e_text VARCHAR(50), + g_text VARCHAR(50), + f_text VARCHAR(50), + part_grade VARCHAR(50), + CONSTRAINT sys_pk_11985 PRIMARY KEY (part_grade_id) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11985_11986 ON part_grade (part_grade_id); \ No newline at end of file diff --git a/migrations/0006-createPartType.sql b/migrations/0006-createPartType.sql new file mode 100644 index 000000000..46918109b --- /dev/null +++ b/migrations/0006-createPartType.sql @@ -0,0 +1,17 @@ +CREATE TABLE + IF NOT EXISTS part_type ( + part_type_id INTEGER NOT NULL, + abstract_part_type_id INTEGER NOT NULL, + part_type VARCHAR(100) NOT NULL, + part_filename VARCHAR(20), + part_grade_id INTEGER, + CONSTRAINT sys_pk_11991 PRIMARY KEY (part_type_id), + CONSTRAINT parttype_abstractparttypeparttype FOREIGN KEY (abstract_part_type_id) REFERENCES abstract_part_type (abstract_part_type_id), + CONSTRAINT parttype_partgradeparttype FOREIGN KEY (part_grade_id) REFERENCES part_grade (part_grade_id) + ); + +CREATE INDEX sys_idx_parttype_abstractparttypeparttype_12453 ON part_type (abstract_part_type_id); + +CREATE INDEX sys_idx_parttype_partgradeparttype_12463 ON part_type (part_grade_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11991_11992 ON part_type (part_type_id); \ No newline at end of file diff --git a/migrations/0007-createBrandedPart.sql b/migrations/0007-createBrandedPart.sql new file mode 100644 index 000000000..7e974a8e7 --- /dev/null +++ b/migrations/0007-createBrandedPart.sql @@ -0,0 +1,22 @@ +CREATE TABLE + IF NOT EXISTS branded_part ( + branded_part_id INTEGER NOT NULL, + part_type_id INTEGER NOT NULL, + model_id INTEGER NOT NULL, + mfg_date TIMESTAMP NOT NULL, + qty_avail INTEGER NOT NULL, + retail_price INTEGER NOT NULL, + max_item_wear SMALLINT, + engine_block_family_id INTEGER DEFAULT 0 NOT NULL, + CONSTRAINT sys_pk_11801 PRIMARY KEY (branded_part_id), + CONSTRAINT brandedpart_modelbrandedpart FOREIGN KEY (model_id) REFERENCES model (model_id), + CONSTRAINT brandedpart_parttypebrandedpart1 FOREIGN KEY (part_type_id) REFERENCES part_type (part_type_id) + ); + +CREATE INDEX brandedpart_engineblockfamilyid ON branded_part (engine_block_family_id); + +CREATE INDEX sys_idx_brandedpart_modelbrandedpart_12255 ON branded_part (model_id); + +CREATE INDEX sys_idx_brandedpart_parttypebrandedpart1_12269 ON branded_part (part_type_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11801_11802 ON branded_part (branded_part_id); \ No newline at end of file diff --git a/migrations/0008-createPart.sql b/migrations/0008-createPart.sql new file mode 100644 index 000000000..f52820da0 --- /dev/null +++ b/migrations/0008-createPart.sql @@ -0,0 +1,25 @@ +CREATE TABLE + IF NOT EXISTS part ( + part_id INTEGER NOT NULL, + parent_part_id INTEGER, + branded_part_id INTEGER NOT NULL, + percent_damage SMALLINT NOT NULL, + item_wear INTEGER NOT NULL, + attachment_point_id INTEGER, + owner_id INTEGER, + part_name VARCHAR(100), + repair_cost INTEGER DEFAULT 0, + scrap_value INTEGER DEFAULT 0, + CONSTRAINT sys_pk_11976 PRIMARY KEY (part_id), + CONSTRAINT part_brandedpartpart FOREIGN KEY (branded_part_id) REFERENCES branded_part (branded_part_id), + CONSTRAINT part_r25 FOREIGN KEY (parent_part_id) REFERENCES part (part_id), + CONSTRAINT part_r9 FOREIGN KEY (attachment_point_id) REFERENCES attachment_point (attachment_point_id) + ); + +CREATE INDEX sys_idx_part_brandedpartpart_12431 ON part (branded_part_id); + +CREATE INDEX sys_idx_part_r25_15192 ON part (parent_part_id); + +CREATE INDEX sys_idx_part_r9_12442 ON part (attachment_point_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11976_11977 ON part (part_id); \ No newline at end of file diff --git a/migrations/0009-createDriverClass.sql b/migrations/0009-createDriverClass.sql new file mode 100644 index 000000000..5908af5ca --- /dev/null +++ b/migrations/0009-createDriverClass.sql @@ -0,0 +1,8 @@ +CREATE TABLE + IF NOT EXISTS driver_class ( + driver_class_id SMALLINT NOT NULL, + driver_class VARCHAR(50), + CONSTRAINT sys_pk_11831 PRIMARY KEY (driver_class_id) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_11831_11832 ON driver_class (driver_class_id); \ No newline at end of file diff --git a/migrations/0010-createPlayerType.sql b/migrations/0010-createPlayerType.sql new file mode 100644 index 000000000..2f771a906 --- /dev/null +++ b/migrations/0010-createPlayerType.sql @@ -0,0 +1,8 @@ +CREATE TABLE + IF NOT EXISTS player_type ( + player_type_id INTEGER NOT NULL, + player_type VARCHAR(100) NOT NULL, + CONSTRAINT sys_pk_12040 PRIMARY KEY (player_type_id) + ); + + CREATE UNIQUE INDEX sys_idx_sys_pk_12040_12041 ON player_type (player_type_id); \ No newline at end of file diff --git a/migrations/0011-createPlayer.sql b/migrations/0011-createPlayer.sql new file mode 100644 index 000000000..3fd44484c --- /dev/null +++ b/migrations/0011-createPlayer.sql @@ -0,0 +1,90 @@ +CREATE TABLE + IF NOT EXISTS player ( + player_id INTEGER NOT NULL, + customer_id INTEGER NOT NULL, + player_type_id INTEGER NOT NULL, + sanctioned_score INTEGER, + challenge_score INTEGER, + last_logged_in TIMESTAMP, + times_logged_in SMALLINT, + bank_balance INTEGER NOT NULL, + num_cars_owned SMALLINT NOT NULL, + is_logged_in SMALLINT, + driver_style SMALLINT NOT NULL, + lp_code INTEGER NOT NULL, + lp_text VARCHAR(9), + car_num1 VARCHAR(2) NOT NULL, + car_num2 VARCHAR(2) NOT NULL, + car_num3 VARCHAR(2) NOT NULL, + car_num4 VARCHAR(2) NOT NULL, + car_num5 VARCHAR(2) NOT NULL, + car_num6 VARCHAR(2) NOT NULL, + dl_number VARCHAR(20), + persona VARCHAR(30) NOT NULL, + "address" VARCHAR(128), + residence VARCHAR(20), + vehicle_id INTEGER, + current_race_id INTEGER, + offline_driver_skill INTEGER, + offline_grudge INTEGER, + offline_reputation INTEGER, + total_time_played INTEGER, + car_info_setting INTEGER, + stock_classic_class SMALLINT, + stock_muscle_class SMALLINT, + modified_classic_class SMALLINT, + modified_muscle_class SMALLINT, + outlaw_class SMALLINT, + drag_class SMALLINT, + challenge_rung INTEGER, + offline_ai_car_class SMALLINT DEFAULT 0, + offline_ai_skin_id INTEGER DEFAULT 0, + offline_ai_car_bpt_id INTEGER DEFAULT 0, + offline_ai_state SMALLINT DEFAULT 0, + body_type INTEGER DEFAULT 0, + skin_color INTEGER DEFAULT 0, + hair_color INTEGER DEFAULT 0, + shirt_color INTEGER DEFAULT 0, + pants_color INTEGER DEFAULT 0, + offline_driver_style INTEGER, + offline_driver_attitude INTEGER, + evaded_fuzz INTEGER DEFAULT 0, + pinks_won INTEGER DEFAULT 0, + num_unread_mail INTEGER DEFAULT 0, + total_races_run INTEGER DEFAULT 0, + total_races_won INTEGER DEFAULT 0, + total_races_completed INTEGER DEFAULT 0, + total_winnings INTEGER DEFAULT 0, + insurance_risk_points INTEGER DEFAULT 0, + insurance_rating INTEGER DEFAULT 0, + challenge_races_run INTEGER DEFAULT 0, + challenge_races_won INTEGER DEFAULT 0, + challenge_races_completed INTEGER DEFAULT 0, + cars_lost INTEGER DEFAULT 0, + cars_won INTEGER DEFAULT 0, + CONSTRAINT sys_pk_12021 PRIMARY KEY ("player_id"), + CONSTRAINT player_driverclassplayer1 FOREIGN KEY (stock_muscle_class) REFERENCES driver_class (driver_class_id), + CONSTRAINT player_driverclassplayer2 FOREIGN KEY (modified_classic_class) REFERENCES driver_class (driver_class_id), + CONSTRAINT player_driverclassplayer3 FOREIGN KEY (modified_muscle_class) REFERENCES driver_class (driver_class_id), + CONSTRAINT player_driverclassplayer4 FOREIGN KEY (outlaw_class) REFERENCES driver_class (driver_class_id), + CONSTRAINT player_driverclassplayer5 FOREIGN KEY (drag_class) REFERENCES driver_class (driver_class_id), + CONSTRAINT player_r44 FOREIGN KEY (player_type_id) REFERENCES player_type (player_type_id) + ); + +CREATE INDEX IF NOT EXISTS player_numunreadmail ON player (num_unread_mail); + +CREATE INDEX IF NOT EXISTS player_offlinechallengecarbptid ON player (offline_ai_car_bpt_id); + +CREATE INDEX IF NOT EXISTS sys_idx_player_driverclassplayer1_12502 ON player (stock_muscle_class); + +CREATE INDEX IF NOT EXISTS sys_idx_player_driverclassplayer2_12523 ON player (modified_classic_class); + +CREATE INDEX IF NOT EXISTS sys_idx_player_driverclassplayer3_12544 ON player (modified_muscle_class); + +CREATE INDEX IF NOT EXISTS sys_idx_player_driverclassplayer4_12565 ON player (outlaw_class); + +CREATE INDEX IF NOT EXISTS sys_idx_player_driverclassplayer5_12586 ON player (drag_class); + +CREATE INDEX IF NOT EXISTS sys_idx_player_r44_12607 ON player (player_type_id); + +CREATE UNIQUE INDEX IF NOT EXISTS sys_idx_sys_pk_12021_12022 ON player (player_id); \ No newline at end of file diff --git a/migrations/0012-createSkinType.sql b/migrations/0012-createSkinType.sql new file mode 100644 index 000000000..b7e90e247 --- /dev/null +++ b/migrations/0012-createSkinType.sql @@ -0,0 +1,8 @@ +CREATE TABLE + IF NOT EXISTS skin_type ( + skin_type_id INTEGER NOT NULL, + skin_type VARCHAR(100), + CONSTRAINT sys_pk_12138 PRIMARY KEY (skin_type_id) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12138_12139 ON skin_type (skin_type_id); \ No newline at end of file diff --git a/migrations/0013-createPtSkin.sql b/migrations/0013-createPtSkin.sql new file mode 100644 index 000000000..a697a43f5 --- /dev/null +++ b/migrations/0013-createPtSkin.sql @@ -0,0 +1,77 @@ +CREATE TABLE + IF NOT EXISTS pt_skin ( + skin_id INTEGER NOT NULL, + creator_id INTEGER, + skin_type_id INTEGER, + part_type_id INTEGER, + e_skin VARCHAR(100), + g_skin VARCHAR(20), + f_skin VARCHAR(20), + s_skin VARCHAR(20), + i_skin VARCHAR(20), + j_skin VARCHAR(20), + sw_skin VARCHAR(20), + b_skin VARCHAR(20), + price INTEGER NOT NULL, + part_filename VARCHAR(20), + h0 SMALLINT, + s0 SMALLINT, + v0 SMALLINT, + c0 SMALLINT, + x0 SMALLINT, + y0 SMALLINT, + h1 SMALLINT, + s1 SMALLINT, + v1 SMALLINT, + c1 SMALLINT, + x1 SMALLINT, + y1 SMALLINT, + h2 SMALLINT, + s2 SMALLINT, + v2 SMALLINT, + c2 SMALLINT, + x2 SMALLINT, + y2 SMALLINT, + h3 SMALLINT, + s3 SMALLINT, + v3 SMALLINT, + c3 SMALLINT, + x3 SMALLINT, + y3 SMALLINT, + h4 SMALLINT, + s4 SMALLINT, + v4 SMALLINT, + c4 SMALLINT, + x4 SMALLINT, + y4 SMALLINT, + h5 SMALLINT, + s5 SMALLINT, + v5 SMALLINT, + c5 SMALLINT, + x5 SMALLINT, + y5 SMALLINT, + h6 SMALLINT, + s6 SMALLINT, + v6 SMALLINT, + c6 SMALLINT, + x6 SMALLINT, + y6 SMALLINT, + h7 SMALLINT, + s7 SMALLINT, + v7 SMALLINT, + c7 SMALLINT, + x7 SMALLINT, + y7 SMALLINT, + default_flag INTEGER DEFAULT 0, + creator_name VARCHAR(24), + comment_text VARCHAR(128), + CONSTRAINT sys_pk_12047 PRIMARY KEY (skin_id), + CONSTRAINT pt_skin_part_type_pt_skin FOREIGN KEY (part_type_id) REFERENCES part_type (part_type_id), + CONSTRAINT pt_skin_skin_type_pt_skin FOREIGN KEY (skin_type_id) REFERENCES skin_type (skin_type_id) + ); + +CREATE INDEX sys_idx_pt_skin_part_type_pt_skin_12628 ON pt_skin (part_type_id); + +CREATE INDEX sys_idx_pt_skin_skin_type_pt_skin_12636 ON pt_skin (skin_type_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12047_12048 ON pt_skin (skin_id); \ No newline at end of file diff --git a/migrations/0014-createVehicle.sql b/migrations/0014-createVehicle.sql new file mode 100644 index 000000000..2af4ee5e7 --- /dev/null +++ b/migrations/0014-createVehicle.sql @@ -0,0 +1,19 @@ +CREATE TABLE + IF NOT EXISTS vehicle ( + vehicle_id INTEGER NOT NULL, + skin_id INTEGER NOT NULL, + flags INTEGER NOT NULL, + class SMALLINT NOT NULL, + info_setting SMALLINT NOT NULL, + damage_info bytea, + damage_cached INTEGER DEFAULT 0, + CONSTRAINT sys_pk_12214 PRIMARY KEY (vehicle_id), + CONSTRAINT vehicle_partvehicle FOREIGN KEY (vehicle_id) REFERENCES part (part_id) ON DELETE CASCADE, + CONSTRAINT vehicle_ptskinvehicle FOREIGN KEY (skin_id) REFERENCES pt_skin (skin_id) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12214_12215 ON vehicle (vehicle_id); + +CREATE INDEX sys_idx_vehicle_partvehicle_12844 ON vehicle (vehicle_id); + +CREATE INDEX sys_idx_vehicle_ptskinvehicle_12856 ON vehicle (skin_id); \ No newline at end of file diff --git a/migrations/0015-seedAttachmentPoint.sql b/migrations/0015-seedAttachmentPoint.sql new file mode 100644 index 000000000..ceddc94d9 --- /dev/null +++ b/migrations/0015-seedAttachmentPoint.sql @@ -0,0 +1,19 @@ +INSERT INTO + attachment_point (attachment_point_id, attachment_point) +VALUES + (0, '(default)'), + (1, 'Left Front'), + (2, 'Right Front'), + (3, 'Left Rear'), + (4, 'Right Rear'), + (5, 'Left'), + (6, 'Right'), + (7, 'A'), + (8, 'B'), + (9, 'C'); + +INSERT INTO + attachment_point (attachment_point_id, attachment_point) +VALUES + (10, 'Front'), + (11, 'Rear'); \ No newline at end of file diff --git a/migrations/0016-seedBrand.sql b/migrations/0016-seedBrand.sql new file mode 100644 index 000000000..e3ce44d41 --- /dev/null +++ b/migrations/0016-seedBrand.sql @@ -0,0 +1,134 @@ +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (0, 'EA', 'ea', 0), + (1, 'Ford', 'ford', 9), + (2, 'Mercury', 'merc', 9), + (3, 'Chevrolet', 'chev', 9), + (4, 'Cadillac', 'cadi', 9), + (5, 'Oldsmobile', 'olds', 9), + (6, 'Buick', 'buic', 9), + (7, 'Pontiac', 'pont', 9), + (8, 'Chrysler', 'chry', 9), + (9, 'Dodge', 'dodg', 9); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (10, 'Plymouth', 'plym', 9), + (11, 'AMC', 'amer', 9), + (12, 'AMC', NULL, 9), + (13, 'Edelbrock', 'edel', 0), + (14, 'Holley', 'holl', 0), + (15, 'GM', 'gm', 9), + (16, 'Rochester', 'roch', 0), + (17, 'Borg - Warner', 'borg', 0), + (18, 'Vich', 'vich', 0), + (19, 'Tibbits', 'tibb', 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (20, 'Lindstrom', 'lind', 0), + (21, 'Crane', 'cran', 0), + (22, 'Carter', 'cart', 0), + (23, 'Carter - Rochester', NULL, 0), + (25, 'Marinn', 'mari', 0), + (26, 'Mallory', 'mall', 0), + (27, 'Accel', 'acce', 0), + (28, 'Stromberg', 'stro', 0), + (29, 'AeroFit', 'aero', 0), + (30, 'Hooker', 'hook', 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (31, 'TFSpecial', 'tfs', 0), + (32, 'Apex', 'apex', 0), + (34, 'ProTread', 'prot', 0), + (35, 'PowerGrip', 'powe', 0), + (36, 'C & A', 'ca', 0), + (37, 'Manley', 'manl', 0), + (38, 'Offenhauser', 'offe', 0), + (39, 'Signature', 'sign', 0), + (40, 'TRW', 'trw', 0), + (41, 'JE Pistons', 'jepi', 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (42, 'Mr. Gasket', 'mrg', 0), + (43, 'Pro - Formance', NULL, 0), + (44, 'Blinsky', 'blin', 0), + (45, 'SMVintage', 'sm', 0), + (46, 'Bully', 'bull', 0), + (47, 'Hays', 'hays', 0), + (48, 'Lakewood', 'lake', 0), + (49, 'Ferrari', 'ferr', 0), + (50, 'Monarch', 'good', 0), + (53, 'Emberwood', NULL, 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (54, 'Full Gee', NULL, 0), + (56, 'BlackTop', NULL, 0), + (57, 'Monroe', NULL, 0), + (58, 'Lunati', NULL, 0), + (59, 'Coatili', NULL, 0), + (60, 'Acio', NULL, 0), + (61, 'Dana', NULL, 0), + (62, 'Potter', NULL, 0), + (63, 'Autolite', NULL, 0), + (64, 'Begren', NULL, 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (65, 'Kelsey - Hayes', NULL, 0), + (67, 'Hall', NULL, 0), + (68, 'US Radiator', NULL, 0), + (69, 'Gifford', NULL, 0), + (70, 'Shade Tree', NULL, 0), + (71, 'AC Delco', NULL, 0), + (72, 'Bendix', NULL, 0), + (73, 'Ansman', NULL, 0), + (74, 'Raven', NULL, 0), + (76, 'Panteli', NULL, 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (77, 'Reed', NULL, 0), + (78, 'Shelby', ' ', 0), + (79, 'Leland', NULL, 0), + (80, 'Dunbar', NULL, 0), + (81, 'Weiand', NULL, 0), + (82, 'Quaker', NULL, 0), + (83, 'Oldfield', NULL, 0), + (84, 'Milloy', NULL, 0), + (85, 'Quik Lift', NULL, 0), + (86, 'Duro Rod', NULL, 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (87, 'Newcomb', NULL, 0), + (88, 'Hedgely', NULL, 0), + (89, 'Fyne Grind', NULL, 0), + (90, 'Electronic Arts', ' ', 0), + (91, 'Rad Rat', NULL, 0), + (92, 'C & B', NULL, 0), + (93, 'Perfect Port', NULL, 0), + (94, 'Walter', NULL, 0), + (95, 'Percy', NULL, 0), + (96, 'Street Shark', NULL, 0); + +INSERT INTO + brand (brand_id, brand, pic_name, is_stock) +VALUES + (97, 'Pirelli', NULL, 0), + (98, 'Michelin', NULL, 0), + (99, 'Firestone', NULL, 0), + (100, 'Goodyear', NULL, 0), + (101, 'Yokohama', NULL, 0); \ No newline at end of file diff --git a/migrations/0017-seedModel.sql b/migrations/0017-seedModel.sql new file mode 100644 index 000000000..8deafac20 --- /dev/null +++ b/migrations/0017-seedModel.sql @@ -0,0 +1,96122 @@ +INSERT INTO + model ( + model_id, + brand_id, + e_model, + g_model, + f_model, + s_model, + i_model, + j_model, + sw_model, + b_model, + e_extra_info, + g_extra_info, + f_extra_info, + s_extra_info, + i_extra_info, + j_extra_info, + sw_extra_info, + b_extra_info, + e_short_model, + g_short_model, + f_short_model, + s_short_model, + i_short_model, + j_short_model, + sw_short_model, + b_short_model, + debug_string, + debug_sort_string + ) +VALUES + ( + 1, + 1, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 V-8 Coupe', + 'Vehicle' + ), + ( + 2, + 2, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mercury 49 Coupe', + 'Vehicle' + ), + ( + 3, + 3, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Bel-Air', + 'Vehicle' + ), + ( + 4, + 4, + 'Series 62', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Series 62', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 47 Series 62', + 'Vehicle' + ), + ( + 5, + 6, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick 55 Century', + 'Vehicle' + ), + ( + 6, + 7, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 66 GTO', + 'Vehicle' + ), + ( + 7, + 1, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 40 Coupe', + 'Vehicle' + ), + ( + 8, + 3, + 'Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Corvette', + 'Vehicle' + ), + ( + 9, + 4, + 'Eldorado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eldorado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 59 Eldorado', + 'Vehicle' + ), + ( + 10, + 5, + '4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 69 4-4-2', + 'Vehicle' + ), + ( + 12, + 7, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 69 GTO', + 'Vehicle' + ), + ( + 14, + 1, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 53 Crestline', + 'Vehicle' + ), + ( + 16, + 3, + 'Nomad', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nomad', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Nomad Wagon', + 'Vehicle' + ), + ( + 20, + 7, + 'Firebird T/A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 73 Firebird T/A', + 'Vehicle' + ), + ( + 21, + 1, + 'Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Fairlane 500', + 'Vehicle' + ), + ( + 25, + 1, + 'Ranchero', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ranchero', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Custom Ranchero', + 'Vehicle' + ), + ( + 26, + 3, + 'Stingray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stingray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 63 Stingray', + 'Vehicle' + ), + ( + 32, + 1, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 63 Thunderbird', + 'Vehicle' + ), + ( + 33, + 3, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Chevelle', + 'Vehicle' + ), + ( + 34, + 5, + '350-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB V8 350', + 'Engine Block' + ), + ( + 36, + 1, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Mustang Boss 302', + 'Vehicle' + ), + ( + 37, + 3, + 'Camaro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Camaro', + 'Vehicle' + ), + ( + 38, + 5, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB V8 400', + 'Engine Block' + ), + ( + 40, + 1, + 'Galaxie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Galaxie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 64 Galaxie 500', + 'Vehicle' + ), + ( + 41, + 3, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Chevelle', + 'Vehicle' + ), + ( + 42, + 5, + '455-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB V8 455', + 'Engine Block' + ), + ( + 45, + 3, + 'El Camino', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'El Camino', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 El Camino', + 'Vehicle' + ), + ( + 46, + 3, + 'Nova', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nova', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Nova', + 'Vehicle' + ), + ( + 47, + 1, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Thunderbird', + 'Vehicle' + ), + ( + 48, + 3, + 'Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 64 Impala', + 'Vehicle' + ), + ( + 49, + 3, + 'Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 58 Impala', + 'Vehicle' + ), + ( + 52, + 7, + '389-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 389', + 'Engine Block' + ), + ( + 54, + 7, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 400', + 'Engine Block' + ), + ( + 56, + 7, + '428-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 428', + 'Engine Block' + ), + ( + 58, + 7, + '455-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 455', + 'Engine Block' + ), + ( + 76, + 3, + '265-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Fire block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 265', + 'Engine Block' + ), + ( + 77, + 3, + '283-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 283', + 'Engine Block' + ), + ( + 78, + 3, + '302-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 302', + 'Engine Block' + ), + ( + 79, + 1, + 'Flathead 221-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '24-bolt', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '221', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 221-V8', + 'Engine Block' + ), + ( + 80, + 3, + '307-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '307', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 307', + 'Engine Block' + ), + ( + 81, + 1, + '260-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '260', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 260-V8', + 'Engine Block' + ), + ( + 82, + 1, + '272-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '272', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 272-V8', + 'Engine Block' + ), + ( + 83, + 3, + '327-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 327', + 'Engine Block' + ), + ( + 85, + 1, + '292-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '292', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 292-V8', + 'Engine Block' + ), + ( + 86, + 3, + '348-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '348', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W V8 348', + 'Engine Block' + ), + ( + 87, + 3, + '350-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350-V8', + 'Engine Block' + ), + ( + 88, + 1, + '351-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland V8-351', + 'Engine Block' + ), + ( + 89, + 1, + '390-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB V8 390', + 'Engine Block' + ), + ( + 90, + 4, + '390-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB V8 390', + 'Engine Block' + ), + ( + 91, + 1, + '406-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '406', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 406-V8', + 'Engine Block' + ), + ( + 92, + 3, + '396-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 396', + 'Engine Block' + ), + ( + 93, + 3, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB V8 400', + 'Engine Block' + ), + ( + 94, + 1, + '428-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '428', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 428-V8', + 'Engine Block' + ), + ( + 95, + 3, + '409-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '409', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W V8 409', + 'Engine Block' + ), + ( + 96, + 3, + '454-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 454', + 'Engine Block' + ), + ( + 97, + 1, + '352-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '352', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 352-V8', + 'Engine Block' + ), + ( + 98, + 3, + '502-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '502', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 502', + 'Engine Block' + ), + ( + 99, + 18, + 'Sipper', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sipper', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sipper Air Scoop 1%', + 'Air Scoop' + ), + ( + 100, + 18, + 'Slipstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Slipstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Slipstream Air Scoop 2%', + 'Air Scoop' + ), + ( + 101, + 18, + 'Impeller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Impeller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Impeller Air Scoop 3%', + 'Air Scoop' + ), + ( + 102, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 103, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 104, + 1, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss 302 Rod', + 'Connecting Rods' + ), + ( + 105, + 1, + 'HD Capscrew', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD Capscrew', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HD Capscrew Connecting Rod', + 'Connecting Rods' + ), + ( + 106, + 1, + 'HP 390', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP 390', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HP 390 Rod', + 'Connecting Rods' + ), + ( + 107, + 7, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air V Connecting Rod', + 'Connecting Rods' + ), + ( + 108, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock CI EM', + 'Exhaust Manifold' + ), + ( + 109, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 110, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 111, + 37, + '1.625" Treated Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 TI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Single Exhaust Pipe (Treated Iron)', + 'Exhaust Pipe' + ), + ( + 112, + 37, + '1.625" Treated Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 TI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Dual Exhaust Pipe (Treated Iron)', + 'Exhaust Pipe' + ), + ( + 113, + 37, + '1.625" Cast Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 CI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Single Exhaust Pipe (Cast Iron)', + 'Exhaust Pipe' + ), + ( + 114, + 37, + '1.625" Cast Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 CI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Dual Exhaust Pipe (Cast Iron)', + 'Exhaust Pipe' + ), + ( + 115, + 59, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midas Stock Muffler', + 'Muffler' + ), + ( + 116, + 59, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midas Aluminum Stock Muffler', + 'Muffler' + ), + ( + 117, + 30, + 'Dual Tail Pipe Tip 001', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Dual Tail Pipe Tip 001', + 'Tail Pipe Tip' + ), + ( + 118, + 60, + 'Dual Tail Pipe Tip 002', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Acio Dual Tail Pipe Tip 002', + 'Tail Pipe Tip' + ), + ( + 119, + 60, + 'Single Tail Pipe Tip 001', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Acio Single Tail Pipe Tip 001', + 'Tail Pipe Tip' + ), + ( + 120, + 60, + 'Single Tail Pipe Tip (Flaming)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Acio Single Tail Pipe Tip (Flaming)', + 'Tail Pipe Tip' + ), + ( + 121, + 1, + '3-Speed Auto A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3-Speed Auto (2.5/1.56/1)', + 'Transmission' + ), + ( + 122, + 1, + '3-Speed Auto (2.4/1.479/1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3-Speed Auto (2.4/1.479/1)', + 'Transmission' + ), + ( + 123, + 17, + '4-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner 4-Speed Auto (2.741/1.568/1/0.674)', + 'Transmission' + ), + ( + 124, + 1, + '3-Speed Auto B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3-Speed Auto (2.52/1.52/1) A', + 'Transmission' + ), + ( + 125, + 1, + '3-Speed Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3-Speed Auto (2.482/1.482/1)', + 'Transmission' + ), + ( + 126, + 3, + '4-Speed Auto High', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Auto High', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Auto (3.059/1.625/1/0.696) A', + 'Transmission' + ), + ( + 127, + 3, + '4-Speed Auto Wide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Auto Wide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Automatic (2.4/1.479/1/0.723)', + 'Transmission' + ), + ( + 128, + 3, + '4-Speed Auto Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Auto Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Auto (2.482/1.482/1/0.75)', + 'Transmission' + ), + ( + 129, + 1, + '4-Speed Auto (2.74/1.57/1/0.67)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4-Speed Auto (2.74/1.57/1/0.67)', + 'Transmission' + ), + ( + 130, + 1, + '4-Speed Auto (3.06/1.62/1/0.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4-Speed Auto (3.06/1.62/1/0.7)', + 'Transmission' + ), + ( + 131, + 1, + '4-Speed Auto (3.97/2.55/1.55/1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4-Speed Auto (3.97/2.55/1.55/1)', + 'Transmission' + ), + ( + 132, + 46, + '5-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '5-Speed Manual Wide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully 5-Speed Manual (2.95/1.94/1.34/1/0.63)', + 'Transmission' + ), + ( + 133, + 46, + '5-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '5-Speed Manual Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully 5-Speed Manual (2.75/1.94/1.34/1/0.74)', + 'Transmission' + ), + ( + 134, + 46, + '4-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully 4-Speed Manual (2.64/1.61/1.23/1)', + 'Transmission' + ), + ( + 135, + 3, + '4-Speed Manual Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Manual Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Manual (2.88/1.74/1.33/1)', + 'Transmission' + ), + ( + 136, + 3, + '4-Speed Manual High', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Manual High', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Manual (3.44/2.28/1.46/1)', + 'Transmission' + ), + ( + 137, + 3, + '4-Speed Manual Wide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Manual Wide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4-Speed Manual (2.66/1.91/1.39/1)', + 'Transmission' + ), + ( + 138, + 15, + '4-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4-Speed Manual (2.22/1.64/1.28/1) (g)', + 'Transmission' + ), + ( + 139, + 15, + '4-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4-Speed Manual (2.65/1.93/1.39/1)', + 'Transmission' + ), + ( + 140, + 61, + '2.73 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.73', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (2.73) Differential', + 'Rear End' + ), + ( + 141, + 61, + '2.93 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.93', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (2.93) Differential', + 'Rear End' + ), + ( + 142, + 61, + '3.00 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.00) Differential', + 'Rear End' + ), + ( + 143, + 61, + '3.23 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.23', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.23) Differential', + 'Rear End' + ), + ( + 144, + 61, + '3.31 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.31) Differential', + 'Rear End' + ), + ( + 145, + 61, + '3.42 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.42) Differential', + 'Rear End' + ), + ( + 146, + 61, + '3.50 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.50) Differential', + 'Rear End' + ), + ( + 147, + 61, + '3.54 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.54', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.54) Differential', + 'Rear End' + ), + ( + 148, + 61, + '3.55 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.55) Differential', + 'Rear End' + ), + ( + 149, + 61, + '3.64 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.64', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.64) Differential', + 'Rear End' + ), + ( + 150, + 61, + '3.70 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.70', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.70) Differential', + 'Rear End' + ), + ( + 151, + 61, + '3.77 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.77', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.77) Differential', + 'Rear End' + ), + ( + 152, + 61, + '3.9 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.9', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.9) Differential', + 'Rear End' + ), + ( + 153, + 61, + '4.10 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (4.10) Differential', + 'Rear End' + ), + ( + 154, + 61, + '4.33 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4.33', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (4.33) Differential', + 'Rear End' + ), + ( + 155, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock Intake Manifold', + 'Intake Manifold' + ), + ( + 156, + 63, + '4V (300 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (300 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4V (300 cfm) Carb', + 'Carburetor' + ), + ( + 157, + 63, + '6V Carburetor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '6V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 6V Carburetor', + 'Carburetor' + ), + ( + 158, + 71, + 'Stock Oil Bath', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Economy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Economy Light Duty Air Cleaner', + 'Air Cleaner' + ), + ( + 159, + 14, + 'Hi-Tek', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hi-Tek', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Hi-Tek Air Cleaner', + 'Air Cleaner' + ), + ( + 160, + 13, + 'Pro-Flo 1000', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Flo 1000', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Pro-Flo 1000 Air Cleaner', + 'Air Cleaner' + ), + ( + 161, + 20, + 'P05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'P05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lindstrom P05 Blower', + 'Blower' + ), + ( + 162, + 14, + 'Pro-Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Pro-Street Blower', + 'Blower' + ), + ( + 163, + 20, + 'Little Rabbit', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Little Rabbit', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lindstrom Little Rabbit NOS', + 'Nitrous Injector' + ), + ( + 164, + 20, + 'Cheetah', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cheetah', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lindstrom Cheetah NOS', + 'Nitrous Injector' + ), + ( + 165, + 3, + 'Big Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy BB Stock Lubrication System', + 'Lubrication System' + ), + ( + 166, + 1, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (9.0) Stock CH', + 'Cylinder Head' + ), + ( + 167, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Chrysler SB HP Camshaft', + 'Camshaft' + ), + ( + 168, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 169, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 172, + 11, + 'AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 69 AMX', + 'Vehicle' + ), + ( + 173, + 9, + 'Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dodge 69 Charger', + 'Vehicle' + ), + ( + 174, + 10, + 'Rd. Runner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Runner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 69 Road Runner', + 'Vehicle' + ), + ( + 175, + 10, + 'Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 70 Cuda', + 'Vehicle' + ), + ( + 176, + 10, + 'Duster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 71 Duster', + 'Vehicle' + ), + ( + 187, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock CI Connecting Rod', + 'Connecting Rods' + ), + ( + 188, + 63, + '2V (300 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2V (300 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 2V (300 cfm) Carb', + 'Carburetor' + ), + ( + 189, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 190, + 65, + 'Cast Iron Rim', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cast Iron', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Kelsey-Hayes Cast Iron Rim', + 'Wheel Rims' + ), + ( + 192, + 0, + 'Speedline Driver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speedline Driver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Speedline Driver', + 'Driver' + ), + ( + 193, + 68, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'US Radiator Stock Normal Duty Cooling System', + 'Cooling System' + ), + ( + 194, + 25, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Stock Normal Duty Electrical System', + 'Electrical System' + ), + ( + 195, + 67, + 'Fuzzy Dice', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall Fuzzy Dice Accessory', + 'Fuzzy Dice' + ), + ( + 196, + 15, + 'Rear View Mirror', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Rear View Mirror', + 'Rear View Mirror' + ), + ( + 197, + 1, + 'Rear View Mirror', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Rear View Mirror', + 'Rear View Mirror' + ), + ( + 198, + 1, + '53 C.line Fender Skirt', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 53 C.line Fender Skirt', + 'Wheels Skirts' + ), + ( + 199, + 1, + '1955 Ford Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1955 Fairlane', + 'Wheels Skirts' + ), + ( + 200, + 1, + '1956 Ford / Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1956 Thunderbird Wheel Skirts', + 'Wheels Skirts' + ), + ( + 201, + 1, + '1957 Ford / Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1957 Thunderbird Wheel Skirts', + 'Wheels Skirts' + ), + ( + 202, + 4, + 'Cadillac Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1947 Cadillac Wheel Skirts', + 'Wheels Skirts' + ), + ( + 203, + 4, + 'Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '47 Caddy Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 1949 Wheel Skirts', + 'Wheels Skirts' + ), + ( + 204, + 4, + 'Eldorado Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eldorado Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 1973 Fleetwood Eldorado Wheel Skirts', + 'Wheels Skirts' + ), + ( + 205, + 3, + 'Chevy Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1953 Bel Air', + 'Wheels Skirts' + ), + ( + 206, + 3, + 'Impala Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1967 Impala Wheel Skirts', + 'Wheels Skirts' + ), + ( + 207, + 3, + 'Chevelle Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1969 Chevelle', + 'Wheels Skirts' + ), + ( + 208, + 3, + 'Monte Carlo Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1970 Monte Carlo', + 'Wheels Skirts' + ), + ( + 209, + 1, + '18 x 5.25 BP Blackwalls', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 18 x 5.25 Bias Ply Blackwalls (2ply)', + 'Tires' + ), + ( + 220, + 1, + '40 Coupe Fender Skirt', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 40 Coupe Fender Skirt', + 'Wheels Skirts' + ), + ( + 221, + 1, + '1937 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1937 Wheel Skirts', + 'Wheels Skirts' + ), + ( + 222, + 3, + 'Chevy Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wheel Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1939 Chevrolet', + 'Wheels Skirts' + ), + ( + 223, + 10, + '1941 Plymouth', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1941 Plymouth', + 'Wheels Skirts' + ), + ( + 224, + 11, + 'Rear View Mirror', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Rear View Mirror', + 'Rear View Mirror' + ), + ( + 225, + 8, + 'Rear View Mirror', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Rear View Mirror', + 'Rear View Mirror' + ), + ( + 226, + 0, + 'Medium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'medium window tint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Medium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Medium Window Tinting', + 'Window Tinting' + ), + ( + 227, + 3, + '2-Speed Powerglide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2-Speed Powerglide', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 2-Speed Powerglide', + 'Transmission' + ), + ( + 228, + 1, + '1927 Ford Model T Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1927 Model T Boards', + 'Running Boards' + ), + ( + 229, + 1, + '1931 Ford Model A Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1931 Model A Boards', + 'Running Boards' + ), + ( + 230, + 3, + 'Confederate Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1932 Confederate Boards', + 'Running Boards' + ), + ( + 231, + 1, + '1934 Ford Coupe Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1934 Coupe Boards', + 'Running Boards' + ), + ( + 232, + 1, + '1937 Ford Coupe Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1937 Coupe Boards', + 'Running Boards' + ), + ( + 233, + 3, + '37 Coupe Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1937 Chevy Coupe Boards', + 'Running Boards' + ), + ( + 234, + 3, + '39 Coupe Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1939 Coupe Boards', + 'Running Boards' + ), + ( + 235, + 10, + '1941 Plymouth Coupe Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1941 Coupe Boards', + 'Running Boards' + ), + ( + 236, + 4, + 'Sedanette Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1947 Cadillac Sedanette Running Boards', + 'Running Boards' + ), + ( + 237, + 1, + '1948 Ford Woody Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1948 Woody Boards', + 'Running Boards' + ), + ( + 238, + 0, + 'Amber', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Amber', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Amber Fog Lights', + 'Amber Fog Lights' + ), + ( + 244, + 0, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'White Fog Lights', + 'White Fog Lights' + ), + ( + 246, + 2, + '49 Coupe Fender Skirt', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mercury 49 Coupe Fender Skirt', + 'Wheels Skirts' + ), + ( + 247, + 3, + '3-Speed Stnd Ratio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1957 3-Speed Standard Ratio (Saginaw)', + 'Transmission' + ), + ( + 248, + 3, + '3-Speed Close Ratio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed Close', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 3-Speed Close Ratio (Saginaw)', + 'Transmission' + ), + ( + 249, + 3, + '3-Speed w/ Overdrive', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3-Speed OD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1957 3-Speed w/ Overdrive (Saginaw)', + 'Transmission' + ), + ( + 250, + 17, + '4-Speed Close Ratio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Close Ratio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner 1957 4-Speed Close Ratio (Toledo)', + 'Transmission' + ), + ( + 251, + 1, + '1957 Ford Thunderbird Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1957 Thunderbird Scoop', + 'Hood' + ), + ( + 252, + 3, + 'Stingray Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hood (fake)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1963 Corvette Stingray Scoop (fake)', + 'Hood' + ), + ( + 253, + 1, + '1963 Ford Thunderbird Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1963 Thunderbird Scoop', + 'Hood' + ), + ( + 254, + 7, + 'GTO Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'fake', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1964 GTO Scoop (fake)', + 'Hood' + ), + ( + 255, + 7, + 'GTO Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1966 GTO Scoop', + 'Hood' + ), + ( + 256, + 3, + 'SS-396 Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hood (Fake)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1967 Camaro SS-396 Scoop (fake)', + 'Hood' + ), + ( + 257, + 3, + 'SS-396 Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'fake', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1967 Chevelle SS-396 Scoop (fake)', + 'Hood' + ), + ( + 258, + 10, + '1969 Plymouth Road Runner Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Grabber scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1969 Road Runner Scoop ("Air Grabber" scoop)', + 'Hood' + ), + ( + 259, + 7, + '1969 Pontiac Firebird Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1969 Firebird Scoop', + 'Hood' + ), + ( + 260, + 7, + '1969 Pontiac GTO Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air III Induction system', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1969 GTO Scoop', + 'Hood' + ), + ( + 261, + 6, + '1970 Buick Gran Sport Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'download', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick 1970 Gran Sport Scoop (download)', + 'Hood' + ), + ( + 262, + 5, + '4-4-2 W-30 Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 1969 4-4-2 W-30 Scoop', + 'Hood' + ), + ( + 263, + 5, + '4-4-2 Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 1969 Hurst/Olds 4-4-2 Scoop', + 'Hood' + ), + ( + 264, + 1, + '1969 Ford Torino Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1969 Torino Scoop', + 'Hood' + ), + ( + 265, + 1, + '1969 Ford Torino GT Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air Induction system', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1969 Torino GT Scoop', + 'Hood' + ), + ( + 266, + 3, + 'Nova SS-396 Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hood (Fake)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1970 Nova SS-396 Scoop (fake)', + 'Hood' + ), + ( + 267, + 10, + '1970 Plymouth ''Cuda Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shaker hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1970 ''Cuda Scoop ("Shaker" hood)', + 'Hood' + ), + ( + 268, + 10, + '1970 Plymouth ''Cuda Hemi Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shaker hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1970 ''Cuda Hemi Scoop ("Shaker" hood)', + 'Hood' + ), + ( + 269, + 9, + '1970 Dodge Challenger R/T Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dodge 1970 Challenger R/T Scoop', + 'Hood' + ), + ( + 270, + 7, + '1973 Pontiac Trans-Am Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1973 Trans-Am Scoop', + 'Hood' + ), + ( + 271, + 7, + 'Firebird Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'twin scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1973 Firebird Scoop (twin scoop)', + 'Hood' + ), + ( + 272, + 1, + '1940 Ford Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'A Ford Spotlight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1940 Spot Light', + 'Spot Light' + ), + ( + 273, + 4, + 'Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1947 Cadillac Spot Light', + 'Spot Light' + ), + ( + 274, + 6, + '1955 Buick Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'This is a spot light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick 1955 Spot Light', + 'Spot Light' + ), + ( + 275, + 3, + 'Bel-Air Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1957 Bel-Air Spot Light', + 'Spot Light' + ), + ( + 276, + 3, + 'Wagon Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1957 Wagon Spot Light', + 'Spot Light' + ), + ( + 407, + 47, + 'Wheelie Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fits all cars', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hays Wheelie Bar Attachment', + 'Wheelie Bar' + ), + ( + 408, + 3, + 'Impala Sport Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hood (fake)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1958 Impala Sport Scoop (fake)', + 'Hood' + ), + ( + 409, + 14, + 'Street PowerCharger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street PowerCharger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Street PowerCharger Blower', + 'Blower' + ), + ( + 410, + 1, + 'Boss Ignition', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Boss XHD Electronic Ignition', + 'Electrical System' + ), + ( + 411, + 26, + 'Economy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Economy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mallory Economy Light Duty Electrical System', + 'Electrical System' + ), + ( + 412, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 HD Electrical System', + 'Electrical System' + ), + ( + 413, + 68, + 'Economy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Economy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'US Radiator Light Duty Cooling System', + 'Cooling System' + ), + ( + 414, + 68, + 'Cool-Flo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cool-Flo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'US Radiator Cool-Flo Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 415, + 68, + 'Maxi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Maxi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'US Radiator Maxi Extra Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 416, + 1, + 'Big Block Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss XHD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Boss XHD Cooling System', + 'Cooling System' + ), + ( + 417, + 7, + 'Stock CI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock CI Connecting Rod', + 'Connecting Rods' + ), + ( + 418, + 14, + '4150 4V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4150 4V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4150 4V (780 cfm)', + 'Carburetor' + ), + ( + 420, + 3, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Cast Iron Single Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 421, + 11, + 'AMC V8 290 Alum. Indy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'light weight aluminum block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 290 Indy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC V8 290 Aluminum Indy', + 'Engine Block' + ), + ( + 422, + 3, + 'Muncie Early (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Early Wide-Ratio (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Muncie Early Wide-Ratio (Manual) (1963-1965)', + 'Transmission' + ), + ( + 423, + 3, + 'Muncie (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Close-Ratio (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Muncie Close-Ratio (Manual) (1966-1974)', + 'Transmission' + ), + ( + 424, + 15, + 'Muncie Wide-Ratio M20', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'M20', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Muncie M20 Wide-Ratio Manual (2.52/1.88/1.46/1)', + 'Transmission' + ), + ( + 425, + 3, + 'Corvette 4-Speed Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-Speed Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1997 Corvette 4-Speed Automatic Transmission', + 'Transmission' + ), + ( + 426, + 0, + 'Speedliner 5-Speed Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'EA Speedliner 5-Speed Automatic Transmission (Modified Diablo Manual)', + 'Transmission' + ), + ( + 427, + 3, + 'Powerglide Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Powerglide (1963-73) Automatic(Heavy) (Aluminum, Two-speed)', + 'Transmission' + ), + ( + 428, + 3, + 'Turbo Hydra-Matic 350', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Turbo Hydra-Matic 350 (Automatic) (Equipped with 1969-1984 GM Cars)', + 'Transmission' + ), + ( + 429, + 17, + 'T-10X Comp. (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-10X', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner T-10X Special Competition (Manual)', + 'Transmission' + ), + ( + 430, + 17, + 'T-10W Spec. (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-10W', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner T-10W Special Wide-Ratio (Manual)', + 'Transmission' + ), + ( + 431, + 17, + 'T-10Y (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-10Y', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner T-10Y Second Design, Extra Low-Ratio (Manual)', + 'Transmission' + ), + ( + 432, + 1, + 'T+C Overdrive (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford T+C Top Loader Overdrive (Manual) (1977-78)', + 'Transmission' + ), + ( + 433, + 1, + 'T+C Overdrive2 (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford T+C Top Loader Overdrive2 (Manual) (1979-86)', + 'Transmission' + ), + ( + 434, + 16, + '2GV 2V (200 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2GV 2V (200 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester 2GV 2V (200 cfm) Carb', + 'Carburetor' + ), + ( + 435, + 1, + '4-speed All-Synchro (Manual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-speed All-Synchro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4-speed All-Synchro (Manual)', + 'Transmission' + ), + ( + 436, + 3, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB HP Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 437, + 3, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Z11 HP Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 438, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 440, + 61, + '3.10 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.10) Differential', + 'Rear End' + ), + ( + 441, + 15, + '3.40 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM (3.40) Differential', + 'Rear End' + ), + ( + 442, + 1, + '460-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '460', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 460-V8', + 'Engine Block' + ), + ( + 443, + 1, + '40 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'good, solid, durable Ford bumpers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '40 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 40 Ford Bumpers', + 'Bumpers' + ), + ( + 444, + 3, + '427-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mark IV Big Block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 427', + 'Engine Block' + ), + ( + 445, + 15, + 'Dual Resonator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dual Resonator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Dual Resonator Muffler', + 'Muffler' + ), + ( + 446, + 9, + '1969 Dodge Charger RT Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dodge 1969 Charger RT Tip', + 'Tail Pipe Tip' + ), + ( + 447, + 5, + 'Trumpet Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 1969 4-4-2 Trumpet Tip', + 'Tail Pipe Tip' + ), + ( + 448, + 1, + '1970 Ford Mustang Oval Trumpet Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 1970 Mustang Oval Trumpet Tip', + 'Tail Pipe Tip' + ), + ( + 449, + 10, + '1970 Plymouth ''Cuda Chrome Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 1970 ''Cuda Chrome Tip', + 'Tail Pipe Tip' + ), + ( + 450, + 7, + 'Firebird Chrome Extension', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 1973 Firebird Chrome Extension', + 'Tail Pipe Tip' + ), + ( + 451, + 15, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Z11 Lubrication System', + 'Lubrication System' + ), + ( + 452, + 28, + '97 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '97 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stromberg 97 2V Carburetor', + 'Carburetor' + ), + ( + 453, + 27, + 'Billetproof Breakerless', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billetproof', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Accel Billetproof HD Breakerless', + 'Electrical System' + ), + ( + 454, + 27, + 'Blueprint Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Blueprint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Accel Blueprint HD Electronic', + 'Electrical System' + ), + ( + 455, + 14, + '2300 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2300 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 2300 2V Carburetor', + 'Carburetor' + ), + ( + 456, + 45, + 'Aluminum Alloy Rim', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SMVintage Aluminum Alloy Rim', + 'Wheel Rims' + ), + ( + 457, + 45, + 'Magnesium Rim', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Magnesium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SMVintage Magnesium Rim', + 'Wheel Rims' + ), + ( + 458, + 16, + '4G 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4G 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester 4G 4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 459, + 16, + 'Monojet 2V (350 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monojet 2V (350 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Monojet 2V (350 cfm) Carb', + 'Carburetor' + ), + ( + 460, + 14, + 'PowerCharger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerCharger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley PowerCharger (20%) Blower', + 'Blower' + ), + ( + 461, + 13, + 'RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock RPM Muffler', + 'Muffler' + ), + ( + 462, + 13, + 'Victor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Victor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Victor Muffler', + 'Muffler' + ), + ( + 463, + 13, + '304', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '304', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock 304 Muffler', + 'Muffler' + ), + ( + 464, + 30, + 'Maximum Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Maximum Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Maximum Flow', + 'Muffler' + ), + ( + 465, + 30, + 'Super Competition', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Competition', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Super Competition', + 'Muffler' + ), + ( + 466, + 30, + 'Elite Glasspack', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Elite Glasspack', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Elite Glasspack', + 'Muffler' + ), + ( + 467, + 1, + 'Big Block Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Boss XHD Lubrication System', + 'Lubrication System' + ), + ( + 468, + 46, + 'XHD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully XHD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully XHD Lubrication System', + 'Lubrication System' + ), + ( + 469, + 1, + 'Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cobra Lubrication System', + 'Lubrication System' + ), + ( + 470, + 25, + 'Marinn Large Bore Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Large Bore Tip', + 'Tail Pipe Tip' + ), + ( + 471, + 25, + 'Marinn Large Bore (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Large Bore (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 472, + 25, + 'Large Bore Tip w/resonator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Large Bore Tip w/resonator', + 'Tail Pipe Tip' + ), + ( + 473, + 25, + 'Large Bore Tip w/resonator (Dual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Large Bore Tip w/resonator (Dual)', + 'Tail Pipe Tip' + ), + ( + 474, + 25, + 'MegaCone Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn MegaCone Tip', + 'Tail Pipe Tip' + ), + ( + 475, + 25, + 'MegaCone (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn MegaCone (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 476, + 25, + 'Slanted Cut Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Slanted Cut Tip', + 'Tail Pipe Tip' + ), + ( + 477, + 25, + 'Slanted Cut (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Slanted Cut (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 478, + 25, + 'Slanted Cut Tip w/resonator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Slanted Cut Tip w/resonator', + 'Tail Pipe Tip' + ), + ( + 479, + 25, + 'Slanted Cut Tip w/resonator (Dual)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marinn Slanted Cut Tip w/resonator (Dual)', + 'Tail Pipe Tip' + ), + ( + 480, + 13, + 'Angle Cut Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Angle Cut Tip', + 'Tail Pipe Tip' + ), + ( + 481, + 13, + 'Angle Cut (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Angle Cut (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 482, + 13, + 'Flat Oval Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Flat Oval Tip', + 'Tail Pipe Tip' + ), + ( + 483, + 13, + 'Flat Oval (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Flat Oval (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 484, + 13, + 'Round Double Wall Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Round Double Wall Tip', + 'Tail Pipe Tip' + ), + ( + 485, + 13, + 'Edelbrock Round Double Wall (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Round Double Wall (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 486, + 13, + 'Edelbrock Round Turn-Down Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Round Turn-Down Tip', + 'Tail Pipe Tip' + ), + ( + 487, + 13, + 'Edelbrock Round Turn-Down (Dual) Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Round Turn-Down (Dual) Tip', + 'Tail Pipe Tip' + ), + ( + 488, + 30, + 'Str. Rodder Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Rodder', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Rodder Chevrolet SB Headers', + 'Exhaust Manifold' + ), + ( + 489, + 30, + 'Max Perf. Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Maximum Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Maximum Performance (Dual) Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 490, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Flat Top Cast Aluminum Piston', + 'Pistons' + ), + ( + 491, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Flat Top Cast Aluminum Piston', + 'Pistons' + ), + ( + 492, + 14, + 'Dominator 2300 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2300 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2300 2V Carb', + 'Carburetor' + ), + ( + 493, + 14, + '4150 4V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4150 4V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4150 4V (650 cfm) Carb', + 'Carburetor' + ), + ( + 494, + 13, + 'Performer 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer 4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 495, + 44, + 'Hi-Pro V8 5.0L', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'experimental aluminum engine block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '5.0L', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Blinsky Hi-Pro V8 5.0L', + 'Engine Block' + ), + ( + 497, + 14, + 'MegaBlower', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'MegaBlower', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley MegaBlower (25%)', + 'Blower' + ), + ( + 498, + 2, + 'Flathead 255', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '255', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mercury Flathead 255', + 'Engine Block' + ), + ( + 499, + 46, + '727 Torqueflite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '727 Torqueflite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully 727 Torqueflite (Chrysler 383, 440)', + 'Transmission' + ), + ( + 500, + 46, + 'Turbo-Hydro 400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Hydro 400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully Turbo-Hydro 400 Automatic (2.48/1.48/1)', + 'Transmission' + ), + ( + 501, + 46, + 'Torqueflite HD Cooler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torqueflite HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully Torqueflite HD Transmission Cooler', + 'Transmission Cooler' + ), + ( + 502, + 46, + 'Turbo ND Cooler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo ND', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully Turbo ND Transmission Cooler', + 'Transmission Cooler' + ), + ( + 503, + 46, + 'Powerglide LD Cooler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide LD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully Powerglide LD Transmission Cooler', + 'Transmission Cooler' + ), + ( + 504, + 46, + 'C-6 XHD Cooler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C-6 XHD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully C-6 XHD Transmission Cooler', + 'Transmission Cooler' + ), + ( + 505, + 14, + 'Powershot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powershot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley NOS Powershot', + 'Nitrous Injector' + ), + ( + 506, + 14, + 'Super Powershot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Powershot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Super Powershot', + 'Nitrous Injector' + ), + ( + 507, + 14, + 'Cheater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cheater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Cheater', + 'Nitrous Injector' + ), + ( + 508, + 14, + 'Sneeky Pete', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sneeky Pete', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Sneeky Pete NOS', + 'Nitrous Injector' + ), + ( + 509, + 1, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 65 Mustang', + 'Vehicle' + ), + ( + 513, + 1, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 V-8 Coupe - Modified', + 'Vehicle' + ), + ( + 517, + 16, + 'Ramjet Fuel Injector', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ramjet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Ramjet Fuel Injector', + 'Carburetor' + ), + ( + 518, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Flat Top Cast Aluminum Piston', + 'Pistons' + ), + ( + 525, + 20, + 'Cop Lights', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'the familiar blue and red flashing lights', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cop Lights', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lindstrom Cop Lights', + 'Cop Lights' + ), + ( + 526, + 0, + 'Traffic 2 door', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TRAFFIC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic 2 door', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Traffic 2 door', + 'Vehicle' + ), + ( + 527, + 0, + 'Vanilla Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Vanilla Hood', + 'Hood' + ), + ( + 536, + 4, + 'Cadillac Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '47 Caddy Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 47 Hood', + 'Hood' + ), + ( + 537, + 6, + '55 Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick 55 Century Hood', + 'Hood' + ), + ( + 538, + 3, + '57 Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Bel-Air Hood w/ Scoop', + 'Hood' + ), + ( + 539, + 3, + '57 Nomad', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Nomad Hood', + 'Hood' + ), + ( + 540, + 3, + '57 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Corvette Hood', + 'Hood' + ), + ( + 541, + 3, + '58 Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 58 Impala Hood', + 'Hood' + ), + ( + 542, + 4, + 'Eldorado Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eldorado Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac 59 Eldorado Hood', + 'Hood' + ), + ( + 543, + 3, + '63 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 63 Corvette Hood', + 'Hood' + ), + ( + 544, + 3, + '64 Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 64 Impala Hood', + 'Hood' + ), + ( + 545, + 7, + '66 GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 66 GTO Hood', + 'Hood' + ), + ( + 546, + 3, + '67 Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Chevelle Hood', + 'Hood' + ), + ( + 547, + 3, + '67 Camaro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Camaro Hood', + 'Hood' + ), + ( + 548, + 5, + '69 Oldsmobile 442', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 69 442 Hood', + 'Hood' + ), + ( + 549, + 7, + '69 GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 69 GTO Hood', + 'Hood' + ), + ( + 550, + 3, + '70 El Camino', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 El Camino Hood', + 'Hood' + ), + ( + 551, + 3, + '70 Nova', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Nova Hood', + 'Hood' + ), + ( + 552, + 3, + '70 Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Chevelle Hood', + 'Hood' + ), + ( + 553, + 7, + '73 Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 73 Firebird Hood', + 'Hood' + ), + ( + 554, + 9, + '69 Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dodge 69 Charger Hood', + 'Hood' + ), + ( + 555, + 10, + '69 Road Runner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 69 Road Runner Hood', + 'Hood' + ), + ( + 556, + 11, + '69 AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 69 AMX Hood', + 'Hood' + ), + ( + 557, + 10, + '70 Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 70 Cuda Hood', + 'Hood' + ), + ( + 558, + 10, + '71 Duster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 71 Duster Hood', + 'Hood' + ), + ( + 559, + 69, + '70 lb/in traverse', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 70 lb/in traverse spring', + 'Springs' + ), + ( + 560, + 69, + '80 lb/in traverse', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 80 lb/in traverse spring', + 'Springs' + ), + ( + 561, + 69, + '90 lb/in traverse', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 90 lb/in traverse spring', + 'Springs' + ), + ( + 562, + 69, + '100 lb/in Traverse', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 100 lb/in Traverse Springs', + 'Springs' + ), + ( + 563, + 69, + '110 lb/in traverse', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 110 lb/in traverse spring', + 'Springs' + ), + ( + 564, + 69, + '120 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 120 lb/in Coil Springs', + 'Springs' + ), + ( + 565, + 69, + '130 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 130 lb/in coil spring', + 'Springs' + ), + ( + 566, + 69, + '140 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 140 lb/in coil spring', + 'Springs' + ), + ( + 567, + 69, + '150 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 150 lb/in Coil Springs', + 'Springs' + ), + ( + 568, + 69, + '160 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 160 lb/in coil spring', + 'Springs' + ), + ( + 569, + 69, + '170 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 170 lb/in coil spring', + 'Springs' + ), + ( + 570, + 69, + '180 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 180 lb/in leaf spring', + 'Springs' + ), + ( + 571, + 69, + '190 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 190 lb/in leaf spring', + 'Springs' + ), + ( + 572, + 69, + '200 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 200 lb/in leaf spring', + 'Springs' + ), + ( + 573, + 69, + '210 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 210 lb/in coil-over spring', + 'Springs' + ), + ( + 574, + 69, + '220 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 220 lb/in coil-over spring', + 'Springs' + ), + ( + 575, + 69, + '230 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 230 lb/in coil-over spring', + 'Springs' + ), + ( + 576, + 69, + '240 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 240 lb/in coil-over spring', + 'Springs' + ), + ( + 577, + 69, + '250 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 250 lb/in coil-over spring', + 'Springs' + ), + ( + 578, + 62, + '50 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '50 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 50 Nm Sway Bar', + 'Sway Bar' + ), + ( + 579, + 62, + '60 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '60 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 60 Nm Sway Bar', + 'Sway Bar' + ), + ( + 580, + 62, + '70 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '70 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 70 Nm Sway Bar', + 'Sway Bar' + ), + ( + 581, + 62, + '80 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '80 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 80 Nm Sway Bar', + 'Sway Bar' + ), + ( + 582, + 62, + '90 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '90 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 90 Nm Sway Bar', + 'Sway Bar' + ), + ( + 583, + 62, + '100 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '100 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 100 Nm Sway Bar', + 'Sway Bar' + ), + ( + 584, + 62, + '110 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '110 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 110 Nm Sway Bar', + 'Sway Bar' + ), + ( + 585, + 62, + '120 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '120 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 120 Nm Sway Bar', + 'Sway Bar' + ), + ( + 586, + 62, + '130 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '130 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 130 Nm Sway Bar', + 'Sway Bar' + ), + ( + 587, + 62, + '140 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '140 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 140 Nm Sway Bar', + 'Sway Bar' + ), + ( + 588, + 62, + '150 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '150 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 150 Nm Sway Bar', + 'Sway Bar' + ), + ( + 589, + 62, + '160 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '160 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 160 Nm Sway Bar', + 'Sway Bar' + ), + ( + 590, + 62, + '170 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '170 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 170 Nm Sway Bar', + 'Sway Bar' + ), + ( + 591, + 62, + '180 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '180 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 180 Nm Sway Bar', + 'Sway Bar' + ), + ( + 592, + 62, + '190 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '190 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 190 Nm Sway Bar', + 'Sway Bar' + ), + ( + 593, + 62, + '200 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '200 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 200 Nm Sway Bar', + 'Sway Bar' + ), + ( + 594, + 62, + '210 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '210 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 210 Nm Sway Bar', + 'Sway Bar' + ), + ( + 595, + 62, + '220 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '220 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 220 Nm Sway Bar', + 'Sway Bar' + ), + ( + 596, + 62, + '230 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '230 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 230 Nm Sway Bar', + 'Sway Bar' + ), + ( + 597, + 62, + '240 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '240 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 240 Nm Sway Bar', + 'Sway Bar' + ), + ( + 598, + 62, + '250 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '250 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 250 Nm Sway Bar', + 'Sway Bar' + ), + ( + 599, + 62, + '260 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '260 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 260 Nm Sway Bar', + 'Sway Bar' + ), + ( + 600, + 62, + '270 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '270 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 270 Nm Sway Bar', + 'Sway Bar' + ), + ( + 601, + 62, + '280 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '280 Nm', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Potter 280 Nm Sway Bar', + 'Sway Bar' + ), + ( + 602, + 69, + 'LD Traction Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford LD Traction Bar', + 'Traction Bar' + ), + ( + 603, + 69, + 'ND Traction Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ND', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford ND Traction Bar', + 'Traction Bar' + ), + ( + 604, + 69, + 'HD Traction Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford HD Traction Bar', + 'Traction Bar' + ), + ( + 605, + 69, + 'XHD Traction Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'XHD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford XHD Traction Bar', + 'Traction Bar' + ), + ( + 606, + 43, + 'LD (0.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LD (0.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance LD (0.2) Shock', + 'Shocks' + ), + ( + 607, + 43, + 'LD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance LD (0.3) Shock', + 'Shocks' + ), + ( + 608, + 43, + 'ND (0.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ND (0.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance ND (0.2) Shock', + 'Shocks' + ), + ( + 609, + 43, + 'ND (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ND (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance ND (0.3) Shock', + 'Shocks' + ), + ( + 610, + 43, + 'HD (0.24)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD (0.24)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance HD (0.24) Shock', + 'Shocks' + ), + ( + 611, + 43, + 'HD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance HD (0.3) Shock', + 'Shocks' + ), + ( + 612, + 43, + 'XHD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'XHD (0.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance XHD (0.3) Shock', + 'Shocks' + ), + ( + 613, + 43, + 'XHD (0.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'XHD (0.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance XHD (0.36) Shock', + 'Shocks' + ), + ( + 614, + 43, + 'XHD (0.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'XHD (0.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance XHD (0.4) Shock', + 'Shocks' + ), + ( + 615, + 71, + '10 x 2 Organic Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Organic Drum Brakes', + 'Brakes' + ), + ( + 616, + 71, + '11 x 2 Organic Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Organic Drum Brake', + 'Brakes' + ), + ( + 617, + 72, + '12 x 2 Organic Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Organic Drum Brake', + 'Brakes' + ), + ( + 618, + 71, + '10 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Organic HT Drum Brakes', + 'Brakes' + ), + ( + 619, + 71, + '11 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Organic HT Drum Brake', + 'Brakes' + ), + ( + 620, + 71, + '10 x 2 SM Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Semi-Metallic Drum Brakes', + 'Brakes' + ), + ( + 621, + 71, + '11 x 2 SM Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Semi-Metallic Drum Brake', + 'Brakes' + ), + ( + 622, + 71, + '10 x 2 Org Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Organic Disk Brakes', + 'Brakes' + ), + ( + 623, + 71, + '11 x 2 Org Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Organic Disk Brake', + 'Brakes' + ), + ( + 624, + 72, + '12 x 2 Organic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Organic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Organic Disk Brake', + 'Brakes' + ), + ( + 625, + 71, + '10 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Organic HT Disk Brakes', + 'Brakes' + ), + ( + 626, + 71, + '11 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Organic HT Disk Brake', + 'Brakes' + ), + ( + 627, + 72, + '12 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Organic HT Disk Brake', + 'Brakes' + ), + ( + 628, + 71, + '10 x 2 SM Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Semi-Metallic Disk Brakes', + 'Brakes' + ), + ( + 629, + 71, + '11 x 2 SM Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Semi-Metallic Disk Brake', + 'Brakes' + ), + ( + 630, + 72, + '12 x 2 SM Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Semi-Metallic Disk Brake', + 'Brakes' + ), + ( + 631, + 71, + '9 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Metallic Disk Brakes', + 'Brakes' + ), + ( + 632, + 71, + '10 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 10 x 2 Metallic Disk Brakes', + 'Brakes' + ), + ( + 633, + 71, + '11 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 11 x 2 Metallic Disk Brake', + 'Brakes' + ), + ( + 634, + 72, + '12 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Metallic Disk Brake', + 'Brakes' + ), + ( + 635, + 73, + '14 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Metallic Disk Brake', + 'Brakes' + ), + ( + 636, + 73, + '16 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '16 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 16 x 2 Metallic Disk Brake', + 'Brakes' + ), + ( + 637, + 18, + 'Aera 25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Aera 25 kg Spoiler', + 'Chin Spoiler' + ), + ( + 638, + 18, + 'Aera 50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Aera 50 kg Spoiler', + 'Chin Spoiler' + ), + ( + 639, + 18, + 'Aera 75', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 75', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Aera 75 kg Spoiler', + 'Chin Spoiler' + ), + ( + 640, + 18, + 'Aera 100', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 100', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Aera 100 kg Spoiler', + 'Chin Spoiler' + ), + ( + 641, + 18, + 'Boundary 125', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 125', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 125 kg Spoiler', + 'Chin Spoiler' + ), + ( + 642, + 18, + 'Boundary 150', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 150', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 150 kg Spoiler', + 'Chin Spoiler' + ), + ( + 643, + 18, + 'Boundary 175', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 175', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 175 kg Spoiler', + 'Chin Spoiler' + ), + ( + 644, + 18, + 'Boundary 200', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 200', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 200 kg Spoiler', + 'Chin Spoiler' + ), + ( + 645, + 18, + 'Boundary 225', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 225', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 225 kg Spoiler', + 'Chin Spoiler' + ), + ( + 646, + 18, + 'Boundary 250', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 250', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich Boundary 250 kg Spoiler', + 'Chin Spoiler' + ), + ( + 647, + 18, + 'Aera 25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 25 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 648, + 18, + 'Aera 50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 50 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 649, + 18, + 'Aera 75', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 75', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 75 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 650, + 18, + 'Aera 100', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aera 100', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 100 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 651, + 18, + 'Boundary 125', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'provides significant aerodynamic downforce for improved high-speed traction and handling', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 125', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 125 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 652, + 18, + 'Boundary 150', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 150', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 150 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 653, + 18, + 'Boundary 175', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'provides significant aerodynamic downforce for improved high-speed traction and handling', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 175', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 175 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 654, + 18, + 'Boundary 200', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 200', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 200 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 655, + 18, + 'Boundary 225', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'provides significant aerodynamic downforce for improved high-speed traction and handling', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 225', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 225 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 656, + 18, + 'Boundary 250', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boundary 250', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vich 250 kg Rear Spoiler', + 'Rear Spoiler' + ), + ( + 657, + 0, + 'Cuda A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Cuda A', + 'Horn' + ), + ( + 658, + 0, + 'Cuda B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Cuda B', + 'Horn' + ), + ( + 659, + 0, + 'Cuda 2Stone', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Cuda 2Stone', + 'Horn' + ), + ( + 660, + 0, + 'El Camino A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts El Camino A', + 'Horn' + ), + ( + 661, + 0, + 'El Camino B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts El Camino B', + 'Horn' + ), + ( + 662, + 7, + 'Firebird A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Firebird A', + 'Horn' + ), + ( + 663, + 7, + 'Firebird B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Firebird B', + 'Horn' + ), + ( + 664, + 10, + 'Fury', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth Fury', + 'Horn' + ), + ( + 665, + 15, + 'GMC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors GMC', + 'Horn' + ), + ( + 666, + 0, + 'Hillman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Hillman', + 'Horn' + ), + ( + 667, + 3, + 'Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Impala', + 'Horn' + ), + ( + 668, + 0, + 'Metropolitan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Metropolitan', + 'Horn' + ), + ( + 669, + 0, + 'Metropolitan Siren', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Metropolitan Siren', + 'Horn' + ), + ( + 670, + 1, + '64 Ford Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 64 Mustang', + 'Horn' + ), + ( + 671, + 0, + 'Snubnose', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts Snubnose', + 'Horn' + ), + ( + 672, + 1, + 'Aoooga A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Aoooga A', + 'Horn' + ), + ( + 673, + 3, + 'Aoooga B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Aoooga B', + 'Horn' + ), + ( + 674, + 15, + 'Aoooga C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Aoooga C', + 'Horn' + ), + ( + 680, + 50, + '150/82/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 150/82/14 Bias Ply', + 'Tires' + ), + ( + 681, + 50, + '170/82/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 170/82/14 Bias Ply', + 'Tires' + ), + ( + 682, + 50, + '178/82/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 178/82/14 Bias Ply', + 'Tires' + ), + ( + 683, + 50, + '190/82/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 190/82/14 Bias Ply', + 'Tires' + ), + ( + 684, + 50, + '210/82/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 210/82/14 Bias Ply', + 'Tires' + ), + ( + 685, + 50, + '150/92/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 150/92/14 Bias Ply', + 'Tires' + ), + ( + 686, + 50, + '170/92/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 170/92/14 Bias Ply', + 'Tires' + ), + ( + 687, + 50, + '178/92/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 178/92/14 Bias Ply', + 'Tires' + ), + ( + 688, + 50, + '190/92/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 190/92/14 Bias Ply', + 'Tires' + ), + ( + 689, + 50, + '210/92/14 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 210/92/14 Bias Ply', + 'Tires' + ), + ( + 690, + 50, + '170/82/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 170/82/15 Bias Ply', + 'Tires' + ), + ( + 691, + 50, + '190/82/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 190/82/15 Bias Ply', + 'Tires' + ), + ( + 692, + 50, + '210/82/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 210/82/15 Bias Ply', + 'Tires' + ), + ( + 693, + 50, + '150/92/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 150/92/15 Bias Ply', + 'Tires' + ), + ( + 694, + 50, + '170/92/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 170/92/15 Bias Ply', + 'Tires' + ), + ( + 695, + 50, + '190/92/15 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 190/92/15 Bias Ply', + 'Tires' + ), + ( + 696, + 50, + '150/92/16 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 150/92/16 Bias Ply', + 'Tires' + ), + ( + 697, + 50, + '170/92/16 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 170/92/16 Bias Ply', + 'Tires' + ), + ( + 698, + 50, + '190/92/16 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 190/92/16 Bias Ply', + 'Tires' + ), + ( + 699, + 50, + '210/92/16 Bias Ply', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch 210/92/16 Bias Ply', + 'Tires' + ), + ( + 700, + 99, + '190/60/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 190/60/14 Bias Belted', + 'Tires' + ), + ( + 701, + 99, + '214/60/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 214/60/14 Bias Belted', + 'Tires' + ), + ( + 702, + 99, + '238/60/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/60/14 Bias Belted', + 'Tires' + ), + ( + 703, + 99, + '190/72/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 190/72/14 Bias Belted', + 'Tires' + ), + ( + 704, + 99, + '202/72/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/72/14 Bias Belted', + 'Tires' + ), + ( + 705, + 99, + '214/72/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 214/72/14 Bias Belted', + 'Tires' + ), + ( + 706, + 99, + '226/72/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 226/72/14 Bias Belted', + 'Tires' + ), + ( + 707, + 99, + '238/72/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/72/14 Bias Belted', + 'Tires' + ), + ( + 708, + 99, + '166/82/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 166/82/14 Bias Belted', + 'Tires' + ), + ( + 709, + 99, + '178/82/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 178/82/14 Bias Belted', + 'Tires' + ), + ( + 710, + 99, + '190/82/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 190/82/14 Bias Belted', + 'Tires' + ), + ( + 711, + 99, + '202/82/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/82/14 Bias Belted', + 'Tires' + ), + ( + 712, + 99, + '214/82/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 214/82/14 Bias Belted', + 'Tires' + ), + ( + 713, + 99, + '178/92/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 178/92/14 Bias Belted', + 'Tires' + ), + ( + 714, + 99, + '202/92/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/92/14 Bias Belted', + 'Tires' + ), + ( + 715, + 99, + '178/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 178/60/15 Bias Belted', + 'Tires' + ), + ( + 716, + 99, + '202/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/60/15 Bias Belted', + 'Tires' + ), + ( + 717, + 99, + '226/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 226/60/15 Bias Belted', + 'Tires' + ), + ( + 718, + 99, + '238/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/60/15 Bias Belted', + 'Tires' + ), + ( + 719, + 99, + '202/72/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/72/15 Bias Belted', + 'Tires' + ), + ( + 720, + 99, + '226/72/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 226/72/15 Bias Belted', + 'Tires' + ), + ( + 721, + 99, + '238/72/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/72/15 Bias Belted', + 'Tires' + ), + ( + 722, + 99, + '190/82/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 190/82/15 Bias Belted', + 'Tires' + ), + ( + 723, + 99, + '214/82/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 214/82/15 Bias Belted', + 'Tires' + ), + ( + 724, + 99, + '238/82/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/82/15 Bias Belted', + 'Tires' + ), + ( + 725, + 99, + '178/92/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 178/92/15 Bias Belted', + 'Tires' + ), + ( + 726, + 99, + '202/92/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 202/92/15 Bias Belted', + 'Tires' + ), + ( + 727, + 99, + '226/92/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 226/92/15 Bias Belted', + 'Tires' + ), + ( + 728, + 99, + '238/92/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 238/92/15 Bias Belted', + 'Tires' + ), + ( + 729, + 100, + '185/65/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 185/65/14 Radial', + 'Tires' + ), + ( + 730, + 100, + '205/65/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/65/14 Radial', + 'Tires' + ), + ( + 731, + 100, + '195/70/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/70/14 Radial', + 'Tires' + ), + ( + 732, + 100, + '215/70/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/70/14 Radial', + 'Tires' + ), + ( + 733, + 100, + '195/75/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/75/14 Radial', + 'Tires' + ), + ( + 734, + 100, + '205/75/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/75/14 Radial', + 'Tires' + ), + ( + 735, + 100, + '195/65/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/65/15 Radial', + 'Tires' + ), + ( + 736, + 100, + '215/65/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/65/15 Radial', + 'Tires' + ), + ( + 737, + 100, + '205/70/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/70/15 Radial', + 'Tires' + ), + ( + 738, + 100, + '215/70/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/70/15 Radial', + 'Tires' + ), + ( + 739, + 100, + '225/70/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emberwood 225/70/15 Radial', + 'Tires' + ), + ( + 740, + 100, + '205/75/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/75/15 Radial', + 'Tires' + ), + ( + 741, + 100, + '215/75/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/75/15 Radial', + 'Tires' + ), + ( + 742, + 100, + '235/75/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 235/75/15 Radial', + 'Tires' + ), + ( + 743, + 100, + '215/65/16 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/65/16 Radial', + 'Tires' + ), + ( + 744, + 100, + '215/60/16 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/60/16 Radial', + 'Tires' + ), + ( + 745, + 100, + '225/60/16 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 225/60/16 Radial', + 'Tires' + ), + ( + 746, + 100, + '225/55/16 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 225/55/16 Radial', + 'Tires' + ), + ( + 747, + 98, + '205/55/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/55/15 Radial Rain', + 'Tires' + ), + ( + 748, + 98, + '195/60/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 195/60/15 Radial Rain', + 'Tires' + ), + ( + 749, + 98, + '205/60/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/60/15 Radial Rain', + 'Tires' + ), + ( + 750, + 98, + '215/60/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/60/15 Radial Rain', + 'Tires' + ), + ( + 751, + 98, + '185/65/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 185/65/15 Radial Rain', + 'Tires' + ), + ( + 752, + 98, + '195/65/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 195/65/15 Radial Rain', + 'Tires' + ), + ( + 753, + 98, + '205/65/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/65/15 Radial Rain', + 'Tires' + ), + ( + 754, + 98, + '215/65/15 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/65/15 Radial Rain', + 'Tires' + ), + ( + 755, + 98, + '225/55/16 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/55/16 Radial Rain', + 'Tires' + ), + ( + 756, + 98, + '215/60/16 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/60/16 Radial Rain', + 'Tires' + ), + ( + 757, + 98, + '225/60/16 Radial Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/60/16 Radial Rain', + 'Tires' + ), + ( + 758, + 101, + '195/55/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 195/55/15VR Performance', + 'Tires' + ), + ( + 759, + 101, + '205/55/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/55/15VR Performance', + 'Tires' + ), + ( + 760, + 101, + '195/60/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 195/60/15VR Performance', + 'Tires' + ), + ( + 761, + 101, + '205/60/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/60/15VR Performance', + 'Tires' + ), + ( + 762, + 101, + '215/60/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/60/15VR Performance', + 'Tires' + ), + ( + 763, + 101, + '185/65/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 185/65/15VR Performance', + 'Tires' + ), + ( + 764, + 101, + '195/65/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 195/65/15VR Performance', + 'Tires' + ), + ( + 765, + 101, + '205/65/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/65/15VR Performance', + 'Tires' + ), + ( + 766, + 101, + '215/65/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/65/15VR Performance', + 'Tires' + ), + ( + 767, + 101, + '205/40/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/40/16VR Performance', + 'Tires' + ), + ( + 768, + 101, + '215/40/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/40/16VR Performance', + 'Tires' + ), + ( + 769, + 101, + '205/45/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/45/16VR Performance', + 'Tires' + ), + ( + 770, + 101, + '205/45/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/45/16VR Performance', + 'Tires' + ), + ( + 771, + 101, + '215/45/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/45/16VR Performance', + 'Tires' + ), + ( + 772, + 101, + '205/50/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/50/16VR Performance', + 'Tires' + ), + ( + 773, + 101, + '225/50/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 225/50/16VR Performance', + 'Tires' + ), + ( + 774, + 101, + '245/50/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 245/50/16VR Performance', + 'Tires' + ), + ( + 775, + 101, + '205/55/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/55/16VR Performance', + 'Tires' + ), + ( + 776, + 101, + '215/55/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/55/16VR Performance', + 'Tires' + ), + ( + 777, + 101, + '225/55/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 225/55/16VR Performance', + 'Tires' + ), + ( + 778, + 101, + '215/60/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/60/16VR Performance', + 'Tires' + ), + ( + 779, + 101, + '225/60/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 225/60/16VR Performance', + 'Tires' + ), + ( + 780, + 101, + '235/60/16VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 235/60/16VR Performance', + 'Tires' + ), + ( + 781, + 101, + '215/40/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/40/17VR Performance', + 'Tires' + ), + ( + 782, + 101, + '235/40/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 235/40/17VR Performance', + 'Tires' + ), + ( + 783, + 101, + '255/40/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 255/40/17VR Performance', + 'Tires' + ), + ( + 784, + 101, + '215/45/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 215/45/17VR Performance', + 'Tires' + ), + ( + 785, + 101, + '225/45/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 225/45/17VR Performance', + 'Tires' + ), + ( + 786, + 101, + '235/45/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 235/45/17VR Performance', + 'Tires' + ), + ( + 787, + 101, + '245/45/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 245/45/17VR Performance', + 'Tires' + ), + ( + 788, + 101, + '315/35/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 315/35/17VR Performance', + 'Tires' + ), + ( + 789, + 98, + '195/55/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 195/55/15VR Performance Rain', + 'Tires' + ), + ( + 790, + 98, + '205/55/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/55/15VR Performance Rain', + 'Tires' + ), + ( + 791, + 98, + '195/60/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 195/60/15VR Performance Rain', + 'Tires' + ), + ( + 792, + 98, + '205/60/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/60/15VR Performance Rain', + 'Tires' + ), + ( + 793, + 98, + '215/60/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/60/15VR Performance Rain', + 'Tires' + ), + ( + 794, + 98, + '185/65/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 185/65/15VR Performance Rain', + 'Tires' + ), + ( + 795, + 98, + '195/65/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 195/65/15VR Performance Rain', + 'Tires' + ), + ( + 796, + 98, + '205/65/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/65/15VR Performance Rain', + 'Tires' + ), + ( + 797, + 98, + '215/65/15VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/65/15VR Performance Rain', + 'Tires' + ), + ( + 798, + 98, + '205/40/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/40/16VR Performance Rain', + 'Tires' + ), + ( + 799, + 98, + '205/45/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/45/16VR Performance Rain', + 'Tires' + ), + ( + 800, + 98, + '215/45/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/45/16VR Performance Rain', + 'Tires' + ), + ( + 801, + 98, + '205/50/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/50/16VR Performance Rain', + 'Tires' + ), + ( + 802, + 98, + '225/50/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/50/16VR Performance Rain', + 'Tires' + ), + ( + 803, + 98, + '245/50/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 245/50/16VR Performance Rain', + 'Tires' + ), + ( + 804, + 98, + '205/55/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 205/55/16VR Performance Rain', + 'Tires' + ), + ( + 805, + 98, + '225/55/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/55/16VR Performance Rain', + 'Tires' + ), + ( + 806, + 98, + '215/60/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/60/16VR Performance Rain', + 'Tires' + ), + ( + 807, + 98, + '225/60/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/60/16VR Performance Rain', + 'Tires' + ), + ( + 808, + 98, + '235/60/16VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 235/60/16VR Performance Rain', + 'Tires' + ), + ( + 809, + 98, + '215/40/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/40/17VR Performance Rain', + 'Tires' + ), + ( + 810, + 98, + '235/40/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 235/40/17VR Performance Rain', + 'Tires' + ), + ( + 811, + 98, + '215/45/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 215/45/17VR Performance Rain', + 'Tires' + ), + ( + 812, + 98, + '225/45/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 225/45/17VR Performance Rain', + 'Tires' + ), + ( + 813, + 98, + '235/45/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 235/45/17VR Performance Rain', + 'Tires' + ), + ( + 814, + 98, + '245/45/17VR Perf. Rain', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Michelin 245/45/17VR Performance Rain', + 'Tires' + ), + ( + 827, + 1, + '32 Coupe Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 Coupe Hood', + 'Hood' + ), + ( + 828, + 1, + '32 Coupe Front Fenders', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 Coupe Front Fenders', + 'Fenders' + ), + ( + 829, + 1, + '32 Coupe Rear Fenders', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 Coupe Rear Fenders', + 'Fenders' + ), + ( + 830, + 1, + '32 Coupe Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 Coupe Running Boards', + 'Running Boards' + ), + ( + 831, + 1, + '32 Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '32 Coupe Bumpers! Put em on!', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '32 Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 32 Coupe Bumpers', + 'Bumpers' + ), + ( + 833, + 1, + '40 Coupe Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 40 Coupe Hood', + 'Hood' + ), + ( + 834, + 1, + '40 Coupe Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 40 Coupe Running Boards', + 'Running Boards' + ), + ( + 836, + 1, + '49 Coupe Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 49 Coupe Hood', + 'Hood' + ), + ( + 838, + 1, + '53 Crestline Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 53 Crestline Hood', + 'Hood' + ), + ( + 840, + 1, + '57 Fairlane 500 Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Fairlane 500 Hood', + 'Hood' + ), + ( + 842, + 1, + '57 Ranchero Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Ranchero Hood', + 'Hood' + ), + ( + 844, + 1, + '57 T-Bird Hood w/Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 T-Bird Hood w/Scoop', + 'Hood' + ), + ( + 846, + 1, + '63 T-Bird Hood w/Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 63 T-Bird Hood w/Scoop', + 'Hood' + ), + ( + 848, + 1, + '64 Galaxie 500 Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 64 Galaxie 500 Hood', + 'Hood' + ), + ( + 850, + 1, + '64 Mustang Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 64 Mustang Hood', + 'Hood' + ), + ( + 852, + 1, + '69 Torino Hood w/Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 69 Torino Hood w/Scoop', + 'Hood' + ), + ( + 854, + 1, + '70 Mustang Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Mustang Hood', + 'Hood' + ), + ( + 856, + 65, + 'Steel Slotted Rim', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Steel Slotted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Kelsey-Hayes Steel Slotted Rim', + 'Wheel Rims' + ), + ( + 857, + 65, + 'Steel Rim', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Kelsey-Hayes Steel Rim', + 'Wheel Rims' + ), + ( + 864, + 1, + 'Early 3 spd. Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Early 3 spd. Manual (Gear Ratios)', + 'Transmission' + ), + ( + 865, + 1, + 'Ford-o-matic Auto.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic Auto.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic Auto.', + 'Transmission' + ), + ( + 866, + 17, + 'T-10 4 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-10 4 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Borg T-10 4 spd Manual', + 'Transmission' + ), + ( + 867, + 1, + 'C-4 Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C-4 Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford C-4 Automatic', + 'Transmission' + ), + ( + 868, + 1, + '4 spd Manual (Top)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd Manual (Top)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4 spd Manual (Top)', + 'Transmission' + ), + ( + 869, + 61, + '3.56 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.56', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.56) Differential', + 'Rear End' + ), + ( + 870, + 61, + '3.25 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.25) Differential', + 'Rear End' + ), + ( + 871, + 61, + '3.91 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.91', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana (3.91) Differential', + 'Rear End' + ), + ( + 872, + 1, + 'Late 3 spd. Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 speed m/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Late 3 spd. Manual', + 'Transmission' + ), + ( + 873, + 1, + 'Cruise-o-matic Auto.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cruise-o-matic Auto.', + 'Transmission' + ), + ( + 874, + 17, + 'T-85 3 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-85 3 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Borg T-85 3 spd Manual', + 'Transmission' + ), + ( + 875, + 1, + 'Flathead 239-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '239', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 239-V8', + 'Engine Block' + ), + ( + 876, + 1, + '312-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '312', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 312-V8', + 'Engine Block' + ), + ( + 877, + 1, + '427-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427-V8', + 'Engine Block' + ), + ( + 878, + 1, + '289-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 289-V8', + 'Engine Block' + ), + ( + 879, + 1, + '302-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302-V8', + 'Engine Block' + ), + ( + 880, + 1, + '429-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429-V8', + 'Engine Block' + ), + ( + 881, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock TI Crankshaft', + 'Crankshaft' + ), + ( + 882, + 1, + 'Dished Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dished', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Dished Top Cast Aluminum Piston', + 'Pistons' + ), + ( + 883, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss Dual Plane Aluminum Intake Manifold', + 'Intake Manifold' + ), + ( + 884, + 1, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Aluminum Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 885, + 1, + 'Detroit Lubricator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Detroit Lubricator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Detroit Lubricator', + 'Carburetor' + ), + ( + 886, + 14, + '4100 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4100 4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 887, + 1, + 'Flathead (6.15) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (6.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead (6.15) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 888, + 2, + 'Flathead (6.8) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mercury Stock (6.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mercury Flathead (6.8) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 889, + 1, + 'Flathead (7.2) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (7.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead (7.2) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 890, + 1, + 'Low Riser (11.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Low Riser (11.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Low Riser (11.6)', + 'Cylinder Head' + ), + ( + 891, + 1, + 'Boss HP (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss HP (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss HP (10.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 892, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Ford BB Valvetrain', + 'Valve Train' + ), + ( + 893, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss HD Solid Lifter Valve Train', + 'Valve Train' + ), + ( + 934, + 1, + '3 spd/4.10 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/4.10 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/4.10 (32-48)', + 'Driveline Assembly' + ), + ( + 935, + 1, + '3 spd/3.78 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.78 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/3.78 (32-48)', + 'Driveline Assembly' + ), + ( + 936, + 1, + '3 spd/3.90 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.90 (32-48)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/3.90 (32-48)', + 'Driveline Assembly' + ), + ( + 937, + 1, + '3 spd/3.56 (49-62)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.56 (49-62)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/3.56 (49-62)', + 'Driveline Assembly' + ), + ( + 938, + 1, + 'Ford-o-matic/3.31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic/3.31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic/3.31', + 'Driveline Assembly' + ), + ( + 939, + 1, + 'Ford-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'rear axle ratio of 3.10 to 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic/3.10', + 'Driveline Assembly' + ), + ( + 940, + 1, + 'Ford-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'The Ford-o-matic was first introduced on the 1957 Fairlane and has a rear axle ratio of 3.70 to 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford-o-matic/3.70', + 'Driveline Assembly' + ), + ( + 941, + 1, + 'Cruise-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'this driveline assembly was found in many late 50''s to early 70''s Ford cars.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cruise-o-matic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cruise-o-matic/3.00 ', + 'Driveline Assembly' + ), + ( + 942, + 1, + '3 spd/(T-86)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'the relatively low final drive ratio of 3.25 allow a car to reach high top speeds', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/(T-86)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/3.25 (T-86)', + 'Driveline Assembly' + ), + ( + 943, + 1, + '3 spd/3.25 (T-85)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.25 (T-85)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 3 spd/3.25 (T-85)', + 'Driveline Assembly' + ), + ( + 944, + 1, + '4 spd/3.25 (T-10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.25 (T-10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4 spd/3.25 (T-10)', + 'Driveline Assembly' + ), + ( + 945, + 1, + 'C-4 auto/3.00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'standard Ford transmission', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C-4 auto/3.00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford C-4 auto/3.00', + 'Driveline Assembly' + ), + ( + 946, + 1, + '4 spd/3.50 (Top)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.50 (Top)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4 spd/3.50 (Top)', + 'Driveline Assembly' + ), + ( + 947, + 1, + 'C-4 auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'standard Ford transmission', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C-4 auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford C-4 auto/3.91', + 'Driveline Assembly' + ), + ( + 948, + 1, + 'C-6 auto/3.91 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C-6 auto/3.91 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford C-6 auto/3.91 Lock', + 'Driveline Assembly' + ), + ( + 949, + 1, + 'Flathead Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flathead Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Single', + 'Exhaust Assembly' + ), + ( + 950, + 1, + 'Passenger Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Passenger Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Passenger Single', + 'Exhaust Assembly' + ), + ( + 951, + 1, + 'Passenger Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Passenger Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Passenger Dual', + 'Exhaust Assembly' + ), + ( + 952, + 1, + 'Performance Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Performance Dual', + 'Exhaust Assembly' + ), + ( + 953, + 1, + 'Flathead 221 1V (65 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'original flathead engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '221 1V (65 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 221 1V (65 hp)', + 'Engine Assembly' + ), + ( + 954, + 1, + 'Flathead 221 2V (85 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'flathead engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '221 2V (85 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 221 2V (85 hp)', + 'Engine Assembly' + ), + ( + 955, + 1, + 'Flathead 255 2V (112 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'flathead engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '255 2V (112 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 255- 2V (112 hp)', + 'Engine Assembly' + ), + ( + 956, + 1, + 'Flathead 239 2V (110 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'flathead engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '239 2V (110 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 239 2V (110 hp)', + 'Engine Assembly' + ), + ( + 957, + 1, + '312 4V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'stock with automatic transmission vehicles', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '312 4V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 312 4V (245 hp)', + 'Engine Assembly' + ), + ( + 958, + 1, + '427 LR 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'performance engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 LR 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 LR 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 959, + 1, + '289 2V (195 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289 2V (195 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 289 2V (195 hp)', + 'Engine Assembly' + ), + ( + 960, + 1, + '302 2V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302 2V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302-V8 2V (220 hp)', + 'Engine Assembly' + ), + ( + 961, + 1, + '429 Boss (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1969 Street Boss engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 Boss (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 Boss (375 hp)', + 'Engine Assembly' + ), + ( + 962, + 99, + '162/68/18 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 162/68/18 Bias Belted', + 'Tires' + ), + ( + 964, + 1, + 'Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 57 Fairlane 500', + 'Vehicle' + ), + ( + 971, + 1, + 'Boss 429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Boss 429 Mustang', + 'Vehicle' + ), + ( + 974, + 1, + 'Torino GT', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torino', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Torino GT', + 'Vehicle' + ), + ( + 980, + 11, + 'Big Bad AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 69 BigBad AMX', + 'Vehicle' + ), + ( + 990, + 10, + 'GTX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GTX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth GTX Cpe', + 'Vehicle' + ), + ( + 1002, + 8, + '4 spd/', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler 4 spd/', + 'Driveline Assembly' + ), + ( + 1003, + 8, + 'Shift-Command', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shift-Command', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Shift-Command/', + 'Driveline Assembly' + ), + ( + 1004, + 8, + '3 spd/', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler 3 spd/', + 'Driveline Assembly' + ), + ( + 1005, + 8, + '4 spd/3.55 ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler 4 spd/3.55 ', + 'Driveline Assembly' + ), + ( + 1006, + 8, + 'Torqueflite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'The Torqueflite transmission was found in a majority of Chrysler''s cars in the 70''s.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torqueflite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Torqueflite/3.23 ', + 'Driveline Assembly' + ), + ( + 1007, + 8, + '4 spd/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler 4 spd/3.55 Lock', + 'Driveline Assembly' + ), + ( + 1008, + 8, + 'Torqueflite/3.23 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'This version of the Torqueflite has a 3.23 to 1 rear axle ratio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torqueflite/3.23 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Torqueflite/3.23 Lock', + 'Driveline Assembly' + ), + ( + 1009, + 8, + 'Torqueflite/3.23 Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi version of the Torqueflite Transmission', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torqueflite/3.23 Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Torqueflite/3.23 Hemi', + 'Driveline Assembly' + ), + ( + 1010, + 8, + 'Passenger Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Passenger Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Passenger Single', + 'Exhaust Assembly' + ), + ( + 1011, + 8, + 'Passenger Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Passenger Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Passenger Dual', + 'Exhaust Assembly' + ), + ( + 1012, + 8, + 'Performance Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Performance Dual', + 'Exhaust Assembly' + ), + ( + 1013, + 8, + 'High Perf. Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler High Perf. Dual', + 'Exhaust Assembly' + ), + ( + 1014, + 11, + '290 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '290 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 290 4V (225 hp)', + 'Engine Assembly' + ), + ( + 1015, + 11, + '343 4V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '343 4V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 343 4V (280 hp)', + 'Engine Assembly' + ), + ( + 1016, + 4, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'an innovative engine block when it first came out in 1949; smaller and lighter than previous designs', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB 390 4V (315 hp)', + 'Engine Assembly' + ), + ( + 1017, + 8, + '318 2V (230 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '318 2V (230 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 318 2V (230 hp)', + 'Engine Assembly' + ), + ( + 1018, + 8, + '440 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440 4V (375 hp)', + 'Engine Assembly' + ), + ( + 1019, + 8, + 'Hemi 426 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'street hemi configuration', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi 426 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 1020, + 8, + '340 3x2V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '340 3x2V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 340 3x2V (290 hp)', + 'Engine Assembly' + ), + ( + 1021, + 8, + '340 4V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '340 4V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 340 4V (275 hp)', + 'Engine Assembly' + ), + ( + 1022, + 8, + 'Hemi (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi (10.25) Cylinder Head', + 'Cylinder Head' + ), + ( + 1023, + 8, + 'AAR (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AAR (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB AAR (10.5) W/P Cylinder Head', + 'Cylinder Head' + ), + ( + 1034, + 8, + 'Shift-Command Auto', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shift-Command', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Shift-Command Automatic (2.45/1.45/1)', + 'Transmission' + ), + ( + 1035, + 8, + 'Stock Round Chrome', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Stock Round Chrome', + 'Tail Pipe Tip' + ), + ( + 1036, + 11, + '290-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '290', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 290-V8', + 'Engine Block' + ), + ( + 1037, + 11, + '343-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '343', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 343-V8', + 'Engine Block' + ), + ( + 1038, + 11, + '390-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 390-V8', + 'Engine Block' + ), + ( + 1039, + 8, + '318-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '318', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 318-V8', + 'Engine Block' + ), + ( + 1040, + 8, + '440-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440-V8', + 'Engine Block' + ), + ( + 1041, + 8, + '426-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '426', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426-V8', + 'Engine Block' + ), + ( + 1042, + 8, + '340-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '340', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 340-V8', + 'Engine Block' + ), + ( + 1043, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock Lubrication System', + 'Lubrication System' + ), + ( + 1044, + 8, + 'Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock CI/DP IM', + 'Intake Manifold' + ), + ( + 1045, + 8, + 'Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock Dual Plane Manifold', + 'Intake Manifold' + ), + ( + 1046, + 11, + 'Stock (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (10.0) W CH', + 'Cylinder Head' + ), + ( + 1047, + 11, + 'Stock (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (10.2) W CH', + 'Cylinder Head' + ), + ( + 1048, + 11, + 'SS (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SS (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC SS (10.2) HP Cylinder Head', + 'Cylinder Head' + ), + ( + 1049, + 7, + 'Stock (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock (9.2) Cylinder Head', + 'Cylinder Head' + ), + ( + 1050, + 8, + 'Stock (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock (10.5) W Cylinder Head', + 'Cylinder Head' + ), + ( + 1051, + 0, + 'TRFMONTE', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFMONTE (Traffic)', + 'Vehicle' + ), + ( + 1052, + 0, + 'TRFDELVR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFDELVR (Traffic)', + 'Vehicle' + ), + ( + 1053, + 0, + 'TRFBUS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFBUS (Traffic)', + 'Vehicle' + ), + ( + 1054, + 0, + 'TRFGSX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFGSX (Traffic)', + 'Vehicle' + ), + ( + 1055, + 0, + 'TRFSTANG', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFSTANG (Traffic)', + 'Vehicle' + ), + ( + 1056, + 0, + 'TRFTBIRD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFTBIRD (Traffic)', + 'Vehicle' + ), + ( + 1057, + 0, + 'TRFPUP1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRFPUP1 (Traffic)', + 'Vehicle' + ), + ( + 1058, + 0, + 'TRF2DR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Traffic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Electronic Arts TRF2DR (Traffic)', + 'Vehicle' + ), + ( + 1084, + 15, + '3 spd./3.71', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd./3.71', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd./3.71', + 'Driveline Assembly' + ), + ( + 1085, + 15, + 'Hydramatic/3.54', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hydramatic/3.54', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Hydramatic/3.54', + 'Driveline Assembly' + ), + ( + 1086, + 15, + '3 spd/3.90 (37-60)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.90 (37-60)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.90 (37-60)', + 'Driveline Assembly' + ), + ( + 1087, + 15, + 'Dynaflow/3.4 (52-60)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dynaflow/3.4 (52-60)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Dynaflow/3.4 (52-60)', + 'Driveline Assembly' + ), + ( + 1088, + 15, + '3 spd/3.70', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.70', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.70', + 'Driveline Assembly' + ), + ( + 1089, + 15, + 'Turboglide/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turboglide/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Turboglide/3.55', + 'Driveline Assembly' + ), + ( + 1090, + 15, + 'Powerglide/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Powerglide/3.55', + 'Driveline Assembly' + ), + ( + 1091, + 15, + '3 spd/3.70 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.70 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.70 Posi', + 'Driveline Assembly' + ), + ( + 1092, + 15, + 'Hydramatic/2.94', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hydramatic/2.94', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Hydramatic/2.94', + 'Driveline Assembly' + ), + ( + 1093, + 15, + '4 spd/3.70 Posi (Borg)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.70 Posi (Borg)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.70 Posi (Borg)', + 'Driveline Assembly' + ), + ( + 1094, + 15, + '3 spd/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.36 Posi', + 'Driveline Assembly' + ), + ( + 1095, + 15, + 'Powerglide/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Powerglide/3.36 Posi', + 'Driveline Assembly' + ), + ( + 1096, + 15, + '4 spd/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.36 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.36 Posi', + 'Driveline Assembly' + ), + ( + 1097, + 15, + '3 spd/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.55', + 'Driveline Assembly' + ), + ( + 1098, + 15, + 'Powerglide/3.08 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide/3.08 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Powerglide/3.08 Posi', + 'Driveline Assembly' + ), + ( + 1099, + 15, + '3 spd/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.55 Lock', + 'Driveline Assembly' + ), + ( + 1100, + 15, + 'Hydramatic/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hydramatic/3.55 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Hydramatic/3.55 Lock', + 'Driveline Assembly' + ), + ( + 1101, + 15, + '3 spd/3.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 spd/3.73 Posi', + 'Driveline Assembly' + ), + ( + 1102, + 15, + 'Powerglide/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Powerglide/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Powerglide/3.07', + 'Driveline Assembly' + ), + ( + 1103, + 15, + '4 spd/3.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.73 Posi', + 'Driveline Assembly' + ), + ( + 1104, + 15, + 'T-Hydramatic/2.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydramatic/2.73 Posi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors T-Hydramatic/2.73 Posi', + 'Driveline Assembly' + ), + ( + 1105, + 15, + '4 spd/3.42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.42', + 'Driveline Assembly' + ), + ( + 1106, + 15, + 'T-Hydramatic/3.42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydramatic/3.42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors T-Hydramatic/3.42', + 'Driveline Assembly' + ), + ( + 1107, + 15, + '4 spd/3.31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.31', + 'Driveline Assembly' + ), + ( + 1108, + 15, + 'T-Hydramatic/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydramatic/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors T-Hydramatic/3.55', + 'Driveline Assembly' + ), + ( + 1109, + 15, + 'T-Hydramatic/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydramatic/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors T-Hydramatic/3.07', + 'Driveline Assembly' + ), + ( + 1110, + 15, + '4 spd/3.90 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.90 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.90 Lock', + 'Driveline Assembly' + ), + ( + 1111, + 15, + '4 spd/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.55', + 'Driveline Assembly' + ), + ( + 1112, + 15, + '4 spd/3.42 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd/3.42 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 4 spd/3.42 Lock', + 'Driveline Assembly' + ), + ( + 1113, + 4, + '346 2V (150 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a big chunk of iron', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '346 2V (150 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head 346 2V (150 hp)', + 'Engine Assembly' + ), + ( + 1114, + 6, + '322 4V (236 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fireball V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '322 4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 322 4V (236 hp)', + 'Engine Assembly' + ), + ( + 1115, + 3, + '283 FI (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'baseline FI engine; includes improved oiling and Ram''s Horn exhaust manifolds', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 FI (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 FI (250 hp)', + 'Engine Assembly' + ), + ( + 1116, + 4, + '390 3x2V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'an innovative engine block when it first came out in 1949; smaller and lighter than previous designs', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 3x2V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB 390 3x2V (345 hp)', + 'Engine Assembly' + ), + ( + 1117, + 3, + '327 4V (300 hp) (L75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'cast iron block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 4V (300 hp) (L75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 4V (300 hp) (L75)', + 'Engine Assembly' + ), + ( + 1118, + 7, + '389 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 4V (335 hp)', + 'Engine Assembly' + ), + ( + 1119, + 3, + '396 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'semi-hemi combustion chambers; smooth bend port runners; a modern engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy BB 396 4V (375 hp)', + 'Engine Assembly' + ), + ( + 1120, + 7, + '400 Ram Air II (366 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'as installed on the 1968 GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air II (366 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 Ram Air II (366 hp)', + 'Engine Assembly' + ), + ( + 1121, + 3, + '350 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'strengthened block to accomdate new bore and stroke; mainstay during the 70''s and 80''s', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy SB 350 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1122, + 5, + '455 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 4V (375 hp)', + 'Engine Assembly' + ), + ( + 1123, + 7, + '455 SD 4V (310 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Duty; this version of the engine never quite reached production due to emissions requirements', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 SD 4V (310 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 455 4V (310 hp)', + 'Engine Assembly' + ), + ( + 1124, + 7, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Wedge (10.5) W CH', + 'Cylinder Head' + ), + ( + 1125, + 5, + '(10.25) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB (10.25) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 1126, + 7, + 'Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.75) W Cylinder Head', + 'Cylinder Head' + ), + ( + 1127, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Chevrolet BB IM', + 'Intake Manifold' + ), + ( + 1128, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Chevrolet SB IM', + 'Intake Manifold' + ), + ( + 1129, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Chrysler BB IM', + 'Intake Manifold' + ), + ( + 1130, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Chrysler SB IM', + 'Intake Manifold' + ), + ( + 1131, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Ford BB IM', + 'Intake Manifold' + ), + ( + 1132, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Ford SB IM', + 'Intake Manifold' + ), + ( + 1133, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Olds BB IM', + 'Intake Manifold' + ), + ( + 1134, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Olds SB IM', + 'Intake Manifold' + ), + ( + 1135, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi IM', + 'Intake Manifold' + ), + ( + 1136, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Pontiac IM', + 'Intake Manifold' + ), + ( + 1137, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'high flow tunnel ram aluminum alloy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Tunnel Ram Pontiac IM', + 'Intake Manifold' + ), + ( + 1138, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chevrolet BB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1139, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chevrolet SB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1140, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chrysler BB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1141, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chrysler SB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1142, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Ford BB IM', + 'Intake Manifold' + ), + ( + 1143, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Ford SB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1144, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Olds BB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1145, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Olds SB Dual Plane IM', + 'Intake Manifold' + ), + ( + 1146, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree CI DP IM', + 'Intake Manifold' + ), + ( + 1147, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Pontiac Dual Plane IM', + 'Intake Manifold' + ), + ( + 1148, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Chevrolet BB IM', + 'Intake Manifold' + ), + ( + 1149, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Chevrolet SB IM', + 'Intake Manifold' + ), + ( + 1150, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Chrysler BB IM', + 'Intake Manifold' + ), + ( + 1151, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Chrysler SB IM', + 'Intake Manifold' + ), + ( + 1152, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Ford BB IM', + 'Intake Manifold' + ), + ( + 1153, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Ford SB IM', + 'Intake Manifold' + ), + ( + 1154, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Olds BB IM', + 'Intake Manifold' + ), + ( + 1155, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Olds SB IM', + 'Intake Manifold' + ), + ( + 1156, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Pontiac IM', + 'Intake Manifold' + ), + ( + 1157, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Single Plane Pontiac IM', + 'Intake Manifold' + ), + ( + 1158, + 15, + '3 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd Manual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors GM 3 spd Manual (A)', + 'Transmission' + ), + ( + 1159, + 15, + 'M22 4 Speed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'M22', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM M22 Close Ratio 4 Spd Manual', + 'Transmission' + ), + ( + 1160, + 15, + '3.71 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.71', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM (3.71) Differential', + 'Rear End' + ), + ( + 1161, + 4, + '346-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '346', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head 346-V8', + 'Engine Block' + ), + ( + 1162, + 6, + '322-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'cast iron block with two-bolt main bearing cap', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '322', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 322-V8', + 'Engine Block' + ), + ( + 1172, + 71, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Normal Duty Air Cleaner', + 'Air Cleaner' + ), + ( + 1173, + 5, + '(9.0) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB (9.0) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 1174, + 3, + 'Wedge (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB (9.5) W Cylinder Head', + 'Cylinder Head' + ), + ( + 1175, + 3, + 'Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Canted (11.0) Cylinder Head', + 'Cylinder Head' + ), + ( + 1176, + 7, + '350-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 350', + 'Engine Block' + ), + ( + 1177, + 7, + '421-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac V8 421', + 'Engine Block' + ), + ( + 1184, + 15, + 'Camaro Sidepipes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sidepipes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Camaro Sidepipes', + 'Muffler' + ), + ( + 1185, + 15, + 'Hood Mod Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Hood Mod Bel-Air', + 'Hood' + ), + ( + 1186, + 15, + '3 spd M/3.70 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd M/3.70 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 Spd M/3.70 Lock', + 'Driveline Assembly' + ), + ( + 1187, + 15, + '3 spd M/3.36 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd M/3.36 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors 3 Spd M/3.36 Lock', + 'Driveline Assembly' + ), + ( + 1188, + 46, + 'T-Hydro 400/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydro 400/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully T-Hydro 400/3.55', + 'Driveline Assembly' + ), + ( + 1189, + 15, + 'Hydramatic/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hydramatic/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'General Motors Hydramatic/3.55', + 'Driveline Assembly' + ), + ( + 1190, + 7, + 'T-Hydramatic/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Hydramatic/3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac T-Hydramatic/12-bolt 3.07', + 'Driveline Assembly' + ), + ( + 1191, + 11, + 'Shift-Command', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'This automatic transmission was found in the AMX in 69 and had a rear axle ratio of 3.54 to 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shift-Command', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Shift-Command/3.54', + 'Driveline Assembly' + ), + ( + 1192, + 10, + '3 spd/3.9 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.9 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 3 Spd/3.9 Lock', + 'Driveline Assembly' + ), + ( + 1193, + 1, + 'Cruise-o-matic/3.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cruise-o-matic/3.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cruise-o-matic/3.10', + 'Driveline Assembly' + ), + ( + 1194, + 46, + 'Cool T-Hydro 400/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Driveline Assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cool T-Hydro 400/3.55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully Cool T-Hydro 400/3.55', + 'Driveline Assembly' + ), + ( + 1195, + 3, + '4 spd Synchro M/4.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd Synchro M/4.10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 4 Spd Synchro M/4.10', + 'Driveline Assembly' + ), + ( + 1196, + 3, + '3 spd/3.77 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.77 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 3 Spd/3.77 Lock', + 'Driveline Assembly' + ), + ( + 1197, + 3, + '3 spd/3.31 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.31 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 3 spd/3.31 Lock', + 'Driveline Assembly' + ), + ( + 1198, + 1, + '4 spd M/3.91', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 spd M/3.91', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 4 Spd M/3.91', + 'Driveline Assembly' + ), + ( + 1199, + 67, + '3 spd/3.42 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/3.42 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall 3 Speed/3.42 Lock', + 'Driveline Assembly' + ), + ( + 1200, + 8, + '3 spd/4.10 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 spd/4.10 Lock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler 3 Spd/4.10 Lock', + 'Driveline Assembly' + ), + ( + 1202, + 6, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick 55 Century', + 'Vehicle' + ), + ( + 1203, + 3, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 57 Bel-Air', + 'Vehicle' + ), + ( + 1230, + 7, + 'GTO Judge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 69 GTO Judge', + 'Vehicle' + ), + ( + 1243, + 1, + 'FH (7.5) Denver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Denver (7.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead (7.5) Denver Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 1244, + 5, + '(8.5) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB (8.5) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 1245, + 3, + '(10.25) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W (10.25) 2.07i/1.72e CH', + 'Cylinder Head' + ), + ( + 1246, + 3, + 'L72', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L72', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB (11.0) L72 HP Canted Cylinder Head', + 'Cylinder Head' + ), + ( + 1247, + 3, + 'L88 Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L88', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB L88 Aluminum Canted Cylinder Head', + 'Cylinder Head' + ), + ( + 1248, + 3, + 'L89 Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L89', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB L89 Aluminum Canted Cylinder Head', + 'Cylinder Head' + ), + ( + 1249, + 1, + '1957 (9.0) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 1957 (9.0) Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 1250, + 1, + 'Canted (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Canted (8.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 1251, + 1, + 'Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Canted (11.0) Cylinder Head', + 'Cylinder Head' + ), + ( + 1252, + 1, + 'HO HP (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HO HP (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland HO (9.2) Canted CH', + 'Cylinder Head' + ), + ( + 1253, + 1, + 'Wedge (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (9.6) Wedge CH', + 'Cylinder Head' + ), + ( + 1254, + 1, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cammer HP CH', + 'Cylinder Head' + ), + ( + 1255, + 1, + 'Wedge HP (11.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge HP (11.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HP (11.4) W/P CH', + 'Cylinder Head' + ), + ( + 1256, + 1, + 'High Riser (11.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Riser (11.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB High Riser (11.5) W/F Cylinder Head', + 'Cylinder Head' + ), + ( + 1257, + 1, + '(10.5) Canted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 (10.5) Canted CH', + 'Cylinder Head' + ), + ( + 1258, + 1, + 'Cobrajet (11.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobrajet (11.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford (11.3) CJ HP CH', + 'Cylinder Head' + ), + ( + 1260, + 7, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.0) W/P Cylinder Head', + 'Cylinder Head' + ), + ( + 1261, + 8, + 'Max Wedge I (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge I (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge I (11.0) Cylinder Head', + 'Cylinder Head' + ), + ( + 1262, + 8, + 'Max Wedge I (13.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge I (13.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge I (13.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 1282, + 8, + 'Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Tunnel Ram Intake Manifold', + 'Intake Manifold' + ), + ( + 1283, + 3, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Aluminum Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1284, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Stock Intake Manifold', + 'Intake Manifold' + ), + ( + 1285, + 3, + ' Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Z11 Aluminum Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1286, + 1, + 'Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cobrajet Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1287, + 38, + 'Offenhauser Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offenhauser Chrysler Hemi Dual Plane Magnesium IM', + 'Intake Manifold' + ), + ( + 1288, + 1, + 'Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cobrajet HP Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1289, + 8, + 'Max Wedge Cross-Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge Aluminum Cross-Ram Intake Manifold', + 'Intake Manifold' + ), + ( + 1290, + 22, + 'Tri-Pwr 3x2V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Power 3x2V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter Tri-Power 3x2V Carburetor', + 'Carburetor' + ), + ( + 1291, + 16, + 'Q-Jet 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 2x4V (800 cfm) Carb', + 'Carburetor' + ), + ( + 1292, + 1, + 'Ford 385 Valve Cover', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Cast Iron Valve Cover', + 'Valve Cover' + ), + ( + 1293, + 3, + 'Chevy W Valve Cover', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy W Cast Iron Valve Cover', + 'Valve Cover' + ), + ( + 1294, + 3, + 'Hi-Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hi-Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Hi-Lift Hydraulic Valve Train', + 'Valve Train' + ), + ( + 1295, + 1, + 'Tri-Y Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Y Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Tri-Y Steel Tube Headers', + 'Exhaust Manifold' + ), + ( + 1299, + 8, + 'Max Wedge III', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge III Valve Train', + 'Valve Train' + ), + ( + 1307, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Chrysler SB DP Camshaft', + 'Camshaft' + ), + ( + 1308, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock Camshaft', + 'Camshaft' + ), + ( + 1309, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock Camshaft', + 'Camshaft' + ), + ( + 1310, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Stock Camshaft', + 'Camshaft' + ), + ( + 1311, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'bone stock; low idle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock Camshaft', + 'Camshaft' + ), + ( + 1312, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Stock Camshaft', + 'Camshaft' + ), + ( + 1313, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock Camshaft', + 'Camshaft' + ), + ( + 1314, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock Camshaft', + 'Camshaft' + ), + ( + 1315, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Stock Camshaft', + 'Camshaft' + ), + ( + 1316, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Stock Camshaft', + 'Camshaft' + ), + ( + 1317, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock Camshaft', + 'Camshaft' + ), + ( + 1318, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock Camshaft', + 'Camshaft' + ), + ( + 1319, + 8, + 'Barracuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Barracuda Stock Camshaft', + 'Camshaft' + ), + ( + 1320, + 3, + 'Stock Hi-Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock Hi-Lift Camshaft', + 'Camshaft' + ), + ( + 1321, + 3, + 'HP Duntov', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Duntov', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB HP Duntov Camshaft', + 'Camshaft' + ), + ( + 1322, + 3, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB HP Camshaft', + 'Camshaft' + ), + ( + 1323, + 3, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB HP Camshaft', + 'Camshaft' + ), + ( + 1324, + 3, + 'HP LS7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB HP LS7 Camshaft', + 'Camshaft' + ), + ( + 1325, + 6, + '1968 Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1968 Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB 1968 Stage I Camshaft', + 'Camshaft' + ), + ( + 1326, + 6, + '1969 Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1969 Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB 1969 Stage I Camshaft', + 'Camshaft' + ), + ( + 1327, + 6, + 'Stage II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'midway between a stock cam and a true high performance cam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stage II Camshaft', + 'Camshaft' + ), + ( + 1328, + 5, + 'W-31 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-31 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB W31 HP Camshaft', + 'Camshaft' + ), + ( + 1329, + 5, + 'W-30 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-30 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB W30 HP Camshaft', + 'Camshaft' + ), + ( + 1330, + 7, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD DP Camshaft', + 'Camshaft' + ), + ( + 1331, + 7, + 'Ram Air I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air I HP Camshaft', + 'Camshaft' + ), + ( + 1332, + 7, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air IV HP Camshaft', + 'Camshaft' + ), + ( + 1333, + 7, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac HO HP Camshaft', + 'Camshaft' + ), + ( + 1334, + 7, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD HP Camshaft', + 'Camshaft' + ), + ( + 1335, + 13, + 'Perf. Q-Jet (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Q-Jet (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Q-Jet (600 cfm) Carb', + 'Carburetor' + ), + ( + 1336, + 1, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Truck Camshaft', + 'Camshaft' + ), + ( + 1337, + 13, + 'Performer RPM (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM (9.25) Chevy SB CH', + 'Cylinder Head' + ), + ( + 1338, + 13, + 'Performer RPM (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM (10.5) Chevy SB CH', + 'Cylinder Head' + ), + ( + 1339, + 13, + 'Performer (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer (10.5) Chevy SB CH', + 'Cylinder Head' + ), + ( + 1340, + 13, + 'Performer (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer (9.25) Chevy SB CH', + 'Cylinder Head' + ), + ( + 1341, + 13, + 'Perf. 454-O (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM 454-O (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM 454-O (9.5) Chevrolet BB Cylinder Head', + 'Cylinder Head' + ), + ( + 1342, + 13, + 'Performer 454-O (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer 454-O (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer 454-O (9.5) Chevrolet BB Head', + 'Cylinder Head' + ), + ( + 1343, + 13, + 'Perf. 454-R (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM 454-R (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM 454-R (9.5) Chevrolet BB Cylinder Head', + 'Cylinder Head' + ), + ( + 1344, + 13, + 'Perf. RPM (11.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM (11.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM (11.5) Chevy SB CH', + 'Cylinder Head' + ), + ( + 1345, + 1, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HO (DP) Camshaft', + 'Camshaft' + ), + ( + 1346, + 1, + 'HO Mild', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Mild', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HO Mild (HP) Camshaft', + 'Camshaft' + ), + ( + 1347, + 1, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cammer (DP+) Camshaft', + 'Camshaft' + ), + ( + 1348, + 1, + 'PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB PI (HP) Camshaft', + 'Camshaft' + ), + ( + 1349, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss (DP) Camshaft', + 'Camshaft' + ), + ( + 1350, + 13, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker Buick BB Intake Manifold', + 'Intake Manifold' + ), + ( + 1351, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Buick BB Intake Manifold', + 'Intake Manifold' + ), + ( + 1352, + 13, + 'Torker II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker II Buick BB Intake Manifold', + 'Intake Manifold' + ), + ( + 1353, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Buick BB Tunnel Ram Intake Manifold', + 'Intake Manifold' + ), + ( + 1354, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1355, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1356, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1357, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1358, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB CI/DP IM', + 'Intake Manifold' + ), + ( + 1359, + 8, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB HP Camshaft', + 'Camshaft' + ), + ( + 1360, + 8, + 'Max Wedge I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge I (HP) Camshaft', + 'Camshaft' + ), + ( + 1361, + 8, + 'Max Wedge III', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge III (DP)Camshaft', + 'Camshaft' + ), + ( + 1362, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi (DP+) Camshaft', + 'Camshaft' + ), + ( + 1363, + 8, + 'AAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB AAR (HP) Camshaft', + 'Camshaft' + ), + ( + 1364, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 (HP+) Camshaft', + 'Camshaft' + ), + ( + 1365, + 11, + 'SS/AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SS/AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC SS/AMX (DP) Camshaft', + 'Camshaft' + ), + ( + 1367, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Cadillac BB Camshaft', + 'Camshaft' + ), + ( + 1368, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Buick BB Camshaft', + 'Camshaft' + ), + ( + 1369, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Buick SB Camshaft', + 'Camshaft' + ), + ( + 1370, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Chevrolet BB Camshaft', + 'Camshaft' + ), + ( + 1371, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Chevrolet SB Camshaft', + 'Camshaft' + ), + ( + 1372, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Chrysler BB Camshaft', + 'Camshaft' + ), + ( + 1373, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Ford BB Camshaft', + 'Camshaft' + ), + ( + 1374, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Ford SB Camshaft', + 'Camshaft' + ), + ( + 1375, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Olds BB Camshaft', + 'Camshaft' + ), + ( + 1376, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Olds SB Camshaft', + 'Camshaft' + ), + ( + 1377, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Pontiac Camshaft', + 'Camshaft' + ), + ( + 1378, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Hemi Camshaft', + 'Camshaft' + ), + ( + 1379, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Chrysler BB Camshaft', + 'Camshaft' + ), + ( + 1380, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Buick BB Camshaft', + 'Camshaft' + ), + ( + 1381, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Buick SB Camshaft', + 'Camshaft' + ), + ( + 1382, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Chevrolet BB Camshaft', + 'Camshaft' + ), + ( + 1383, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Chevrolet SB Camshaft', + 'Camshaft' + ), + ( + 1384, + 74, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Sportsman Ford SB Connecting Rod', + 'Connecting Rods' + ), + ( + 1385, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Ford BB Camshaft', + 'Camshaft' + ), + ( + 1386, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Ford SB Camshaft', + 'Camshaft' + ), + ( + 1387, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Olds BB Camshaft', + 'Camshaft' + ), + ( + 1389, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Ford SB Connecting Rod', + 'Connecting Rods' + ), + ( + 1390, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Olds SB Camshaft', + 'Camshaft' + ), + ( + 1391, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Pontiac Camshaft', + 'Camshaft' + ), + ( + 1392, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special Chevy W Camshaft', + 'Camshaft' + ), + ( + 1393, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Chevrolet SB Stock+ Camshaft', + 'Camshaft' + ), + ( + 1394, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Ford SB Stock+ Camshaft', + 'Camshaft' + ), + ( + 1395, + 74, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Titanium Ford BB Connecting Rod', + 'Connecting Rods' + ), + ( + 1396, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Ford BB Stock+ Camshaft', + 'Camshaft' + ), + ( + 1397, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chrysler BB HP Camshaft', + 'Camshaft' + ), + ( + 1398, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Buick BB HP Camshaft', + 'Camshaft' + ), + ( + 1399, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chevrolet BB HP Camshaft', + 'Camshaft' + ), + ( + 1400, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chevrolet SB HP Camshaft', + 'Camshaft' + ), + ( + 1401, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Ford BB HP Camshaft', + 'Camshaft' + ), + ( + 1402, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Ford SB HP Camshaft', + 'Camshaft' + ), + ( + 1404, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Olds SB HP Camshaft', + 'Camshaft' + ), + ( + 1405, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Pontiac HP Camshaft', + 'Camshaft' + ), + ( + 1407, + 74, + 'Pure-Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pure-Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Pure-Stock Chevrolet SB Crankshaft', + 'Crankshaft' + ), + ( + 1408, + 74, + 'Stock-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Stock-Plus Crankshaft', + 'Crankshaft' + ), + ( + 1409, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Chevrolet SB Crankshaft', + 'Crankshaft' + ), + ( + 1410, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Chrysler BB DP Camshaft', + 'Camshaft' + ), + ( + 1412, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Chevrolet BB DP Camshaft', + 'Camshaft' + ), + ( + 1413, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Chevrolet SB DP Camshaft', + 'Camshaft' + ), + ( + 1414, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Ford BB DP Camshaft', + 'Camshaft' + ), + ( + 1415, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Ford SB DP Camshaft', + 'Camshaft' + ), + ( + 1418, + 13, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker-Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker-Plus Pontiac DP Camshaft', + 'Camshaft' + ), + ( + 1420, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1421, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1422, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1423, + 74, + 'Ultra-Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultra-Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Ultra-Light Chevrolet SB Crankshaft', + 'Crankshaft' + ), + ( + 1424, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1425, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 1426, + 3, + 'RPO411 Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RPO411', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB RPO411 Aluminum Intake Manifold', + 'Intake Manifold' + ), + ( + 1427, + 3, + 'High Rise Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Rise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB High Rise Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1428, + 3, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1429, + 6, + '350-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'cast iron block with two-bolt main bearing cap; similar to previous small-blocks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB V8 350', + 'Engine Block' + ), + ( + 1430, + 6, + '455-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'cast iron block with thick two-bolt main bearing cap', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB V8 455', + 'Engine Block' + ), + ( + 1431, + 74, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Standard Chevrolet SB Crankshaft', + 'Crankshaft' + ), + ( + 1432, + 74, + 'Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Chevrolet BB Crankshaft', + 'Crankshaft' + ), + ( + 1433, + 3, + 'High Rise Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Rise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB High Rise Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1434, + 3, + 'LS6 Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Low Rise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB LS6 Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1435, + 6, + 'Stock 322 Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 322 Dual Plane IM', + 'Intake Manifold' + ), + ( + 1436, + 13, + 'Stage II Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Stage II Buick BB Aluminum IM', + 'Intake Manifold' + ), + ( + 1437, + 5, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1438, + 5, + 'W-31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB W-31 HP Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1439, + 5, + 'W-30 IM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB W-30 HP Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1440, + 7, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air IV HP Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1441, + 7, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1442, + 1, + '1957 Large Port', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'larger than normal ports', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 1957', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 1957 Stock Dual Plane IM', + 'Intake Manifold' + ), + ( + 1443, + 13, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Aluminum Dual Plane Ford SB IM', + 'Intake Manifold' + ), + ( + 1444, + 1, + 'Small Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock Lubrication System', + 'Lubrication System' + ), + ( + 1445, + 1, + 'HR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Riser', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HR Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1446, + 1, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cammer HP Aluminum IM', + 'Intake Manifold' + ), + ( + 1447, + 1, + 'Sidewinder', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sidewinder', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Sidewinder Aluminum Single Plane IM', + 'Intake Manifold' + ), + ( + 1448, + 1, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cast Iron Single Plane IM', + 'Intake Manifold' + ), + ( + 1449, + 38, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offenhauser Magnesium Single Plane Ford 385 IM', + 'Intake Manifold' + ), + ( + 1450, + 8, + 'High Riser', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Riser', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB High Rise Dual Plane IM', + 'Intake Manifold' + ), + ( + 1451, + 8, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1452, + 8, + 'Long Ram IM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Long Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Long Ram IM', + 'Intake Manifold' + ), + ( + 1453, + 8, + 'Short Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Short Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Short Ram IM', + 'Intake Manifold' + ), + ( + 1454, + 13, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Aluminum Dual Plane Chrysler BB IM', + 'Intake Manifold' + ), + ( + 1455, + 3, + '427-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 W', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W V8 427', + 'Engine Block' + ), + ( + 1456, + 8, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 1457, + 11, + 'Rebel Machine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rebel Machine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Rebel Machine Dual Plane IM', + 'Intake Manifold' + ), + ( + 1458, + 13, + 'R4B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'R4B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock R4B AMC Block Dual Plane IM', + 'Intake Manifold' + ), + ( + 1459, + 1, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland 400-V8', + 'Engine Block' + ), + ( + 1460, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Flat Top Cast Aluminum Piston', + 'Pistons' + ), + ( + 1461, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 Piston', + 'Pistons' + ), + ( + 1462, + 13, + 'Super Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Super Dual Ford Flathead IM', + 'Intake Manifold' + ), + ( + 1463, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Cadillac BB IM', + 'Intake Manifold' + ), + ( + 1464, + 1, + '351-V8 Windsor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 Windsor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 351-V8 Windsor', + 'Engine Block' + ), + ( + 1465, + 21, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Ford BB Valvetrain', + 'Valve Train' + ), + ( + 1466, + 21, + 'Fireball XR700', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fireball XR700', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Fireball XR700 Ignition System', + 'Electrical System' + ), + ( + 1467, + 21, + 'Fireball XR3000', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fireball XR3000', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Fireball XR3000 Ignition System', + 'Electrical System' + ), + ( + 1468, + 77, + 'TM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Reed TM Hydraulic Ford BB Valvetrain', + 'Valve Train' + ), + ( + 1469, + 77, + 'T-UL', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-UL', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Reed T-UL Solid Lifter Ford BB Valvetrain', + 'Valve Train' + ), + ( + 1470, + 77, + 'R-ULX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'R-ULX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Reed R-ULX Roller Ford BB Valvetrain', + 'Valve Train' + ), + ( + 1471, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Domed Top Forged Aluminum', + 'Pistons' + ), + ( + 1472, + 6, + '322 4V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fireball V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '322 4V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 322 4V (255 hp)', + 'Engine Assembly' + ), + ( + 1473, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Domed Top Forged Aluminum', + 'Pistons' + ), + ( + 1474, + 3, + '265 2V (162 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265 2V (162 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 265 2V (162 hp)', + 'Engine Assembly' + ), + ( + 1475, + 3, + '265 4V (180 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265 4V (180 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 265 4V (180 hp)', + 'Engine Assembly' + ), + ( + 1476, + 3, + '265 4V (195 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265 4V (195 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 265 4V (195 hp)', + 'Engine Assembly' + ), + ( + 1477, + 3, + '283 2V (185 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 2V (185 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 2V (185 hp)', + 'Engine Assembly' + ), + ( + 1478, + 3, + '283 4V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 4V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 4V (220 hp)', + 'Engine Assembly' + ), + ( + 1479, + 3, + '283 2x4V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 2x4V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 2x4V (245 hp)', + 'Engine Assembly' + ), + ( + 1480, + 3, + '283 2x4V (270 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'includes improved oiling and Ram''s Horn exhaust manifolds', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 2x4V (270 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 2x4V (270 hp)', + 'Engine Assembly' + ), + ( + 1481, + 3, + '283 FI (283 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 FI (283 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 FI (283 hp)', + 'Engine Assembly' + ), + ( + 1482, + 3, + '283 FI (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 FI (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 FI (290 hp)', + 'Engine Assembly' + ), + ( + 1483, + 3, + '283 FI (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 FI (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 FI (275 hp)', + 'Engine Assembly' + ), + ( + 1484, + 3, + '283 FI (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '283 FI (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 283 FI (315 hp)', + 'Engine Assembly' + ), + ( + 1485, + 3, + '265 2x4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RPO 411 package', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 265 2x4V (225 hp)', + 'Engine Assembly' + ), + ( + 1486, + 3, + '327 4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 4V (250 hp)', + 'Engine Assembly' + ), + ( + 1487, + 3, + '327 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'equipped with large valve cylinder head', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1488, + 3, + '327 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 4V (340 hp)', + 'Engine Assembly' + ), + ( + 1489, + 3, + '327 FI (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 FI (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 FI (360 hp)', + 'Engine Assembly' + ), + ( + 1490, + 3, + '327 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 4V (365 hp)', + 'Engine Assembly' + ), + ( + 1491, + 3, + '327 FI (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '327 FI (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 327 FI (375 hp)', + 'Engine Assembly' + ), + ( + 1492, + 3, + '302 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z28 Camaro engine specially built to compete in the SCCA Trans Am Series; high RPM power', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 302 4V (290 hp)', + 'Engine Assembly' + ), + ( + 1493, + 3, + '350 4V (295 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'strengthened block to accomdate new bore and stroke; mainstay during the 70''s and 80''s', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350 4V (295 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350 4V (295 hp)', + 'Engine Assembly' + ), + ( + 1494, + 3, + '350 4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'strengthened block to accomdate new bore and stroke; mainstay during the 70''s and 80''s', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350 4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350 4V (250 hp)', + 'Engine Assembly' + ), + ( + 1495, + 3, + '350 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a remarkable 1 hp per cubic inch', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350 4V (350 hp)', + 'Engine Assembly' + ), + ( + 1496, + 3, + '350 4V (360 hp) Z28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro version; updated Z28 302 engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ' 4V (360 hp) Z28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350 4V (360 hp) Z/28', + 'Engine Assembly' + ), + ( + 1497, + 3, + '350 4V (370 hp) LT-1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Corvette version; updated Z28 302 engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '350 4V (370 hp) LT-1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 350 4V (370 hp) LT-1', + 'Engine Assembly' + ), + ( + 1498, + 3, + '400 4V (265 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'the largest small block made; siamesed cylinder walls', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (265 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 400 4V (265 hp)', + 'Engine Assembly' + ), + ( + 1499, + 6, + 'Stock (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock (10.0) CH', + 'Cylinder Head' + ), + ( + 1500, + 3, + '348 4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 4V (250 hp)', + 'Engine Assembly' + ), + ( + 1501, + 3, + '348 3x2V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 348 3x2V (280 hp)', + 'Engine Assembly' + ), + ( + 1502, + 3, + '348 4V (305 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (305 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 4V (305 hp)', + 'Engine Assembly' + ), + ( + 1503, + 3, + '348 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine; used on Police Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '348 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 4V (315 hp)', + 'Engine Assembly' + ), + ( + 1504, + 3, + '348 3x2V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 348 3x2V (315 hp)', + 'Engine Assembly' + ), + ( + 1505, + 3, + '348 4V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 4V (320 hp)', + 'Engine Assembly' + ), + ( + 1506, + 3, + '348 3x2V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 3x2V (335 hp)', + 'Engine Assembly' + ), + ( + 1507, + 3, + '348 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine RPO 590', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB- W 348 4V (340 hp)', + 'Engine Assembly' + ), + ( + 1508, + 3, + '348 3x2V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine RPO 573B', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 348 3x2V (350 hp)', + 'Engine Assembly' + ), + ( + 1509, + 3, + '409 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine RPO 580', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 4V (360 hp)', + 'Engine Assembly' + ), + ( + 1510, + 3, + '409 4V (380 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (380 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 4V (380 hp)', + 'Engine Assembly' + ), + ( + 1511, + 3, + '409 2x4V (409 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (409 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 2x4V (409 hp)', + 'Engine Assembly' + ), + ( + 1512, + 3, + '409 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (409 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 4V (340 hp)', + 'Engine Assembly' + ), + ( + 1513, + 3, + '409 4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 4V (400 hp)', + 'Engine Assembly' + ), + ( + 1514, + 3, + '409 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 409 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 1515, + 3, + '427 2x4V (430 hp) Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Thrust engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (430 hp) Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W 427 2x4V (430 hp) Z11', + 'Engine Assembly' + ), + ( + 1516, + 3, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Z11 (3.25) Piston', + 'Pistons' + ), + ( + 1517, + 22, + 'AFB 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AFB 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AFB 2x4V (800 cfm) Carb', + 'Carburetor' + ), + ( + 1518, + 3, + '396 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 396 4V (325 hp)', + 'Engine Assembly' + ), + ( + 1519, + 3, + '396 4V (350 hp) L34', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine L34', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (350 hp) L34', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 396 4V (350 hp)', + 'Engine Assembly' + ), + ( + 1520, + 3, + '396 4V (425 hp) L78', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine L78', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (425 hp) L78', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 396 4V (425 hp)', + 'Engine Assembly' + ), + ( + 1521, + 16, + 'Quadrajet 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 1522, + 3, + '396 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 396 4V (360 hp)', + 'Engine Assembly' + ), + ( + 1523, + 3, + '427 4V (390 hp) L36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine L36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '396 4V (390 hp) L36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 4V (390 hp)', + 'Engine Assembly' + ), + ( + 1524, + 3, + '427 4V (425 hp) L72', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine L72', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 4V (425 hp) L72', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 4V (425 hp)', + 'Engine Assembly' + ), + ( + 1525, + 3, + '427 3x2V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 3x2V (400 hp)', + 'Engine Assembly' + ), + ( + 1526, + 3, + '427 4V (430 hp) L88', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine all-aluminum engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 4V (430 hp) L88', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 4V (430 hp) L88', + 'Engine Assembly' + ), + ( + 1527, + 3, + '427 3x2V (435 hp) L89', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet all-aluminum engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 3x2V (435 hp) L89', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 3x2V (435 hp) L89', + 'Engine Assembly' + ), + ( + 1528, + 3, + '427 3x2V (435 hp) L71', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 3x2V (435 hp) L71', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 427 3x2V (435 hp) L71', + 'Engine Assembly' + ), + ( + 1529, + 3, + '402 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet 400 L35 engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '402 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 402 4V (325 hp)', + 'Engine Assembly' + ), + ( + 1530, + 3, + '402-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '402', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 402', + 'Engine Block' + ), + ( + 1531, + 3, + '454 4V (345 hp) LS4', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine; low performance model for full-size cars', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (345 hp) LS4', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (345 hp) LS4', + 'Engine Assembly' + ), + ( + 1532, + 3, + '454 4V (360 hp) LS5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine; Chevelle version of the medium-performance big-block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (360 hp) LS5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (360 hp) LS5', + 'Engine Assembly' + ), + ( + 1533, + 3, + '454 4V (390 hp) LS5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine; Corvette version of the medium-performance big-block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (390 hp) LS5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (390 hp) LS5', + 'Engine Assembly' + ), + ( + 1534, + 3, + '454 4V (425 hp) LS6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine; Corvette version of the high-performance big-block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (425 hp) LS6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (425 hp) LS6', + 'Engine Assembly' + ), + ( + 1535, + 3, + '454 4V (450 hp) LS6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine; Chevelle version of the high-performance big-block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (450 hp) LS6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (450 hp) LS6', + 'Engine Assembly' + ), + ( + 1536, + 3, + '454 4V (465 hp) LS7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet Engine phantom engine; never actually produced', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '454 4V (465 hp) LS7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 454 4V (465 hp) LS7', + 'Engine Assembly' + ), + ( + 1537, + 5, + '455 2V (310 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 2V (310 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 2V (310 hp)', + 'Engine Assembly' + ), + ( + 1538, + 1, + '18 x 6.4 Bias Belted Wheel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '18 x 6.4 Bias Belted Wheel', + 'Wheel Assemblies' + ), + ( + 1539, + 5, + '455 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 4V (365 hp)', + 'Engine Assembly' + ), + ( + 1540, + 5, + '455 4V (375 hp) A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 4V (375 hp) A', + 'Engine Assembly' + ), + ( + 1541, + 5, + '455 4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8; 1968 Hurst', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 4V (390 hp)', + 'Engine Assembly' + ), + ( + 1542, + 5, + '455 4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 455 4V (400 hp)', + 'Engine Assembly' + ), + ( + 1543, + 5, + '400 4V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 400 4V (345 hp)', + 'Engine Assembly' + ), + ( + 1544, + 22, + 'AFB 4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AFB 4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AFB 4V (400 cfm) Carb', + 'Carburetor' + ), + ( + 1545, + 5, + '400 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 400 4V (350 hp)', + 'Engine Assembly' + ), + ( + 1546, + 5, + '400 3x2V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 3x2V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 400 3x2V (365 hp)', + 'Engine Assembly' + ), + ( + 1547, + 5, + '400 2V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 2V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 400 2V (300 hp)', + 'Engine Assembly' + ), + ( + 1548, + 5, + '400 4V W30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rocket V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V W30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB 400 4V W30', + 'Engine Assembly' + ), + ( + 1549, + 14, + 'Hilborn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hilborn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Hilborn Air Scoop 4%', + 'Air Scoop' + ), + ( + 1550, + 7, + '389 2V (215 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'baseline Strato-Streak engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 2V (215 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 2V (215 hp)', + 'Engine Assembly' + ), + ( + 1551, + 7, + '389 2V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strato-Streak baseline engine for use with manual transmissions', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 2V (245 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 2V (245 hp)', + 'Engine Assembly' + ), + ( + 1552, + 7, + '389 4V (260 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strato-Streak baseline engine for use with manual transmissions', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 4V (260 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 4V (260 hp)', + 'Engine Assembly' + ), + ( + 1553, + 7, + '389 2V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 2V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 2V (280 hp)', + 'Engine Assembly' + ), + ( + 1554, + 7, + '389 4V (303 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 4V (303 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 4V (303 hp)', + 'Engine Assembly' + ), + ( + 1555, + 7, + '389 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 Trophy 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1556, + 7, + '389 3x2V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 3x2V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 Trophy 3x2V (315 hp)', + 'Engine Assembly' + ), + ( + 1557, + 7, + '389 SD 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 SD 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 SD 4V (330 hp)', + 'Engine Assembly' + ), + ( + 1558, + 7, + '389 SD 3x2V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'super duty race engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 SD 3x2V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 SD 3x2V (345 hp)', + 'Engine Assembly' + ), + ( + 1559, + 10, + 'F70 X 14', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'F70 X 14', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cuda F70 X 14', + 'Wheel Assemblies' + ), + ( + 1560, + 10, + 'F60 X 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'F60 X 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cuda F60 X 15', + 'Wheel Assemblies' + ), + ( + 1561, + 10, + 'G60 X 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'as installed on the AAR Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'G60 X 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AAR Cuda G60 X 15', + 'Wheel Assemblies' + ), + ( + 1562, + 7, + '389 3x2V (333 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 3x2V (333 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 Trophy 3x2V (333 hp)', + 'Engine Assembly' + ), + ( + 1563, + 7, + '389 4V (318 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 4V (318 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 Trophy 4V (318 hp)', + 'Engine Assembly' + ), + ( + 1564, + 7, + '389 SD 3x2V (363 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '389 SD 3x2V (363 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 389 SD 3x2V (363 hp)', + 'Engine Assembly' + ), + ( + 1565, + 0, + 'Generic Exh Assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Exh Assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Exh Assembly', + 'Exhaust Assembly' + ), + ( + 1566, + 7, + '421 SD 2x4V (373 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'over the counter version of the Super Duty engine for drag-strip use', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 SD 2x4V (373 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 SD 2x4V (373 hp)', + 'Engine Assembly' + ), + ( + 1567, + 7, + '421 4V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 4V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 4V (320 hp)', + 'Engine Assembly' + ), + ( + 1568, + 7, + '421 SD 2x4V (405 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'drag-strip Super Duty engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 SD 2x4V (405 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 SD 2x4V (405 hp)', + 'Engine Assembly' + ), + ( + 1569, + 7, + '421 HO 4V (353 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 HO 4V (353 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 HO 4V (353 hp)', + 'Engine Assembly' + ), + ( + 1570, + 7, + '421 HO 3x2V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 HO 3x2V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 HO 3x2V (370 hp)', + 'Engine Assembly' + ), + ( + 1571, + 7, + '421 SD 4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'stock car Super Duty engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 SD 4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 SD 4V (390 hp)', + 'Engine Assembly' + ), + ( + 1572, + 7, + '421 SD 2x4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'drag-strip Super Duty engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '421 SD 2x4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 421 SD 2x4V (410 hp)', + 'Engine Assembly' + ), + ( + 1573, + 7, + 'Wedge (12.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (12.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Wedge (12.0) CH', + 'Cylinder Head' + ), + ( + 1574, + 7, + 'Wedge (13.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (13.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Wedge (13.0) CH', + 'Cylinder Head' + ), + ( + 1575, + 7, + '400 2V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 2V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 2V (255 hp)', + 'Engine Assembly' + ), + ( + 1576, + 7, + '400 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 4V (290 hp)', + 'Engine Assembly' + ), + ( + 1577, + 7, + '400 Ram Air I (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'as installed on the 1967 Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air I (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 Ram Air I (325 hp)', + 'Engine Assembly' + ), + ( + 1578, + 14, + 'MegaScoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'MegaScoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley MegaScoop Air Scoop 5%', + 'Air Scoop' + ), + ( + 1579, + 7, + '400 Ram Air II (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V; as installed on the 1968 Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air II (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 Ram Air II', + 'Engine Assembly' + ), + ( + 1580, + 7, + 'Ram Air II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air II Cylinder Head', + 'Cylinder Head' + ), + ( + 1581, + 7, + '400 Ram Air IV (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'as installed on the 1970 Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air IV (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 Ram Air IV (345 hp)', + 'Engine Assembly' + ), + ( + 1582, + 7, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air IV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air IV Piston', + 'Pistons' + ), + ( + 1583, + 7, + '455 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 455 4V (360 hp)', + 'Engine Assembly' + ), + ( + 1584, + 7, + '455 4V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 4V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 455 4V (370 hp)', + 'Engine Assembly' + ), + ( + 1585, + 7, + '455 HO 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 HO 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 455 HO 4V (335 hp)', + 'Engine Assembly' + ), + ( + 1586, + 7, + '455 SD 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'this is the (downrated) version that actually reached production', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '455 SD 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 455 SD 4V (290 hp)', + 'Engine Assembly' + ), + ( + 1587, + 1, + '292 4V (193 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used on manual transmission cars', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '292 4V (193 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 292 4V (193 hp)', + 'Engine Assembly' + ), + ( + 1588, + 1, + '292 4V (198 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used on automatic transmission cars', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '292 4V (198 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 292 4V (198 hp)', + 'Engine Assembly' + ), + ( + 1589, + 1, + '292 4V (212 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '292 4V (212 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 292 4V (212 hp)', + 'Engine Assembly' + ), + ( + 1590, + 1, + '312 4V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '312 4V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 312 4V (210 hp)', + 'Engine Assembly' + ), + ( + 1592, + 1, + '312 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '312 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 312 4V (225 hp)', + 'Engine Assembly' + ), + ( + 1593, + 1, + '312 2x4V (265 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '312 2x4V (265 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 312 2x4V (265 hp)', + 'Engine Assembly' + ), + ( + 1594, + 1, + '352 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '352 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 352 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1595, + 1, + '352 HP 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '352 HP 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 352 HP 4V (360 hp)', + 'Engine Assembly' + ), + ( + 1596, + 1, + '352 2V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '352 2V (220 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 352 2V (220 hp)', + 'Engine Assembly' + ), + ( + 1597, + 1, + '390 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1598, + 1, + '390 HP 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'thicker main-bearing webs and caps; additional reinforcing ribs; oil pressure relief', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 HP 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 HP 4V (375 hp)', + 'Engine Assembly' + ), + ( + 1599, + 1, + '390 HP 3x2V (401 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 HP 3x2V (401 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 HP 3x2V (401 hp)', + 'Engine Assembly' + ), + ( + 1600, + 14, + '3x2V (680 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (680 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 3x2V (680 cfm) Carb', + 'Carburetor' + ), + ( + 1601, + 1, + '390 PI 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Police Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 PI 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 PI 4V (330 hp)', + 'Engine Assembly' + ), + ( + 1602, + 1, + '390 3x2V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'detuned HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 3x2V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 3x2V (340 hp)', + 'Engine Assembly' + ), + ( + 1603, + 1, + '390 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 2V (250 hp)', + 'Engine Assembly' + ), + ( + 1604, + 1, + '390 2V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 2V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 2V (275 hp)', + 'Engine Assembly' + ), + ( + 1605, + 1, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 4V (315 hp)', + 'Engine Assembly' + ), + ( + 1606, + 1, + '390 GT 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'available for GT cars, 1966-1969', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 GT 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 390 GT 4V (335 hp)', + 'Engine Assembly' + ), + ( + 1607, + 1, + '406 4V (385 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '406 4V (385 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 406 4V (385 hp)', + 'Engine Assembly' + ), + ( + 1608, + 1, + '406 3x2V (405 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '406 3x2V (405 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 406 3x2V (405 hp)', + 'Engine Assembly' + ), + ( + 1609, + 14, + '4300 2x4V (1000 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4300 2x4V (1000 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4300 2x4V (1000 cfm) Carb', + 'Carburetor' + ), + ( + 1610, + 1, + '427 LR 4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 LR 4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 LR 4V (410 hp)', + 'Engine Assembly' + ), + ( + 1611, + 1, + '427 MR 4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'performance engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 MR 4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 MR 4V (410 hp)', + 'Engine Assembly' + ), + ( + 1612, + 1, + '427 MR 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'performance engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 MR 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 MR 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 1613, + 1, + 'Medium Riser (11.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Medium Riser (11.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Medium Riser (11.6) Cylinder Head', + 'Cylinder Head' + ), + ( + 1614, + 1, + '427 SOHC 4V (615 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'the ultimate configuration of the FE-series big-block engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '427 SOHC 4V (615 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 SOHC 4V (615 hp)', + 'Engine Assembly' + ), + ( + 1615, + 1, + 'Cammer Pop-up', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cammer Pop-up Piston', + 'Pistons' + ), + ( + 1616, + 1, + '428 4V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '428 4V (345 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 428 4V (345 hp)', + 'Engine Assembly' + ), + ( + 1617, + 1, + '428 4V (360 hp) PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Police Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '428 4V (360 hp) PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 428 4V (360 hp) PI', + 'Engine Assembly' + ), + ( + 1618, + 1, + '428 CJ 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '428 CJ 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 428 CJ 4V (335 hp)', + 'Engine Assembly' + ), + ( + 1619, + 1, + '428 SCJ 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Cobrajet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '428 SCJ 4V (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 428 SCJ 4V (335 hp)', + 'Engine Assembly' + ), + ( + 1620, + 1, + '260 2V (164 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '260 2V (164 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 260 2V (164 hp)', + 'Engine Assembly' + ), + ( + 1621, + 1, + '289 HP 4V (271 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289 HP 4V (271 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 289 HP 4V (271 hp)', + 'Engine Assembly' + ), + ( + 1622, + 1, + '289 4V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289 4V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 289 4V (210 hp)', + 'Engine Assembly' + ), + ( + 1623, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Flat Top CA Piston', + 'Pistons' + ), + ( + 1624, + 1, + 'Wedge (10.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Wedge/P (10.6) CH', + 'Cylinder Head' + ), + ( + 1625, + 1, + '289 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289 4V (225 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 289 4V (225 hp)', + 'Engine Assembly' + ), + ( + 1626, + 1, + '302 2V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302 2V (210 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302 2V (210 hp)', + 'Engine Assembly' + ), + ( + 1627, + 1, + '302 4V (230 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302 4V (230 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302 4V (230 hp)', + 'Engine Assembly' + ), + ( + 1628, + 1, + '302 Boss 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '290 hp', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302 Boss 4V (290 hp)', + 'Engine Assembly' + ), + ( + 1629, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss FAL Piston', + 'Pistons' + ), + ( + 1630, + 1, + '351W 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351W 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 351W 2V (250 hp)', + 'Engine Assembly' + ), + ( + 1631, + 1, + '351W 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351W 4V (290 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 351W 4V (290 hp)', + 'Engine Assembly' + ), + ( + 1632, + 1, + '351W 2V (240 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351W 2V (240 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 351W 2V (240 hp)', + 'Engine Assembly' + ), + ( + 1633, + 1, + '351 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C; two-barrel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 2V (250 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C 2V (250 hp)', + 'Engine Assembly' + ), + ( + 1634, + 1, + '351 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C; higher compression', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 4V (300 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C 4V (300 hp)', + 'Engine Assembly' + ), + ( + 1635, + 1, + '351 CJ 4V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'open chamber heads with large valves', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 CJ 4V (280 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C CJ 4V (280 hp)', + 'Engine Assembly' + ), + ( + 1636, + 1, + '351 Boss 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'available only on 1971 Boss 351 Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 Boss 4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C Boss 4V (330 hp)', + 'Engine Assembly' + ), + ( + 1637, + 1, + '351 HO 4V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'renamed and modified Boss 351', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 HO 4V (275 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C HO 4V (275 hp)', + 'Engine Assembly' + ), + ( + 1638, + 1, + '351 2V (177 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C; two-barrel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '351 2V (177 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 351C 2V (177 hp)', + 'Engine Assembly' + ), + ( + 1639, + 1, + '400 2V (260 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'basically a stopgap engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 2V (260 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 400C 2V (260 hp)', + 'Engine Assembly' + ), + ( + 1640, + 1, + '400 2V (172 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'basically a stopgap engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 2V (172 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 400C 2V (172 hp)', + 'Engine Assembly' + ), + ( + 1641, + 1, + '429 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'optional engine on Ford and Mercury cars from 1968-1973', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 4V (360 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 4V (360 hp)', + 'Engine Assembly' + ), + ( + 1642, + 1, + '429 2V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'optional engine on Ford and Mercury cars from 1968-1973', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 2V (320 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 2V (320 hp)', + 'Engine Assembly' + ), + ( + 1643, + 1, + '429 SCJ 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Cobrajet; available on Ford and Mercury performance intermediates', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 SCJ 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 SCJ 4V (375 hp)', + 'Engine Assembly' + ), + ( + 1644, + 1, + '429 CJ 4V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cobrajet; available on Ford and Mercury performance intermediates', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 CJ 4V (370 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 CJ 4V (370 hp)', + 'Engine Assembly' + ), + ( + 1645, + 1, + '429 4V (212 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'lower compression engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 4V (212 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 4V (212 hp)', + 'Engine Assembly' + ), + ( + 1646, + 1, + '429 NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'race version of the 429 Boss engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429 NASCAR', + 'Engine Assembly' + ), + ( + 1647, + 1, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 NASCAR Head', + 'Cylinder Head' + ), + ( + 1648, + 1, + '460 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '460 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 460 4V (365 hp)', + 'Engine Assembly' + ), + ( + 1649, + 1, + '460 4V (224 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '460 4V (224 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 460 4V (224 hp)', + 'Engine Assembly' + ), + ( + 1650, + 1, + '460 PI 4V (274 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'police interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '460 PI 4V (274 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 460 PI 4V (274 hp)', + 'Engine Assembly' + ), + ( + 1651, + 8, + '383 2V (305 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '383 2V (305 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 383 2V (305 hp)', + 'Engine Assembly' + ), + ( + 1652, + 8, + '383 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '383 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 383 4V (325 hp)', + 'Engine Assembly' + ), + ( + 1653, + 8, + '383 2V (270 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '383 2V (270 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 383 2V (270 hp)', + 'Engine Assembly' + ), + ( + 1654, + 8, + '383 2x4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1960 Super D-500 Package', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (330 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 383 2x4V (330 hp)', + 'Engine Assembly' + ), + ( + 1655, + 8, + '383-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '383', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 383-V8', + 'Engine Block' + ), + ( + 1656, + 8, + '400 2V (190 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 2V (190 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 400 2V (190 hp)', + 'Engine Assembly' + ), + ( + 1657, + 8, + '400 4V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V (255 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 400 4V (255 hp)', + 'Engine Assembly' + ), + ( + 1658, + 8, + '400 4V (205 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400 4V (205 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 400 4V (205 hp)', + 'Engine Assembly' + ), + ( + 1659, + 8, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 400-V8', + 'Engine Block' + ), + ( + 1660, + 8, + '413 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '413 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 4V (350 hp)', + 'Engine Assembly' + ), + ( + 1661, + 8, + '413 2x4V (380 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '413 2x4V (380 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 2x4V (380 hp)', + 'Engine Assembly' + ), + ( + 1662, + 8, + '413 Long Ram 2x4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Long Ram 413', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 Long Ram 2x4V (375 hp)', + 'Engine Assembly' + ), + ( + 1663, + 8, + '413 Short Ram 2x4V (400 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Short Ram 413', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 Short Ram 2x4V (400 hp)', + 'Engine Assembly' + ), + ( + 1664, + 8, + '413 Max Wedge 2x4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'officially known as the RamCharger 413 or Super Stock 413', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge 2x4V (410 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 Max Wedge 2x4V (410 hp)', + 'Engine Assembly' + ), + ( + 1665, + 8, + '413 Max Wedge 2x4V (420 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'officially known as the RamCharger 413 or Super Stock 413', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge 2x4V (420 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 Max Wedge 2x4V (420 hp)', + 'Engine Assembly' + ), + ( + 1666, + 8, + '413 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '413 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 4V (365 hp)', + 'Engine Assembly' + ), + ( + 1667, + 8, + '413 2x4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '413 2x4V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413 2x4V (390 hp)', + 'Engine Assembly' + ), + ( + 1668, + 8, + '426 Max Wedge III 2x4V (415 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III 2x4V (415 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426 Max Wedge III 2x4V (415 hp)', + 'Engine Assembly' + ), + ( + 1669, + 8, + '426 Max Wedge III 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426 Max Wedge III 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 1670, + 8, + '413-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '413', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 413-V8', + 'Engine Block' + ), + ( + 1671, + 8, + 'Max Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1672, + 8, + '426 Max Wedge 2x4V (415 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge 2x4V (415 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426 Max Wedge 2x4V (415 hp)', + 'Engine Assembly' + ), + ( + 1673, + 8, + '426 Max Wedge 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge 2x4V (425 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426 Max Wedge 2x4V (425 hp)', + 'Engine Assembly' + ), + ( + 1674, + 8, + '426 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used mostly on trucks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '426 4V (365 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 426 4V (365 hp)', + 'Engine Assembly' + ), + ( + 1675, + 8, + 'Max Wedge III (12.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III (12.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge III (12.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 1676, + 8, + '440 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'non-performance engine for use on heavy passenger cars', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440 4V (350 hp)', + 'Engine Assembly' + ), + ( + 1677, + 8, + '440 3x2V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'known as the "Six Pack" or "Six Barrel" engine; used on the ''Cuda, Road Runner, and Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (390 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440 3x2V (390 hp)', + 'Engine Assembly' + ), + ( + 1678, + 87, + 'Wedge Top (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + ' Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top Piston', + 'Pistons' + ), + ( + 1679, + 11, + '343 2V (235 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '343 2V (235 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 343 2V (235 hp)', + 'Engine Assembly' + ), + ( + 1680, + 11, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (315 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 390 4V (315 hp)', + 'Engine Assembly' + ), + ( + 1681, + 11, + '390 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (325 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 390 4V (325 hp)', + 'Engine Assembly' + ), + ( + 1682, + 11, + '390 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rebel Machine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 4V (340 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 390 4V Rebel Machine (340 hp)', + 'Engine Assembly' + ), + ( + 1683, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Flat Top CA Piston', + 'Pistons' + ), + ( + 1684, + 11, + 'Rebel Machine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rebel Machine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Rebel Machine Dual', + 'Exhaust Manifold' + ), + ( + 1685, + 13, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Chevrolet BB Exhaust Headers', + 'Exhaust Manifold' + ), + ( + 1687, + 0, + 'Big Tire (Mod)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stunt Tire', + 'Tires' + ), + ( + 1716, + 71, + '9 x 2 Organic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Organic Disk Brake', + 'Brakes' + ), + ( + 1717, + 71, + '9 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Organic HT Disk Brakes', + 'Brakes' + ), + ( + 1718, + 71, + '9 x 2 Organic Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Organic Drum Brake', + 'Brakes' + ), + ( + 1719, + 71, + '9 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Organic HT Drum Brake', + 'Brakes' + ), + ( + 1720, + 72, + '12 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Organic HT Drum Brake', + 'Brakes' + ), + ( + 1721, + 72, + '12 x 2 SM Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 12 x 2 Semi-Metallic Drum Brake', + 'Brakes' + ), + ( + 1722, + 73, + '10 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10 x 2 Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 10 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 1723, + 73, + '12 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12 x 2 ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 12 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 1724, + 73, + '14 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 1725, + 73, + '16 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '16 x 2 Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 16 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 1726, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock Camshaft', + 'Camshaft' + ), + ( + 1727, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock Camshaft', + 'Camshaft' + ), + ( + 1728, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock Camshaft', + 'Camshaft' + ), + ( + 1729, + 13, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer RPM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer RPM Chrysler SB HP Camshaft', + 'Camshaft' + ), + ( + 1730, + 77, + 'TorqueMaster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TorqueMaster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Reed TorqueMaster Chrysler SB HP Camshaft', + 'Camshaft' + ), + ( + 1731, + 77, + 'XLH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'XLH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Reed XLH Chrysler SB DP Camshaft', + 'Camshaft' + ), + ( + 1732, + 21, + 'Sat. Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Saturday Night Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Saturday Night Special DP Chrysler SB Camshaft', + 'Camshaft' + ), + ( + 1733, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax HP Chrysler SB Camshaft', + 'Camshaft' + ), + ( + 1734, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Ford SB Connecting Rod', + 'Connecting Rods' + ), + ( + 1735, + 74, + 'Maxi-Light 93', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Maxi-Light 93', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Maxi-Light 93 Ford SB Connecting Rod', + 'Connecting Rods' + ), + ( + 1736, + 30, + 'Street Racer Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Racer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Street Racer Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 1737, + 30, + 'Performance Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Performance Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 1738, + 30, + 'Street Shaker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shaker', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hooker Street Shaker Muffler', + 'Muffler' + ), + ( + 1739, + 46, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bully HD Lubrication System', + 'Lubrication System' + ), + ( + 1740, + 43, + 'HD (0.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD (0.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance HD (0.36) Shock', + 'Shocks' + ), + ( + 1742, + 71, + 'Generic Visible Parts Assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Visible Parts Assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Visible Parts Assembly', + 'Visibile Parts' + ), + ( + 1743, + 97, + '245/50/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 245/50/16ZR High Performance', + 'Tires' + ), + ( + 1746, + 17, + 'T56 6-Speed Automatic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T56', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Borg-Warner T56 6 Speed Automatic', + 'Transmission' + ), + ( + 1752, + 73, + '11 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '11 x 2 ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 11 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 1763, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Flat Top Piston', + 'Pistons' + ), + ( + 1764, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Flat Top Piston', + 'Pistons' + ), + ( + 1765, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Flat Top Piston', + 'Pistons' + ), + ( + 1766, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Flat Top Piston', + 'Pistons' + ), + ( + 1767, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Flat Top Piston', + 'Pistons' + ), + ( + 1768, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Flat Top Piston', + 'Pistons' + ), + ( + 1769, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Flat Top CA Piston', + 'Pistons' + ), + ( + 1770, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Flat Top CA Piston', + 'Pistons' + ), + ( + 1771, + 3, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Flat Top Forged Aluminum Piston', + 'Pistons' + ), + ( + 1772, + 6, + 'Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stage I Piston', + 'Pistons' + ), + ( + 1773, + 6, + 'Stage II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage II', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stage II Piston', + 'Pistons' + ), + ( + 1774, + 7, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Flat Top Forged Aluminum Piston', + 'Pistons' + ), + ( + 1775, + 1, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Flat Top Forged Aluminum Piston', + 'Pistons' + ), + ( + 1776, + 8, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Flat Top Forged Aluminum Piston', + 'Pistons' + ), + ( + 1777, + 3, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Domed Top (0.75) FA Piston', + 'Pistons' + ), + ( + 1778, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Ford SB Piston', + 'Pistons' + ), + ( + 1779, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Chevrolet SB Piston', + 'Pistons' + ), + ( + 1780, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Chevrolet BB Piston', + 'Pistons' + ), + ( + 1781, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Buick BB Piston', + 'Pistons' + ), + ( + 1782, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Olds BB Piston', + 'Pistons' + ), + ( + 1783, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Domed Top Chevrolet SB Piston', + 'Pistons' + ), + ( + 1784, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Domed Top Chevrolet BB Piston', + 'Pistons' + ), + ( + 1785, + 41, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top Forged', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Wedge Top Chrysler BB Piston', + 'Pistons' + ), + ( + 1786, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Domed Top Chrysler BB Piston', + 'Pistons' + ), + ( + 1787, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Domed Top Buick BB Piston', + 'Pistons' + ), + ( + 1788, + 41, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Domed Top Olds BB Piston', + 'Pistons' + ), + ( + 1789, + 1, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Dual Plane Aluminum IM', + 'Intake Manifold' + ), + ( + 1790, + 1, + 'Single Plane Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Single Plane Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Single Plane Aluminum IM', + 'Intake Manifold' + ), + ( + 1791, + 63, + '4V (350 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (350 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4V (350 cfm)', + 'Carburetor' + ), + ( + 1792, + 63, + '4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4V (400 cfm)', + 'Carburetor' + ), + ( + 1793, + 14, + '4100 4V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (780 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4100 4V (780 cfm)', + 'Carburetor' + ), + ( + 1794, + 3, + 'Corvette Cross-Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cross-Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Corvette Cross-Fire Fuel Injection', + 'Carburetor' + ), + ( + 1795, + 14, + '4100 4V (850 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (850 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4100 4V (850 cfm)', + 'Carburetor' + ), + ( + 1796, + 4, + 'EFI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'EFI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac EFI', + 'Carburetor' + ), + ( + 1797, + 4, + 'Tri-Pwr 3x2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Power 3x2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac Tri-Power 3x2V (600 cfm)', + 'Carburetor' + ), + ( + 1798, + 16, + 'Tri-Pwr 3x2V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Power 3x2V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Tri-Power 3x2V (650 cfm)', + 'Carburetor' + ), + ( + 1799, + 3, + 'T- Thrust 4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo Thrust 4V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Turbo Thrust 4V (400 cfm)', + 'Carburetor' + ), + ( + 1800, + 14, + '4300 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4300 2x4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4300 2x4V (800 cfm)', + 'Carburetor' + ), + ( + 1801, + 14, + '4100 4V (735 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (735 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4100 4V (735 cfm)', + 'Carburetor' + ), + ( + 1802, + 22, + 'AVS 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AVS 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AVS 4V (600 cfm)', + 'Carburetor' + ), + ( + 1803, + 63, + '4100 4V (480 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (480 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4100 4V (480 cfm)', + 'Carburetor' + ), + ( + 1804, + 63, + '4100 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4100 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4100 4V (600 cfm)', + 'Carburetor' + ), + ( + 1805, + 63, + '4300 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4300 4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4300 4V (600 cfm)', + 'Carburetor' + ), + ( + 1806, + 63, + '4300D 4V (715 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4300D 4V (715 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 4300D 4V (715 cfm)', + 'Carburetor' + ), + ( + 1807, + 14, + '3x2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 3x2V (600 cfm)', + 'Carburetor' + ), + ( + 1808, + 14, + '4160 4V (1000 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4160 4V (1000 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 4160 4V (1000 cfm)', + 'Carburetor' + ), + ( + 1809, + 63, + '2100 2V (356 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2100 2V (356 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 2100 2V (356 cfm)', + 'Carburetor' + ), + ( + 1810, + 63, + '2100 2V (424 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2100 2V (424 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 2100 2V (424 cfm)', + 'Carburetor' + ), + ( + 1811, + 16, + 'Quadrajet 4V (715 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 4V (715 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 4V (715 cfm)', + 'Carburetor' + ), + ( + 1812, + 14, + 'Dominator 2V (550 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2V (550 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2V (550 cfm)', + 'Carburetor' + ), + ( + 1813, + 14, + 'Dominator 2V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2V (650 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2V (650 cfm)', + 'Carburetor' + ), + ( + 1814, + 14, + 'Dominator 2V (675 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2V (675 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2V (675 cfm)', + 'Carburetor' + ), + ( + 1815, + 14, + 'Dominator 4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 4V (1050 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 4V (1050 cfm)', + 'Carburetor' + ), + ( + 1816, + 14, + 'Dominator 4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 4V (1150 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 4V (1150 cfm)', + 'Carburetor' + ), + ( + 1817, + 14, + 'Dominator 2x4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2x4V (1150 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2x4V (1150 cfm)', + 'Carburetor' + ), + ( + 1818, + 14, + 'Dominator 2x4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 2x4V (1250 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 2x4V (1250 cfm)', + 'Carburetor' + ), + ( + 1819, + 14, + 'Dominator 4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator 4V (1250 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator 4V (1250 cfm)', + 'Carburetor' + ), + ( + 1820, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock Rod', + 'Connecting Rods' + ), + ( + 1821, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock FS Rod', + 'Connecting Rods' + ), + ( + 1822, + 4, + 'Stock BB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1823, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1824, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1825, + 8, + 'Stock Rod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1826, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1827, + 1, + 'Stock Rod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1828, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1829, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock CI Rod', + 'Connecting Rods' + ), + ( + 1830, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Stock FS Rod', + 'Connecting Rods' + ), + ( + 1831, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Stock Rod', + 'Connecting Rods' + ), + ( + 1832, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used on the larger-displacement engines', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 FS Rod', + 'Connecting Rods' + ), + ( + 1833, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock FS Rod', + 'Connecting Rods' + ), + ( + 1834, + 1, + 'Le Mans Capscrew', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Le Mans Capscrew', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB LeMans Capscrew Rod', + 'Connecting Rods' + ), + ( + 1835, + 1, + 'PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB PI Rod', + 'Connecting Rods' + ), + ( + 1836, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss Rod', + 'Connecting Rods' + ), + ( + 1837, + 1, + '820-S', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '820-S', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss 820-S Rod', + 'Connecting Rods' + ), + ( + 1838, + 1, + '820-T', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '820-T', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss 820-T Rod', + 'Connecting Rods' + ), + ( + 1839, + 8, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB HD FS Rod', + 'Connecting Rods' + ), + ( + 1840, + 74, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Sportsman Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1841, + 74, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman Chevrolet SB Connecting Rod', + 'Connecting Rods' + ), + ( + 1842, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1843, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1844, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Buick BB Rod', + 'Connecting Rods' + ), + ( + 1845, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Olds BB Rod', + 'Connecting Rods' + ), + ( + 1846, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Pontiac Rod', + 'Connecting Rods' + ), + ( + 1847, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Ford BB Rod', + 'Connecting Rods' + ), + ( + 1848, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Pontiac Rod', + 'Connecting Rods' + ), + ( + 1849, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Olds BB Rod', + 'Connecting Rods' + ), + ( + 1850, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Ford BB Rod', + 'Connecting Rods' + ), + ( + 1851, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1852, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1853, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Buick BB Rod', + 'Connecting Rods' + ), + ( + 1854, + 74, + 'Maxi-Light 93', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Maxi-Light 93', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Maxi-Light 93 Billet Steel Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1855, + 74, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Titanium Buick BB Connecting Rod', + 'Connecting Rods' + ), + ( + 1856, + 74, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Titanium Chevrolet BB Connecting Rod', + 'Connecting Rods' + ), + ( + 1857, + 74, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Titanium Chevrolet BB Connecting Rod', + 'Connecting Rods' + ), + ( + 1858, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Pontiac Rod', + 'Connecting Rods' + ), + ( + 1859, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Chrysler BB Rod', + 'Connecting Rods' + ), + ( + 1860, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Ford SB Rod', + 'Connecting Rods' + ), + ( + 1861, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Ford BB Rod', + 'Connecting Rods' + ), + ( + 1862, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1863, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1864, + 58, + 'Pro Mod BB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Mod Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1865, + 58, + 'Pro Mod SB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Mod Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1866, + 58, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Billet Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1867, + 58, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Billet Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1868, + 58, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Billet Ford SB Rod', + 'Connecting Rods' + ), + ( + 1869, + 58, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Street Race Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1870, + 58, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Street Race Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1871, + 58, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Street Race Ford SB Rod', + 'Connecting Rods' + ), + ( + 1872, + 58, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Forged Aluminum Chevrolet BB Rod', + 'Connecting Rods' + ), + ( + 1873, + 58, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Forged Aluminum Chevrolet SB Rod', + 'Connecting Rods' + ), + ( + 1874, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB StockTI Crankshaft', + 'Crankshaft' + ), + ( + 1875, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Stock TI Crankshaft', + 'Crankshaft' + ), + ( + 1876, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1877, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB FS Crankshaft', + 'Crankshaft' + ), + ( + 1878, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1879, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1880, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1881, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1882, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1883, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1884, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1885, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1886, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock TI Crankshaft', + 'Crankshaft' + ), + ( + 1887, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1888, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1889, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1890, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB Stock TI Crankshaft', + 'Crankshaft' + ), + ( + 1891, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 1892, + 7, + 'Armasteel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Armasteel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Armasteel (TI) Crankshaft', + 'Crankshaft' + ), + ( + 1893, + 7, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD FS Crankshaft', + 'Crankshaft' + ), + ( + 1894, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock TI Crankshaft', + 'Crankshaft' + ), + ( + 1895, + 1, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Truck FS Crankshaft', + 'Crankshaft' + ), + ( + 1896, + 1, + '427 MR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'MR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 427 MR FS Crankshaft', + 'Crankshaft' + ), + ( + 1897, + 1, + 'Police Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Police Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Police Interceptor (TI) Crankshaft', + 'Crankshaft' + ), + ( + 1898, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss FS Crankshaft', + 'Crankshaft' + ), + ( + 1899, + 1, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HD FS Crankshaft', + 'Crankshaft' + ), + ( + 1900, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1901, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi (FS) Crankshaft', + 'Crankshaft' + ), + ( + 1902, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock CI Crankshaft', + 'Crankshaft' + ), + ( + 1903, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Chevrolet BB Crankshaft', + 'Crankshaft' + ), + ( + 1904, + 74, + 'Ultra-Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultra-Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Ultra-Light Chevrolet BB Crankshaft', + 'Crankshaft' + ), + ( + 1905, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Ford SB Crankshaft', + 'Crankshaft' + ), + ( + 1906, + 74, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Standard Ford SB Crankshaft', + 'Crankshaft' + ), + ( + 1907, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Ford BB Crankshaft', + 'Crankshaft' + ), + ( + 1908, + 74, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Standard Ford BB Crankshaft', + 'Crankshaft' + ), + ( + 1909, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Chrysler BB Crankshaft', + 'Crankshaft' + ), + ( + 1910, + 74, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Enduro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Enduro Chrysler SB Crankshaft', + 'Crankshaft' + ), + ( + 1911, + 74, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Standard Chrysler BB Crankshaft', + 'Crankshaft' + ), + ( + 1912, + 74, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Standard Chrysler SB Crankshaft', + 'Crankshaft' + ), + ( + 1913, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1914, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1915, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock Valvetrain', + 'Valve Train' + ), + ( + 1916, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1918, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1919, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1920, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1921, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1922, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1923, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 1924, + 3, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1925, + 3, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1926, + 3, + 'SS Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB SS Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1927, + 7, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air V Mechanical Lifter Valvetrain', + 'Valve Train' + ), + ( + 1928, + 1, + 'Truck Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Truck Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1929, + 1, + 'Stock Mechanical Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Mechanical', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock Mechanical Lifter Valvetrain', + 'Valve Train' + ), + ( + 1930, + 1, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1931, + 1, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cammer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Cammer Valvetrain', + 'Valve Train' + ), + ( + 1932, + 1, + 'SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB SCJ Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1933, + 8, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid Lifter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 1934, + 8, + 'Stock Mechanical', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Mechanical', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock Mechanical Lifter Valvetrain', + 'Valve Train' + ), + ( + 1935, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1936, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Stock CI EM', + 'Exhaust Manifold' + ), + ( + 1937, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1938, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1939, + 8, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1940, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'light; known to have cracking problems', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Stock CI EM', + 'Exhaust Manifold' + ), + ( + 1941, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1942, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1943, + 5, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1944, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'log-type cast iron exhaust manifold with outlets toward the rear of the engine, pointing downward', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 1945, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock CI EM', + 'Exhaust Manifold' + ), + ( + 1946, + 3, + 'Ram''s Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram''s Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Ram''s Horn EM', + 'Exhaust Manifold' + ), + ( + 1947, + 6, + 'Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stage I EM', + 'Exhaust Manifold' + ), + ( + 1948, + 6, + 'Mickey Thompson Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mickey Thompson', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Mickey Thompson Headers', + 'Exhaust Manifold' + ), + ( + 1949, + 5, + 'Divider', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Divider', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Divider EM', + 'Exhaust Manifold' + ), + ( + 1950, + 7, + 'Ram Air I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air I EM', + 'Exhaust Manifold' + ), + ( + 1951, + 7, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac HP EM', + 'Exhaust Manifold' + ), + ( + 1952, + 1, + 'Stock 312', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y 1957 Manifold', + 'Exhaust Manifold' + ), + ( + 1953, + 1, + 'CJ/SCJ HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'CJ/SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB CJ/SCJ HP EM', + 'Exhaust Manifold' + ), + ( + 1954, + 1, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 NASCAR EM', + 'Exhaust Manifold' + ), + ( + 1955, + 8, + 'Max Wedge I Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge I Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge I Headers', + 'Exhaust Manifold' + ), + ( + 1956, + 8, + '440 Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440 Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440 Stock EM', + 'Exhaust Manifold' + ), + ( + 1957, + 8, + 'Tri-Y Max Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Y Max Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Tri-Y Max Wedge EM', + 'Exhaust Manifold' + ), + ( + 1958, + 8, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB HP EM', + 'Exhaust Manifold' + ), + ( + 1959, + 8, + 'Improved Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Improved Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Improved Flow EM', + 'Exhaust Manifold' + ), + ( + 1961, + 3, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W (10.25) 1.94i/1.65e CH', + 'Cylinder Head' + ), + ( + 1962, + 1, + 'Boss 351 (11.7) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 351 (11.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Boss 351 (11.7) CH', + 'Cylinder Head' + ), + ( + 1963, + 1, + 'Domed Top (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Domed Top (.5) Piston', + 'Pistons' + ), + ( + 1965, + 6, + 'Nailhead Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Wedge (8.5)', + 'Cylinder Head' + ), + ( + 1966, + 1, + 'HP (10.5) Large Valve', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP (10.5) Large Valve', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (10.5) LV HP Wedge CH', + 'Cylinder Head' + ), + ( + 1968, + 6, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Wedge (8.5)', + 'Cylinder Head' + ), + ( + 1969, + 6, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Wedge (8.5)', + 'Cylinder Head' + ), + ( + 1970, + 6, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Wedge (9.0)', + 'Cylinder Head' + ), + ( + 1971, + 6, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Wedge (10.25)', + 'Cylinder Head' + ), + ( + 1972, + 4, + 'Stock (9.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock (9.1)', + 'Cylinder Head' + ), + ( + 1973, + 4, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock (10.5) W CH', + 'Cylinder Head' + ), + ( + 1974, + 3, + 'Wedge (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (8.0)', + 'Cylinder Head' + ), + ( + 1975, + 3, + 'Wedge (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (9.25)', + 'Cylinder Head' + ), + ( + 1976, + 3, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (10.5)', + 'Cylinder Head' + ), + ( + 1977, + 3, + 'Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (11.0)', + 'Cylinder Head' + ), + ( + 1978, + 3, + 'Wedge (11.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (11.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (11.25)', + 'Cylinder Head' + ), + ( + 1979, + 3, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (9.0)', + 'Cylinder Head' + ), + ( + 1980, + 3, + 'Canted (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Canted (10.25)', + 'Cylinder Head' + ), + ( + 1981, + 3, + ' ZL1 (12.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ZL1 (12.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Canted ZL1 (12.0)', + 'Cylinder Head' + ), + ( + 1982, + 3, + 'LS6 (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LS6 (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Canted LS6 (9.0)', + 'Cylinder Head' + ), + ( + 1983, + 5, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB (10.25) Stock CH', + 'Cylinder Head' + ), + ( + 1984, + 5, + 'W-31 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-31 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB (10.5) W-31 CH', + 'Cylinder Head' + ), + ( + 1985, + 5, + 'Stock (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB (10.5) Stock CH', + 'Cylinder Head' + ), + ( + 1986, + 5, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB (9.0) Stock CH', + 'Cylinder Head' + ), + ( + 1987, + 5, + '(10.25) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB (10.25) Stock CH', + 'Cylinder Head' + ), + ( + 1988, + 5, + 'W-30 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-30 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB (10.5) W-30 CH', + 'Cylinder Head' + ), + ( + 1989, + 7, + 'Wedge (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (8.6) Stock W CH', + 'Cylinder Head' + ), + ( + 1990, + 7, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.0) Stock W CH', + 'Cylinder Head' + ), + ( + 1991, + 7, + 'SD Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (11.0) SD W CH', + 'Cylinder Head' + ), + ( + 1992, + 7, + 'HO Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HO Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.75) HO W CH', + 'Cylinder Head' + ), + ( + 1993, + 7, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.5) W CH', + 'Cylinder Head' + ), + ( + 1994, + 7, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.25) W CH', + 'Cylinder Head' + ), + ( + 1995, + 7, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.0) Stock W CH', + 'Cylinder Head' + ), + ( + 1996, + 7, + 'SD Wedge (8.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Wedge (8.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (8.4) SD W CH', + 'Cylinder Head' + ), + ( + 1997, + 1, + 'Stock (7.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (7.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (7.6) Stock CH', + 'Cylinder Head' + ), + ( + 1998, + 1, + 'Stock (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.5) Stock CH', + 'Cylinder Head' + ), + ( + 1999, + 1, + 'Stock (8.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.1) Stock CH', + 'Cylinder Head' + ), + ( + 2000, + 1, + 'Stock (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.0) Stock CH', + 'Cylinder Head' + ), + ( + 2001, + 1, + 'Stock (8.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.4) Stock CH', + 'Cylinder Head' + ), + ( + 2002, + 1, + 'Stock (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.6) Stock CH', + 'Cylinder Head' + ), + ( + 2003, + 1, + 'Stock (9.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (9.7) Stock CH', + 'Cylinder Head' + ), + ( + 2004, + 1, + 'Stock (8.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.3) Stock CH', + 'Cylinder Head' + ), + ( + 2005, + 1, + 'Stock (8.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (8.8) Stock CH', + 'Cylinder Head' + ), + ( + 2006, + 1, + 'Stock (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y (9.6) Stock CH', + 'Cylinder Head' + ), + ( + 2007, + 1, + 'Wedge (12.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (12.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (12.1) Wedge CH', + 'Cylinder Head' + ), + ( + 2008, + 1, + 'Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (11.0) Wedge CH', + 'Cylinder Head' + ), + ( + 2009, + 1, + 'Wedge (10.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (10.1) Wedge CH', + 'Cylinder Head' + ), + ( + 2010, + 1, + 'Wedge (9.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (9.4) Wedge CH', + 'Cylinder Head' + ), + ( + 2011, + 1, + 'Canted (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland (9.5) CH', + 'Cylinder Head' + ), + ( + 2012, + 1, + 'HP Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Canted (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland (11.0) HP CH', + 'Cylinder Head' + ), + ( + 2013, + 1, + '(9.0) Canted CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland (9.0) CH', + 'Cylinder Head' + ), + ( + 2014, + 1, + 'Canted (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (8.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland (8.6) CH', + 'Cylinder Head' + ), + ( + 2016, + 1, + 'Canted (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Canted (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 (10.2) Canted CH', + 'Cylinder Head' + ), + ( + 2017, + 8, + 'Wedge (10.0) Lrg Port', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LP Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (10.0) Large Port W CH', + 'Cylinder Head' + ), + ( + 2018, + 8, + 'Wedge (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (9.6) W CH', + 'Cylinder Head' + ), + ( + 2019, + 8, + 'Wedge (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (9.2) W CH', + 'Cylinder Head' + ), + ( + 2020, + 8, + 'Wedge (8.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB (8.8) Stock W CH', + 'Cylinder Head' + ), + ( + 2021, + 8, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB (10.5) Stock W CH', + 'Cylinder Head' + ), + ( + 2022, + 8, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB (9.0) Stock W CH', + 'Cylinder Head' + ), + ( + 2023, + 8, + 'Wedge (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB (9.2) Stock W CH', + 'Cylinder Head' + ), + ( + 2024, + 1, + 'LR Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB LR Domed (0.4) Piston', + 'Pistons' + ), + ( + 2025, + 1, + 'Recessed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Recessed (-0.1) Piston', + 'Pistons' + ), + ( + 2026, + 8, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Wedge (0.1) Piston', + 'Pistons' + ), + ( + 2027, + 0, + 'Generic Suspension', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Suspension', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Suspension', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Suspension', + 'Chassis Assembly' + ), + ( + 2028, + 0, + 'Generic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Body', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Body', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Body', + 'Body Assembly' + ), + ( + 2029, + 0, + 'Generic Driveline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Driveline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Driveline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Driveline', + 'Driveline Assembly' + ), + ( + 2030, + 0, + 'Generic Brake Set', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Brake Set', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Brake Set', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Brake Set', + 'Brake Assembly' + ), + ( + 2031, + 0, + 'Generic Wheels', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Wheels', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Wheels', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Wheels', + 'Wheel Assembly' + ), + ( + 2032, + 0, + 'Generic Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic Engine', + 'Engine Assembly' + ), + ( + 2033, + 22, + '2V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter 2V (400 cfm) Carb', + 'Carburetor' + ), + ( + 2034, + 8, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (10.0) Wedge CH', + 'Cylinder Head' + ), + ( + 2035, + 8, + '440 Magnum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440 Magnum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB 440 Magnum IM', + 'Intake Manifold' + ), + ( + 2036, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2037, + 3, + 'Lrg Valve Wedg (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LV Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Large Valve Wedge (10.5) CH', + 'Cylinder Head' + ), + ( + 2038, + 22, + 'AFB 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AFB 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AFB 4V (500 cfm) Carb', + 'Carburetor' + ), + ( + 2039, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2040, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Flat Top Forged Aluminum Piston', + 'Pistons' + ), + ( + 2041, + 7, + 'Ram Air Induction', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air (3%) Induction System', + 'Air Scoop' + ), + ( + 2042, + 3, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (10.25) CH', + 'Cylinder Head' + ), + ( + 2043, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 2044, + 16, + 'Monojet 2V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monojet 2V (400 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Monojet 2V (400 cfm) Carb', + 'Carburetor' + ), + ( + 2045, + 16, + 'Q-Jet 2x4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 2x4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 2x4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 2046, + 3, + '265 4V (205 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB 265 4V (205 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 265 4V (205 hp)', + 'Engine Assembly' + ), + ( + 2047, + 16, + 'Quadrajet 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 4V (500 cfm) Carb', + 'Carburetor' + ), + ( + 2048, + 3, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Wedge (8.5) CH', + 'Cylinder Head' + ), + ( + 2049, + 16, + 'Ramjet F.I. RPO 579D', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ramjet RPO 579D', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Ramjet Fuel Injector RPO 579D', + 'Carburetor' + ), + ( + 2050, + 3, + 'Lrg Valve Wdge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Large Valve Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Large Valve Wedge (10.5) CH', + 'Cylinder Head' + ), + ( + 2051, + 3, + 'Lrg Valve Wdge (11.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Large Valve Wedge (11.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Large Valve Wedge (11.25) CH', + 'Cylinder Head' + ), + ( + 2052, + 3, + 'Z28 Recessed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Z28 Recessed Top Piston', + 'Pistons' + ), + ( + 2053, + 3, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB CI/HP EM', + 'Exhaust Manifold' + ), + ( + 2054, + 3, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB 400 FS Rod', + 'Connecting Rods' + ), + ( + 2055, + 3, + '(10.25) HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W (10.25) 2.19i/1.73e CH', + 'Cylinder Head' + ), + ( + 2056, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Recessed (-0.75) CA Piston', + 'Pistons' + ), + ( + 2057, + 3, + 'Domed Top HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Domed Top (1.0) FA HP Piston', + 'Pistons' + ), + ( + 2058, + 3, + 'HD FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W HD FS Rod', + 'Connecting Rods' + ), + ( + 2059, + 3, + 'Recessed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Recessed (-0.25) FA Piston', + 'Pistons' + ), + ( + 2060, + 3, + 'L36 Canted (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L36 Canted (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB L36 Canted/Pocket (10.25) CH', + 'Cylinder Head' + ), + ( + 2061, + 3, + '402 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet 400 L34 engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB 402 4V (350 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 402 4V (350 hp)', + 'Engine Assembly' + ), + ( + 2062, + 3, + '402 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Turbo-Jet 400 L78 engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '402 4V (375 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB 402 4V (375 hp)', + 'Engine Assembly' + ), + ( + 2063, + 3, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Wedge Top (0.25) FA Piston', + 'Pistons' + ), + ( + 2064, + 16, + 'Monojet 2V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monojet 2V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Monojet 2V (500 cfm) Carb', + 'Carburetor' + ), + ( + 2065, + 5, + 'HP Hurst', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP Hurst', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB HP Camshaft', + 'Camshaft' + ), + ( + 2066, + 5, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Wedge Top (0.25) FA Piston', + 'Pistons' + ), + ( + 2067, + 5, + 'W30 Forced Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W30 Forced Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W30 Forced Air Induction System', + 'Air Scoop' + ), + ( + 2068, + 7, + 'm/t Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac m/t Stock (HP) Camshaft', + 'Camshaft' + ), + ( + 2069, + 16, + 'Monojet 2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monojet 2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Monojet 2V (600 cfm)', + 'Carburetor' + ), + ( + 2070, + 7, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.25) Stock W CH', + 'Cylinder Head' + ), + ( + 2071, + 16, + 'Quadrajet 4V (660 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quadrajet 4V (660 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester Quadrajet 4V (660 cfm)', + 'Carburetor' + ), + ( + 2072, + 7, + 'Trophy (HP)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Trophy (HP) Camshaft', + 'Camshaft' + ), + ( + 2073, + 7, + 'Trophy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Trophy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Trophy HP CI EM', + 'Exhaust Manifold' + ), + ( + 2074, + 7, + 'SD Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD Aluminum IM', + 'Intake Manifold' + ), + ( + 2075, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Flat Top FA Piston', + 'Pistons' + ), + ( + 2076, + 7, + 'Wedge SD (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge SD (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD (10.75) W/P CH', + 'Cylinder Head' + ), + ( + 2077, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 Mechanical Lifter Valvetrain', + 'Valve Train' + ), + ( + 2078, + 7, + 'Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (10.75) W CH', + 'Cylinder Head' + ), + ( + 2079, + 7, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD Mechanical Lifter Valvetrain', + 'Valve Train' + ), + ( + 2080, + 7, + 'SD Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac SD Aluminum Single Plane IM', + 'Intake Manifold' + ), + ( + 2081, + 7, + 'SD Large Valve (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Large Valve (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (11.0) SD 2.02i/1.76e W CH', + 'Cylinder Head' + ), + ( + 2082, + 7, + '400 Ram Air III (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'as installed on the 1969 Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air III (335 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 400 Ram Air III (335 hp)', + 'Engine Assembly' + ), + ( + 2083, + 7, + '400 Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'planned for installation on the 1970 Firebird, but never actually made it into production', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB 400 Ram Air V', + 'Engine Assembly' + ), + ( + 2084, + 7, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ram Air V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Ram Air V Cylinder Head', + 'Cylinder Head' + ), + ( + 2085, + 63, + '2x4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2x4V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 2x4V (600 cfm) Carb', + 'Carburetor' + ), + ( + 2086, + 1, + 'Ford (10.2) Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (10.2) Wedge CH', + 'Cylinder Head' + ), + ( + 2087, + 63, + '2100 2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2100 2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 2100 2V (600 cfm) Carb', + 'Carburetor' + ), + ( + 2088, + 1, + 'Wedge (8.9)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB (8.9) Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB (8.9) Wedge CH', + 'Cylinder Head' + ), + ( + 2089, + 1, + '352 4V (235 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '352 4V (235 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB 352 2V (235 hp)', + 'Engine Assembly' + ), + ( + 2090, + 1, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HP CI EM', + 'Exhaust Manifold' + ), + ( + 2091, + 1, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB HD CI Crankshaft', + 'Crankshaft' + ), + ( + 2092, + 63, + '3x2V (860 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (860 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Autolite 3x2V (860 cfm) Carb', + 'Carburetor' + ), + ( + 2093, + 14, + '3x2V (840 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V (840 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley 3x2V (840 cfm) Carb', + 'Carburetor' + ), + ( + 2094, + 1, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Wedge (10.5) CH', + 'Cylinder Head' + ), + ( + 2095, + 1, + 'CJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'CJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB CJ TI Crankshaft', + 'Crankshaft' + ), + ( + 2096, + 1, + 'Wedge (8.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (8.7) Wedge CH', + 'Cylinder Head' + ), + ( + 2097, + 1, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'additional counterweights for better high rpm balancing', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB HP TI Crankshaft', + 'Crankshaft' + ), + ( + 2098, + 1, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (10.5) Wedge CH', + 'Cylinder Head' + ), + ( + 2099, + 1, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB HP Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 2100, + 1, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB HP Camshaft', + 'Camshaft' + ), + ( + 2101, + 1, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (9.0) 1.67i/1.45e Wedge CH', + 'Cylinder Head' + ), + ( + 2102, + 1, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (10.0) Wedge CH', + 'Cylinder Head' + ), + ( + 2103, + 1, + 'Boss 302 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss 302 (10.5) 2.23/1.72 Canted CH', + 'Cylinder Head' + ), + ( + 2104, + 1, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'known for weak side-skirts, which caused cracking and even breaking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss 302 FA Piston', + 'Pistons' + ), + ( + 2105, + 1, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss 302 EM', + 'Exhaust Manifold' + ), + ( + 2106, + 1, + 'Wedge (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (9.5) Wedge CH', + 'Cylinder Head' + ), + ( + 2107, + 1, + 'Wedge (10.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.7)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (10.7) Wedge CH', + 'Cylinder Head' + ), + ( + 2108, + 22, + '2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter 2V (600 cfm) Carb', + 'Carburetor' + ), + ( + 2109, + 22, + 'AVS 4V (700 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AVS 4V (700 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AVS 4V (700 cfm) Carb', + 'Carburetor' + ), + ( + 2110, + 8, + 'Wedge (8.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (8.2) W CH', + 'Cylinder Head' + ), + ( + 2111, + 22, + 'AVS 4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AVS 4V (800 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Carter AVS 4V (800 cfm) Carb', + 'Carburetor' + ), + ( + 2112, + 8, + 'Max Wedge III (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Max Wedge III (11.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Max Wedge III (11.0) CH', + 'Cylinder Head' + ), + ( + 2113, + 8, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB (10.5) Wedge CH', + 'Cylinder Head' + ), + ( + 2114, + 0, + 'Horn La Cooca', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Specialty la coor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sp. Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Specialty la coor', + 'Horn' + ), + ( + 2149, + 0, + 'Horn Reville', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Spec. Reville', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sp Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Reville', + 'Horn' + ), + ( + 2150, + 0, + 'Horn Dixie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Spec. Dixie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sp Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Spec. Dixie', + 'Horn' + ), + ( + 2151, + 0, + 'Horn Charge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Spec. Charge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sp Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Horn Spec. Charge', + 'Horn' + ), + ( + 2152, + 61, + '3.07 Locking', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'locking;normal driving applications', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3.07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dana Differential (3.07) L', + 'Rear End' + ), + ( + 2153, + 78, + 'Cobra 427 S/C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'm/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shelby Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shelby 66 Cobra 427 S/C', + 'Vehicle' + ), + ( + 2154, + 78, + '65 Shelby Cobra Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '65 Shelby Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '65 Shelby Hood', + 'Hood' + ), + ( + 2156, + 78, + '65 Shelby Cobra Bumpers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '65 Shelby Bumpers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '65 Shelby Bumpers', + 'Bumpers' + ), + ( + 2157, + 0, + 'Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'light window tint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Light Window Tinting', + 'Window Tinting' + ), + ( + 2158, + 0, + 'Dark', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'dark window tint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dark', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dark Window Tinting', + 'Window Tinting' + ), + ( + 2159, + 0, + 'Very Dark', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a very dark window tint, so dark as to be nearly opaque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Very Dark', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Very Dark Window Tinting', + 'Window Tinting' + ), + ( + 2160, + 0, + 'Horn Charge Short', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Spec Horn Charge Short', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sp Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Spec Horn Charge Short', + 'Horn' + ), + ( + 2161, + 0, + 'Hardtop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hardtop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hardtop', + 'Top Style' + ), + ( + 2162, + 0, + 'Chopped Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chopped Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chopped Top', + 'Top Style' + ), + ( + 2163, + 0, + 'Convertible Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Convertible Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Convertible Top', + 'Top Style' + ), + ( + 2164, + 0, + 'Vinyl Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vinyl Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vinyl Top', + 'Top Style' + ), + ( + 2179, + 1, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Mustang', + 'Vehicle' + ), + ( + 2180, + 1, + 'Torino Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torino Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 69 Torino GT Cobra', + 'Vehicle' + ), + ( + 2181, + 1, + 'Mach 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mach 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Mustang Mach 1', + 'Vehicle' + ), + ( + 2182, + 10, + 'Hemi Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 70 Hemi Cuda', + 'Vehicle' + ), + ( + 2183, + 10, + '440 Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '440 Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 70 440 Cuda', + 'Vehicle' + ), + ( + 2184, + 10, + 'AAR Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AAR Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 70 AAR Cuda', + 'Vehicle' + ), + ( + 2185, + 10, + '340 Duster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '340 Duster', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Plymouth 71 340 Duster', + 'Vehicle' + ), + ( + 2186, + 3, + 'Impala SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Impala SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 64 Impala SS', + 'Vehicle' + ), + ( + 2187, + 3, + 'Chevelle SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevelle SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Chevelle SS', + 'Vehicle' + ), + ( + 2188, + 3, + 'Camaro RS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro RS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Camaro RS', + 'Vehicle' + ), + ( + 2189, + 3, + 'Camaro Z-28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro Z-28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 67 Camaro Z-28', + 'Vehicle' + ), + ( + 2190, + 3, + 'Chevelle SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevelle SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Chevelle SS', + 'Vehicle' + ), + ( + 2191, + 3, + 'El Camino SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'El Camino SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 El Camino SS', + 'Vehicle' + ), + ( + 2192, + 3, + 'Nova SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nova SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 70 Nova SS', + 'Vehicle' + ), + ( + 2193, + 5, + '4-4-2 W-30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '442 W-30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 69 442 W-30', + 'Vehicle' + ), + ( + 2194, + 5, + 'Hurst 4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hurst 4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile 69 Hurst 442', + 'Vehicle' + ), + ( + 2195, + 1, + '4.10 Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'banjo carrier; used on very early Fords', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '(4.10) Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford (4.10) Banjo Differential LD', + 'Rear End' + ), + ( + 2196, + 7, + 'Firebird Formula', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firebird Formula', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 73 Firebird Formula', + 'Vehicle' + ), + ( + 2197, + 7, + 'Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'a/t', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firebird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac 73 Firebird', + 'Vehicle' + ), + ( + 2198, + 1, + '3.90 Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'banjo carrier; used on very early Fords', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '(3.90) Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford (3.90) Banjo Differential LD', + 'Rear End' + ), + ( + 2199, + 1, + '3.31 Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'banjo carrier; used on very early Fords', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '(3.31) Banjo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford (3.31) Banjo Differential LD', + 'Rear End' + ), + ( + 2200, + 43, + 'ND (0.3) 12.5"', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'high travel limit shock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ND (0.3) 12.5"', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Formance ND (0.3) Shock', + 'Shocks' + ), + ( + 2201, + 69, + '100 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 100 lb/in Coil Springs', + 'Springs' + ), + ( + 2202, + 69, + '110 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 110 lb/in Coil Springs', + 'Springs' + ), + ( + 2203, + 69, + '150 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 150 lb/in leaf spring', + 'Springs' + ), + ( + 2204, + 69, + '160 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 160 lb/in leaf spring', + 'Springs' + ), + ( + 2205, + 69, + '170 lb/in Leaf', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 170 lb/in leaf spring', + 'Springs' + ), + ( + 2206, + 69, + '200 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 200 lb/in coil-over spring', + 'Springs' + ), + ( + 2207, + 69, + '190 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 190 lb/in coil-over spring', + 'Springs' + ), + ( + 2208, + 69, + '180 lb/in Coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 180 lb/in coil-over spring', + 'Springs' + ), + ( + 2209, + 69, + '170 lb/in coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 170 lb/in coil-over spring', + 'Spring' + ), + ( + 2210, + 69, + '160 lb/in coil-over', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 160 lb/in coil-over spring', + 'Spring' + ), + ( + 2211, + 69, + '140 lb/in leaf spring', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 140 lb/in leaf spring', + 'Spring' + ), + ( + 2212, + 69, + '130 lb/in leaf spring', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 130 lb/in leaf spring', + 'Spring' + ), + ( + 2213, + 69, + '120 lb/in leaf spring', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 120 lb/in leaf spring', + 'Spring' + ), + ( + 2214, + 69, + '110 lb/in leaf spring', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Gifford 110 lb/in leaf spring', + 'Spring' + ), + ( + 2215, + 5, + '4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4-4-2', + 'Vehicle' + ), + ( + 2216, + 3, + '70 Chevelle SS Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1970 Chevelle SS Hood', + 'Hood' + ), + ( + 2217, + 3, + 'Camaro SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet 1967 Camaro SS', + 'Vehicle' + ), + ( + 2218, + 6, + 'Stage I (10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stage I (10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stage I (10) CH', + 'Cylinder Head' + ), + ( + 2219, + 65, + '47 Cadillac', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-00', + 'Wheel Rims' + ), + ( + 2220, + 65, + '49 Mercury', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-01', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-01', + 'Wheel Rims' + ), + ( + 2221, + 65, + '53 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-02', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-02', + 'Wheel Rims' + ), + ( + 2222, + 65, + '55 Buick', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-03', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-03', + 'Wheel Rims' + ), + ( + 2223, + 65, + 'Red Center Spinner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-04', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-04', + 'Wheel Rims' + ), + ( + 2224, + 65, + '57 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-05', + 'Wheel Rims' + ), + ( + 2225, + 65, + 'Twist Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-06', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-06', + 'Wheel Rims' + ), + ( + 2226, + 65, + '57 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-07', + 'Wheel Rims' + ), + ( + 2227, + 65, + '58 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-08', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-08', + 'Wheel Rims' + ), + ( + 2228, + 65, + 'Sun Burst', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-09', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-09', + 'Wheel Rims' + ), + ( + 2229, + 65, + 'Spoke Spinner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-10', + 'Wheel Rims' + ), + ( + 2230, + 65, + '64 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-11', + 'Wheel Rims' + ), + ( + 2231, + 65, + '64 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-12', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-12', + 'Wheel Rims' + ), + ( + 2232, + 65, + 'Hypnotic Star 6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-13', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-13', + 'Wheel Rims' + ), + ( + 2233, + 65, + 'Rippled Orb', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-14', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-14', + 'Wheel Rims' + ), + ( + 2234, + 65, + '59 Dodge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-15', + 'Wheel Rims' + ), + ( + 2235, + 65, + '57 Chrysler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-16', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-16', + 'Wheel Rims' + ), + ( + 2236, + 65, + '57 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-17', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-17', + 'Wheel Rims' + ), + ( + 2237, + 65, + '57 Nomad', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-18', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-18', + 'Wheel Rims' + ), + ( + 2238, + 65, + 'Twist Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-19', + 'Wheel Rims' + ), + ( + 2239, + 65, + 'Sun Burst', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-20', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-20', + 'Wheel Rims' + ), + ( + 2240, + 65, + '59 Plymouth', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-21', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-21', + 'Wheel Rims' + ), + ( + 2241, + 65, + '59 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-22', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-22', + 'Wheel Rims' + ), + ( + 2242, + 65, + 'Ford Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-23', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-23', + 'Wheel Rims' + ), + ( + 2243, + 65, + '59 Pontiac', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-24', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-24', + 'Wheel Rims' + ), + ( + 2244, + 65, + '60 Chrysler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-25', + 'Wheel Rims' + ), + ( + 2245, + 65, + '60 Edsel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-26', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-26', + 'Wheel Rims' + ), + ( + 2246, + 65, + '60 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-27', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-27', + 'Wheel Rims' + ), + ( + 2247, + 65, + '61 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-28', + 'Wheel Rims' + ), + ( + 2248, + 65, + '61 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-29', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-29', + 'Wheel Rims' + ), + ( + 2249, + 65, + '62 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-30', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-30', + 'Wheel Rims' + ), + ( + 2250, + 65, + '63 Buick', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-31', + 'Wheel Rims' + ), + ( + 2251, + 65, + '63 Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-32', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-32', + 'Wheel Rims' + ), + ( + 2252, + 65, + 'Spoke Tower', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-33', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-33', + 'Wheel Rims' + ), + ( + 2253, + 65, + '64 Plymouth', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-34', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-34', + 'Wheel Rims' + ), + ( + 2254, + 65, + '64 Dodge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-35', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-35', + 'Wheel Rims' + ), + ( + 2255, + 65, + 'Super Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-36', + 'Wheel Rims' + ), + ( + 2256, + 65, + '65 Chrysler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-37', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-37', + 'Wheel Rims' + ), + ( + 2257, + 65, + '65 Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-38', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-38', + 'Wheel Rims' + ), + ( + 2258, + 65, + '65 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-39', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-39', + 'Wheel Rims' + ), + ( + 2259, + 65, + '65 Olds', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-40', + 'Wheel Rims' + ), + ( + 2260, + 65, + '65 Corvair', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-41', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-41', + 'Wheel Rims' + ), + ( + 2261, + 65, + 'Fake Spinner Covered', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-42', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-42', + 'Wheel Rims' + ), + ( + 2262, + 65, + '55 Chrysler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-43', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-43', + 'Wheel Rims' + ), + ( + 2263, + 65, + 'Knock Off Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-44', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-44', + 'Wheel Rims' + ), + ( + 2264, + 65, + '67 Shelby', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-45', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-45', + 'Wheel Rims' + ), + ( + 2265, + 65, + '66 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-46', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-46', + 'Wheel Rims' + ), + ( + 2266, + 65, + '67 Chevy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-47', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-47', + 'Wheel Rims' + ), + ( + 2267, + 65, + 'Blue Dot Spoke Spinner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-48', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-48', + 'Wheel Rims' + ), + ( + 2268, + 65, + 'Disc Cover', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-49', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-49', + 'Wheel Rims' + ), + ( + 2269, + 65, + '40 Spoke', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-50', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-50', + 'Wheel Rims' + ), + ( + 2270, + 65, + 'Blue Dot Spoke Spinner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-51', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-51', + 'Wheel Rims' + ), + ( + 2271, + 65, + 'Accordian Full Cover', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-52', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-52', + 'Wheel Rims' + ), + ( + 2272, + 65, + 'Full Moon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-53', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-53', + 'Wheel Rims' + ), + ( + 2273, + 65, + '55 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-54', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-54', + 'Wheel Rims' + ), + ( + 2274, + 65, + 'Rallye Slot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-55', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-55', + 'Wheel Rims' + ), + ( + 2275, + 65, + 'Classic Cadillac', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-56', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-56', + 'Wheel Rims' + ), + ( + 2276, + 65, + 'Compass Full Cover', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-57', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-57', + 'Wheel Rims' + ), + ( + 2277, + 65, + '57 Classic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-58', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HS-58', + 'Wheel Rims' + ), + ( + 2278, + 45, + 'Slot 11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-00', + 'Wheel Rims' + ), + ( + 2279, + 45, + 'Double Layer Spoke', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-01', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-01', + 'Wheel Rims' + ), + ( + 2280, + 45, + 'Twistar 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-02', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-02', + 'Wheel Rims' + ), + ( + 2281, + 45, + 'Super Slot 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-03', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-03', + 'Wheel Rims' + ), + ( + 2282, + 45, + 'Teardrop Slot 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-04', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-04', + 'Wheel Rims' + ), + ( + 2283, + 45, + 'Twistar 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-05', + 'Wheel Rims' + ), + ( + 2284, + 45, + 'Slot 9', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-06', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-06', + 'Wheel Rims' + ), + ( + 2285, + 45, + 'Fan Slot 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-07', + 'Wheel Rims' + ), + ( + 2286, + 45, + 'Mild Twist Slot 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-08', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-08', + 'Wheel Rims' + ), + ( + 2287, + 45, + 'Twistar 11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-09', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-09', + 'Wheel Rims' + ), + ( + 2288, + 45, + 'Cheese Grater 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-10', + 'Wheel Rims' + ), + ( + 2289, + 45, + 'Bull Star 10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-11', + 'Wheel Rims' + ), + ( + 2290, + 45, + 'Chrome Twistar 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-12', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-12', + 'Wheel Rims' + ), + ( + 2291, + 45, + 'Twisted Fan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-13', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-13', + 'Wheel Rims' + ), + ( + 2292, + 45, + 'Twistar 9', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-14', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-14', + 'Wheel Rims' + ), + ( + 2293, + 45, + 'Power Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-15', + 'Wheel Rims' + ), + ( + 2294, + 45, + 'Twisted Super Grater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-16', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-16', + 'Wheel Rims' + ), + ( + 2295, + 45, + 'Twisted Split Star 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-17', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-17', + 'Wheel Rims' + ), + ( + 2296, + 45, + 'Twisted Split Star 7 Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-18', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-18', + 'Wheel Rims' + ), + ( + 2297, + 45, + 'Mega Grater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-19', + 'Wheel Rims' + ), + ( + 2298, + 45, + 'Classy Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-20', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-20', + 'Wheel Rims' + ), + ( + 2299, + 45, + 'Fan Grater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-21', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-21', + 'Wheel Rims' + ), + ( + 2300, + 45, + 'Super Star 10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-22', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-22', + 'Wheel Rims' + ), + ( + 2301, + 45, + 'Fat Star 6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-23', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-23', + 'Wheel Rims' + ), + ( + 2302, + 45, + 'Split Star 6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-24', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-24', + 'Wheel Rims' + ), + ( + 2303, + 45, + 'Split Twist 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-25', + 'Wheel Rims' + ), + ( + 2304, + 45, + 'Split Star 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-26', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-26', + 'Wheel Rims' + ), + ( + 2305, + 45, + 'Mega Slot Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-27', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HA-27', + 'Wheel Rims' + ), + ( + 2308, + 65, + '63 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-00', + 'Wheel Rims' + ), + ( + 2309, + 65, + 'Rallye Super Slot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-01', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-01', + 'Wheel Rims' + ), + ( + 2310, + 65, + 'Classic 5 Slot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-02', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-02', + 'Wheel Rims' + ), + ( + 2311, + 65, + 'Pin Star', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-03', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-03', + 'Wheel Rims' + ), + ( + 2312, + 65, + 'Near Magnum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-04', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-04', + 'Wheel Rims' + ), + ( + 2313, + 65, + 'Rally Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-05', + 'Wheel Rims' + ), + ( + 2314, + 65, + 'Classic Sport', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-06', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-06', + 'Wheel Rims' + ), + ( + 2315, + 65, + 'Gold 4-4-2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-07', + 'Wheel Rims' + ), + ( + 2316, + 65, + 'Fordy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-08', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-08', + 'Wheel Rims' + ), + ( + 2317, + 65, + 'Magnum Star', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-09', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-09', + 'Wheel Rims' + ), + ( + 2318, + 65, + 'Honeycomb', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-10', + 'Wheel Rims' + ), + ( + 2319, + 65, + '40 Ford', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-11', + 'Wheel Rims' + ), + ( + 2320, + 65, + 'Ringed Moon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-12', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RS-12', + 'Wheel Rims' + ), + ( + 2321, + 73, + 'Slot 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-00', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-00', + 'Wheel Rims' + ), + ( + 2322, + 73, + 'Round 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-01', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-01', + 'Wheel Rims' + ), + ( + 2323, + 73, + 'Star Seven', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-02', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-02', + 'Wheel Rims' + ), + ( + 2324, + 73, + 'Star Burst 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-03', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-03', + 'Wheel Rims' + ), + ( + 2325, + 73, + 'Split Twist 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-04', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-04', + 'Wheel Rims' + ), + ( + 2326, + 73, + 'Split Twist 5 Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-05', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-05', + 'Wheel Rims' + ), + ( + 2327, + 73, + 'Big Spoke 12', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-06', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-06', + 'Wheel Rims' + ), + ( + 2328, + 73, + 'Triple Blade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-07', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-07', + 'Wheel Rims' + ), + ( + 2329, + 73, + 'Hex Center Wire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-08', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-08', + 'Wheel Rims' + ), + ( + 2330, + 73, + 'Fine Diamond Spoke', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-09', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-09', + 'Wheel Rims' + ), + ( + 2331, + 73, + 'Diamond Spoke Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-10', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-10', + 'Wheel Rims' + ), + ( + 2332, + 73, + 'Web 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-11', + 'Wheel Rims' + ), + ( + 2333, + 73, + 'Split Fat Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-12', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-12', + 'Wheel Rims' + ), + ( + 2334, + 73, + 'Narrow Split Twist 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-13', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-13', + 'Wheel Rims' + ), + ( + 2335, + 73, + 'Two Tone Star Slot 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-14', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-14', + 'Wheel Rims' + ), + ( + 2336, + 73, + 'Twist Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-15', + 'Wheel Rims' + ), + ( + 2337, + 73, + 'Slot Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-16', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-16', + 'Wheel Rims' + ), + ( + 2338, + 73, + 'Black Rally Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-17', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-17', + 'Wheel Rims' + ), + ( + 2339, + 73, + 'Twisted Cheese Grater', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-18', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-18', + 'Wheel Rims' + ), + ( + 2340, + 73, + 'Spoke Black Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-19', + 'Wheel Rims' + ), + ( + 2341, + 73, + 'Chrome Slot Star 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-20', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-20', + 'Wheel Rims' + ), + ( + 2342, + 73, + 'Centerline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-21', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-21', + 'Wheel Rims' + ), + ( + 2343, + 73, + 'Baby Moon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-22', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-22', + 'Wheel Rims' + ), + ( + 2344, + 73, + 'Chrome Reversed 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-23', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-23', + 'Wheel Rims' + ), + ( + 2345, + 73, + 'Gold Reversed 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-24', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-24', + 'Wheel Rims' + ), + ( + 2346, + 73, + 'SS Rally Chrome', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-25', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-25', + 'Wheel Rims' + ), + ( + 2347, + 73, + 'SS Rally Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-26', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-26', + 'Wheel Rims' + ), + ( + 2348, + 73, + 'Five Slot Spinner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-27', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-27', + 'Wheel Rims' + ), + ( + 2349, + 73, + 'Five Slot', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-28', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-28', + 'Wheel Rims' + ), + ( + 2350, + 73, + 'Torq-Thrust', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-29', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'RA-29', + 'Wheel Rims' + ), + ( + 2351, + 67, + 'Flow-rite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flow-rite', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall Flow-rite Air Cleaner', + 'Air Cleaner' + ), + ( + 2352, + 60, + 'Flared Velocity Stack', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flared Stack', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flared Velocity Stack', + 'Air Scoop' + ), + ( + 2353, + 60, + 'Highboy VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flared Stack (tall)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tall Flared Velocity Stack', + 'Air Scoop' + ), + ( + 2354, + 60, + 'Classic VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Straight Stack', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Straight Velocity Stack', + 'Air Scoop' + ), + ( + 2355, + 60, + 'Dual Flared VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2 Flared Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dual Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2356, + 60, + 'Dual Highboy VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2 Flared Stacks (tall)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dual Tall Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2357, + 60, + 'Dual Classic VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2 Straight Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dual Straight Velocity Stacks', + 'Air Scoop' + ), + ( + 2358, + 60, + 'Triple Flared VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 Flared Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Triple Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2359, + 60, + 'Triple Highboy VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 Flared Stacks (tall)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Triple Tall Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2360, + 60, + 'Triple Classic VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3 Straight Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Triple Straight Velocity Stacks', + 'Air Scoop' + ), + ( + 2361, + 60, + 'Quad Flared VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 Flared Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quad Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2362, + 60, + 'Quad Highboy VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 Flared Stacks (tall)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quad Tall Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2363, + 60, + 'Quad Classic VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4 Straight Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quad Straight Velocity Stacks', + 'Air Scoop' + ), + ( + 2364, + 60, + '"8-barrel" Flared VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8 Flared Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eight Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2365, + 60, + '"8-barrel" Highboy VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8 Flared Stacks (tall)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eight Tall Flared Velocity Stacks', + 'Air Scoop' + ), + ( + 2366, + 60, + '"8-barrel" Classic VS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8 Straight Stacks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Eight Straight Velocity Stacks', + 'Air Scoop' + ), + ( + 2367, + 1, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Bird (arcade)', + 'Vehicle' + ), + ( + 2369, + 3, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '57 Chevy (arcade)', + 'Vehicle' + ), + ( + 2370, + 6, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Bomber (arcade)', + 'Vehicle' + ), + ( + 2371, + 1, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Vic (arcade)', + 'Vehicle' + ), + ( + 2375, + 0, + 'Roll Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'roll bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Generic roll bar', + 'Roll Bar' + ), + ( + 2376, + 7, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1969 Pontiac GTO modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2377, + 1, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1964 Ford Mustang modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2378, + 1, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Ford Thunderbird modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2379, + 6, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1955 Buick Century modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2380, + 3, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1970 Chevrolet Chevelle modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2381, + 1, + 'Galaxie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Galaxie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1964 Ford Galaxie modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2382, + 9, + 'Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Charger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1969 Dodge Charger modified for arcade Pro Racing', + 'Vehicle' + ), + ( + 2383, + 3, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Chevrolet Bel-Air modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2384, + 1, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1953 Ford Crestline modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2385, + 11, + 'AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMX', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1969 AMC AMX modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2386, + 1, + 'Ranchero', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ranchero', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Ford Ranchero modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2387, + 3, + 'Camaro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Camaro', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1967 Chevrolet Camaro modified for arcade Street Racing', + 'Vehicle' + ), + ( + 2388, + 7, + 'Wedge (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac (8.0) Stock W CH', + 'Cylinder Head' + ), + ( + 2389, + 99, + '195/60/15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Firestone 195/60/15 Bias Belted', + 'Tires' + ), + ( + 2390, + 73, + '220 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 220 lb/in coil spring', + 'Springs' + ), + ( + 2391, + 73, + '230 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 230 lb/in coil spring', + 'Springs' + ), + ( + 2392, + 73, + '240 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 240 lb/in coil spring', + 'Springs' + ), + ( + 2393, + 73, + '250 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 250 lb/in coil spring', + 'Springs' + ), + ( + 2394, + 73, + '260 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 260 lb/in coil spring', + 'Springs' + ), + ( + 2395, + 73, + '270 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 270 lb/in coil spring', + 'Springs' + ), + ( + 2396, + 73, + '280 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 280 lb/in coil spring', + 'Springs' + ), + ( + 2397, + 73, + '290 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 290 lb/in coil spring', + 'Springs' + ), + ( + 2398, + 73, + '300 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 300 lb/in coil spring', + 'Springs' + ), + ( + 2399, + 73, + '310 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 310 lb/in coil spring', + 'Springs' + ), + ( + 2400, + 73, + '320 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 320 lb/in coil spring', + 'Springs' + ), + ( + 2401, + 73, + '330 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 330 lb/in coil spring', + 'Springs' + ), + ( + 2402, + 73, + '340 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 340 lb/in coil spring', + 'Springs' + ), + ( + 2403, + 73, + '350 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 350 lb/in coil spring', + 'Springs' + ), + ( + 2404, + 73, + '360 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 360 lb/in coil spring', + 'Springs' + ), + ( + 2405, + 73, + '370 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 370 lb/in coil spring', + 'Springs' + ), + ( + 2406, + 73, + '380 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 380 lb/in coil spring', + 'Springs' + ), + ( + 2407, + 73, + '390 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 390 lb/in coil spring', + 'Springs' + ), + ( + 2408, + 73, + '400 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 400 lb/in coil spring', + 'Springs' + ), + ( + 2409, + 73, + '410 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 410 lb/in coil spring', + 'Springs' + ), + ( + 2410, + 73, + '420 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 420 lb/in coil spring', + 'Springs' + ), + ( + 2411, + 73, + '430 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 430 lb/in coil spring', + 'Springs' + ), + ( + 2412, + 73, + '440 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 440 lb/in coil spring', + 'Springs' + ), + ( + 2413, + 73, + '450 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 450 lb/in coil spring', + 'Springs' + ), + ( + 2414, + 73, + '460 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 460 lb/in coil spring', + 'Springs' + ), + ( + 2415, + 73, + '470 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 470 lb/in coil spring', + 'Springs' + ), + ( + 2416, + 73, + '480 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 480 lb/in coil spring', + 'Springs' + ), + ( + 2417, + 73, + '490 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 490 lb/in coil spring', + 'Springs' + ), + ( + 2418, + 73, + '500 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 500 lb/in coil spring', + 'Springs' + ), + ( + 2419, + 73, + '510 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 510 lb/in coil spring', + 'Springs' + ), + ( + 2420, + 73, + '180 lb/in Coil', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 180 lb/in coil spring', + 'Springs' + ), + ( + 2421, + 1, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'performs about halfway between a bone-stock camshaft and a high performance camshaft', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Special Stock Camshaft', + 'Camshaft' + ), + ( + 2422, + 0, + '295/80/22.5 Bus Tire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bus Tire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '295/80/22.5 Bus Tire', + 'Tires' + ), + ( + 2424, + 3, + '(8.5) Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used in light trucks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB (8.5) Stock', + 'Cylinder Head' + ), + ( + 2425, + 2, + 'Mod Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1949 Mercury Coupe (modified for QA use)', + 'Vehicle' + ), + ( + 2426, + 3, + 'Mod Bel Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Bel-Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1957 Chevrolet Bel-Air (modified for QA use)', + 'Vehicle' + ), + ( + 2427, + 7, + 'Mod GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1966 Pontiac GTO (modified for QA use)', + 'Vehicle' + ), + ( + 2428, + 4, + 'Mod Eldorado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Eldorado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1959 Cadillac Eldorado (modified for Qa use)', + 'Vehicle' + ), + ( + 2429, + 3, + 'Mod Stingray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Stingray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1963 Chevrolet Stingray (modified for QA use)', + 'Vehicle' + ), + ( + 2430, + 1, + 'Mod Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1964 Ford Mustang (modified for QA use)', + 'Vehicle' + ), + ( + 2431, + 10, + 'Mod Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Mod Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1970 Plymouth Cuda (modified for QA use)', + 'Vehicle' + ), + ( + 2432, + 1, + 'Power', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'good mid-range power cam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Power (HP) Camshaft', + 'Camshaft' + ), + ( + 2433, + 64, + '207/70/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 207/70/14 (D70-14) Bias Belted', + 'Tires' + ), + ( + 2434, + 64, + '212/70/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 212/70/14 (E70-14) Bias Belted', + 'Tires' + ), + ( + 2435, + 64, + '221/70/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 221/70/14 (F70-14) Bias Belted', + 'Tires' + ), + ( + 2436, + 64, + '232/70/14 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 232/70/14 (G70-14) Bias Belted', + 'Tires' + ), + ( + 2437, + 64, + '210/70/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 210/70/15 (E70-15) Bias Belted', + 'Tires' + ), + ( + 2438, + 64, + '216/70/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 216/70/15 (F70-15) Bias Belted', + 'Tires' + ), + ( + 2439, + 64, + '227/70/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 227/70/15 (G70-15) Bias Belted', + 'Tires' + ), + ( + 2440, + 64, + '231/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 231/60/15 (F60-15) Bias Belted', + 'Tires' + ), + ( + 2441, + 64, + '243/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 243/60/15 (G60-15) Bias Belted', + 'Tires' + ), + ( + 2442, + 64, + '224/60/15 Bias Belted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Begren 224/60/15 (E60-15) Bias Belted', + 'Tires' + ), + ( + 2443, + 6, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improved low end torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Special Stock Camshaft', + 'Camshaft' + ), + ( + 2444, + 4, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'provides good low and midrange torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Midrange Camshaft', + 'Camshaft' + ), + ( + 2445, + 3, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improves low range torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB Midrange Camshaft', + 'Camshaft' + ), + ( + 2446, + 3, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improves low range torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet SB Special Stock Camshaft', + 'Camshaft' + ), + ( + 2447, + 8, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improves low and midrange torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Midrange Camshaft', + 'Camshaft' + ), + ( + 2448, + 5, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improves low range torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Special Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB Special Stock Camshaft', + 'Camshaft' + ), + ( + 2449, + 7, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improves low and midrange torque', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midrange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Midrange Camshaft', + 'Camshaft' + ), + ( + 2450, + 0, + 'Heavy Truck (22.5")', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Heavy Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Heavy Truck Rim (22.5")', + 'Wheel Rims' + ), + ( + 2451, + 70, + '265-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'budget replacement block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chevrolet SB V8 265', + 'Engine Block' + ), + ( + 2452, + 70, + 'Stock (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'budget replacement cylinder head', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chevrolet SB Wedge (8.0)', + 'Cylinder Head' + ), + ( + 2453, + 70, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'budget replacement camshaft', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chevrolet SB Stock Camshaft', + 'Camshaft' + ), + ( + 2454, + 70, + '265 2V (140 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'budget replacement engine assembly', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '265 2V (140 hp)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chevrolet SB 265 2V (140 hp)', + 'Engine Assembly' + ), + ( + 2455, + 11, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (9.0) W CH', + 'Cylinder Head' + ), + ( + 2456, + 11, + 'Stock (9.0) LV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.0) LV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (9.0) Large Valve W CH', + 'Cylinder Head' + ), + ( + 2457, + 11, + 'Stock (10.0) LV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.0) LV', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (10.0) Large Valve W CH', + 'Cylinder Head' + ), + ( + 2458, + 11, + 'Dog Leg (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'improved flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dog Leg (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Dog Leg (10.0) W CH', + 'Cylinder Head' + ), + ( + 2459, + 11, + '360-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '360', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 360-V8', + 'Engine Block' + ), + ( + 2460, + 11, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock TI Rod', + 'Connecting Rods' + ), + ( + 2461, + 11, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Group 19', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Group 19 FS Crankshaft', + 'Crankshaft' + ), + ( + 2462, + 8, + '426-V8 Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi 426-V8', + 'Engine Block' + ), + ( + 2463, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Flat Top CA Piston', + 'Pistons' + ), + ( + 2464, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Special FS Rod', + 'Connecting Rods' + ), + ( + 2465, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Hemi FS Rod', + 'Connecting Rods' + ), + ( + 2466, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Hemi Crankshaft', + 'Crankshaft' + ), + ( + 2467, + 70, + 'Hemi (10.25) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Hemi (10.25) Cylinder Head', + 'Cylinder Head' + ), + ( + 2468, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Solid Lifter Valvetrain', + 'Valve Train' + ), + ( + 2469, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chyrsler Hemi Valvetrain', + 'Valve Train' + ), + ( + 2470, + 8, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2471, + 70, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Shade Tree Chrysler Hemi Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2472, + 8, + 'Hemi Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2473, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Intake Manifold', + 'Intake Manifold' + ), + ( + 2474, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Camshaft', + 'Camshaft' + ), + ( + 2475, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Piston', + 'Pistons' + ), + ( + 2476, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Rods', + 'Connecting Rods' + ), + ( + 2477, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Crankshaft', + 'Crankshaft' + ), + ( + 2478, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Valvetrain', + 'Valve Train' + ), + ( + 2479, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2480, + 4, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Cylinder Head', + 'Cylinder Head' + ), + ( + 2481, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB CI Stock Rod', + 'Connecting Rods' + ), + ( + 2482, + 6, + 'Stock 322', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 322', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 322 Camshaft', + 'Camshaft' + ), + ( + 2483, + 6, + 'Recesssed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Recessed Piston', + 'Pistons' + ), + ( + 2484, + 6, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Flat Top Piston', + 'Pistons' + ), + ( + 2485, + 6, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Wedge Top Piston', + 'Pistons' + ), + ( + 2486, + 6, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Domed Top Piston', + 'Pistons' + ), + ( + 2487, + 6, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2488, + 8, + '273-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '273', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 273-V8', + 'Engine Block' + ), + ( + 2489, + 8, + '360-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '360', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB 360-V8', + 'Engine Block' + ), + ( + 2490, + 41, + 'Flat Top CSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Flat Top Chrysler SB Piston', + 'Pistons' + ), + ( + 2491, + 1, + '390-V8 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'thicker main-bearing webs and caps; more reinforcing ribs; enlarged oil passages', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '390 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB V8 390 HP', + 'Engine Block' + ), + ( + 2492, + 1, + 'Stock CB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 2493, + 1, + 'Aluminum CB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Aluminum Dual Plane Intake Manifold', + 'Intake Manifold' + ), + ( + 2494, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Stock Camshaft', + 'Camshaft' + ), + ( + 2495, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Boss Camshaft', + 'Camshaft' + ), + ( + 2496, + 1, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block HO Camshaft', + 'Camshaft' + ), + ( + 2497, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Stock Piston', + 'Pistons' + ), + ( + 2498, + 1, + 'Forged Aluminum C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Flat Top FA Piston', + 'Pistons' + ), + ( + 2499, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Stock FS Rod', + 'Connecting Rods' + ), + ( + 2500, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Boss Rod', + 'Connecting Rods' + ), + ( + 2501, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Stock Crankshaft', + 'Crankshaft' + ), + ( + 2502, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Boss Crankshaft', + 'Crankshaft' + ), + ( + 2503, + 1, + 'Stock C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2504, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Boss Valvetrain', + 'Valve Train' + ), + ( + 2505, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block Stock EM', + 'Exhaust Manifold' + ), + ( + 2506, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock CI DP IM', + 'Intake Manifold' + ), + ( + 2507, + 1, + 'CJ/SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'better flow through larger passages', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'CJ/SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 CJ/SCJ CI DP IM', + 'Intake Manifold' + ), + ( + 2508, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Camshaft', + 'Camshaft' + ), + ( + 2509, + 1, + 'Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Special Camshaft', + 'Camshaft' + ), + ( + 2510, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Piston', + 'Pistons' + ), + ( + 2511, + 1, + 'CJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'CJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 CJ FA Piston', + 'Pistons' + ), + ( + 2512, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Connecting Rod', + 'Connecting Rods' + ), + ( + 2513, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Crankshaft', + 'Crankshaft' + ), + ( + 2514, + 1, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss Crankshaft', + 'Crankshaft' + ), + ( + 2515, + 1, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 NASCAR Crankshaft', + 'Crankshaft' + ), + ( + 2516, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Valve Train', + 'Valve Train' + ), + ( + 2517, + 1, + 'Boss Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Boss Hydraulic Valve Train', + 'Valve Train' + ), + ( + 2518, + 1, + 'SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 SCJ Valve Train', + 'Valve Train' + ), + ( + 2519, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock EM', + 'Exhaust Manifold' + ), + ( + 2520, + 1, + 'CJ/SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'CJ/SCJ', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 CJ/SCJ EM', + 'Exhaust Manifold' + ), + ( + 2521, + 1, + '429-V8 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'reinforced; high nodularity iron', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429-V8 Boss', + 'Engine Block' + ), + ( + 2522, + 1, + 'HP SB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'used on 289 HP engine; beefier, with thicker rod bolts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB HP Rod', + 'Connecting Rods' + ), + ( + 2523, + 1, + '289-V8 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'higher nodularity iron with additional supports', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '289 HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 289-V8 HP', + 'Engine Block' + ), + ( + 2524, + 1, + '302-V8 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'higher nodularity iron with additional supports and four-bolt main bearing cap', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '302-V8 Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB 302-V8 Boss', + 'Engine Block' + ), + ( + 2525, + 1, + 'HP SB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB CI EM', + 'Exhaust Manifold' + ), + ( + 2526, + 1, + 'Cross Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cross Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Cross Boss DP IM', + 'Intake Manifold' + ), + ( + 2527, + 1, + 'Stock Economy Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 2V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Intake Manifold', + 'Intake Manifold' + ), + ( + 2528, + 13, + 'Tri-Power', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tri-Power', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Ford Y Tri-Power IM', + 'Intake Manifold' + ), + ( + 2529, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Camshaft', + 'Camshaft' + ), + ( + 2530, + 1, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Truck Crankshaft', + 'Crankshaft' + ), + ( + 2531, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Piston', + 'Pistons' + ), + ( + 2532, + 1, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Connecting Rods', + 'Connecting Rods' + ), + ( + 2533, + 1, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Truck', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Truck Connecting Rods', + 'Connecting Rods' + ), + ( + 2534, + 1, + 'Stock Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Solid Valve Train', + 'Valve Train' + ), + ( + 2535, + 1, + 'Stock 272/292', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Stock Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2536, + 6, + '400-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB V8 400', + 'Engine Block' + ), + ( + 2537, + 6, + '430-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '430', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB V8 430', + 'Engine Block' + ), + ( + 2538, + 6, + 'Stock (10.25) BB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Stock (10.25) CH', + 'Cylinder Head' + ), + ( + 2539, + 3, + '427-V8 ZL1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'all-aluminum block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'ZL1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet BB V8 427 ZL1', + 'Engine Block' + ), + ( + 2540, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W CI DP Intake Manifold', + 'Intake Manifold' + ), + ( + 2541, + 3, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Aluminum DP Intake Manifold', + 'Intake Manifold' + ), + ( + 2542, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Stock Camshaft', + 'Camshaft' + ), + ( + 2543, + 3, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W HP Camshaft', + 'Camshaft' + ), + ( + 2544, + 3, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Z11 Camshaft', + 'Camshaft' + ), + ( + 2545, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Stock FS Crankshaft', + 'Crankshaft' + ), + ( + 2546, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Stock Valve Train', + 'Valve Train' + ), + ( + 2547, + 3, + 'Super Turbo-Thrust', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'STT', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W STT Solid Lifter Valve Train', + 'Valve Train' + ), + ( + 2548, + 3, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Stock EM', + 'Exhaust Manifold' + ), + ( + 2549, + 3, + 'Z11 W', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Z11', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Z11 Cylinder Head', + 'Cylinder Head' + ), + ( + 2550, + 6, + '364-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '364', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 364-V8', + 'Engine Block' + ), + ( + 2551, + 6, + '401-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 401-V8', + 'Engine Block' + ), + ( + 2552, + 6, + '425-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '425', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 425-V8', + 'Engine Block' + ), + ( + 2553, + 6, + '300-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '300', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB V8 300', + 'Engine Block' + ), + ( + 2554, + 6, + '340-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '340', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB V8 340', + 'Engine Block' + ), + ( + 2555, + 4, + '365-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '365', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB V8 365', + 'Engine Block' + ), + ( + 2556, + 4, + '429-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB V8 429', + 'Engine Block' + ), + ( + 2557, + 3, + 'HP W', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W HP Exhaust Manifold', + 'Exhaust Manifold' + ), + ( + 2558, + 1, + 'HP C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Block HP EM', + 'Exhaust Manifold' + ), + ( + 2559, + 79, + 'Compressor (7.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Compressor (7.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Compressor (7.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 2560, + 79, + 'Compressor Extra (7.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Compressor (7.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Compressor (7.8) Cylinder Head', + 'Cylinder Head' + ), + ( + 2561, + 79, + 'Compressor Chief (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Compressor Chief (8.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Compressor Chief (8.0) Cylinder Head', + 'Cylinder Head' + ), + ( + 2562, + 79, + 'Compressor King (8.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Compressor King (8.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Compressor King (8.2) Cylinder Head', + 'Cylinder Head' + ), + ( + 2563, + 6, + 'Nailhead (8.75) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead (8.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead (8.75) Cylinder Head', + 'Cylinder Head' + ), + ( + 2564, + 6, + 'Nailhead (9.0) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead (9.0) Cylinder Head', + 'Cylinder Head' + ), + ( + 2565, + 6, + 'Nailhead (10.25) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead (10.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead (10.25) Cylinder Head', + 'Cylinder Head' + ), + ( + 2566, + 6, + 'Nailhead (10.5) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead (10.5) Cylinder Head', + 'Cylinder Head' + ), + ( + 2567, + 4, + 'Stock (9.75) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac (9.75) Wedge Cylinder Head', + 'Cylinder Head' + ), + ( + 2568, + 4, + 'Stock (10.0) CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac (10.0) Wedge Cylinder Head', + 'Cylinder Head' + ), + ( + 2569, + 50, + 'Hemi (10.5) Canted CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch Hemi (10.5) Canted Cylinder Head', + 'Cylinder Head' + ), + ( + 2570, + 50, + 'Hemi (10.75) Canted CH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi (10.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch Hemi (10.75) Canted Cylinder Head', + 'Cylinder Head' + ), + ( + 2571, + 80, + 'Breezer Aluminum DP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Breezer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Breezer Aluminum DP IM', + 'Intake Manifold' + ), + ( + 2572, + 80, + 'Tornado Aluminum SP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tornado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Tornado Aluminum SP IM', + 'Intake Manifold' + ), + ( + 2573, + 80, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum DP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick SB Aluminum DP IM', + 'Intake Manifold' + ), + ( + 2574, + 79, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Alumimum DP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head Aluminum DP IM', + 'Intake Manifold' + ), + ( + 2575, + 80, + 'Power Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Power Plus Camshaft', + 'Camshaft' + ), + ( + 2576, + 80, + 'Nailhead HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead HP Camshaft', + 'Camshaft' + ), + ( + 2577, + 79, + 'Power Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head Power Plus Camshaft', + 'Camshaft' + ), + ( + 2578, + 79, + 'L-Head HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head HP Camshaft', + 'Camshaft' + ), + ( + 2579, + 80, + 'Nailhead Perf. EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Performance EM', + 'Exhaust Manifold' + ), + ( + 2580, + 79, + 'L-Head Perf. EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head Performance EM', + 'Exhaust Manifold' + ), + ( + 2581, + 6, + 'SB Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Performance EM', + 'Exhaust Manifold' + ), + ( + 2582, + 6, + 'SB Tube Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Small Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB EM Small Tube Headers', + 'Exhaust Manifold' + ), + ( + 2583, + 79, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac Performance EM', + 'Exhaust Manifold' + ), + ( + 2584, + 1, + 'Flathead Perf. EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Performance EM', + 'Exhaust Manifold' + ), + ( + 2585, + 5, + 'SB Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance EM', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB Performance EM', + 'Exhaust Manifold' + ), + ( + 2586, + 72, + '13 x 2 Organic Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Organic Drum Brake', + 'Brakes' + ), + ( + 2587, + 72, + '13 x 2 Organic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Organic Disk Brake', + 'Brakes' + ), + ( + 2588, + 72, + '13 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Organic HT Drum Brake', + 'Brakes' + ), + ( + 2589, + 72, + '13 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Organic HT Disk Brake', + 'Brakes' + ), + ( + 2590, + 72, + '13 x 2 Metallic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Metallic Disk Brake', + 'Brakes' + ), + ( + 2591, + 72, + '13 x 2 SM Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bendix 13 x 2 Semi-Metallic Disk Brake', + 'Brakes' + ), + ( + 2592, + 73, + '13 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '13 x 2 ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 13 x 2 Metallic Disk ABS Brake', + 'Brakes' + ), + ( + 2593, + 73, + '14 x 2 Org Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Organic Drum Brake', + 'Brakes' + ), + ( + 2594, + 73, + '14 x 2 Organic Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Organic Disk Brake', + 'Brakes' + ), + ( + 2595, + 73, + '14 x 2 Org HT Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Drum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Organic HT Drum Brake', + 'Brakes' + ), + ( + 2596, + 73, + '14 x 2 Org HT Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ansman 14 x 2 Organic HT Disk Brake', + 'Brakes' + ), + ( + 2597, + 71, + '9 x 2 SM Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Disk', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Semi-Metallic Disk Brakes', + 'Brakes' + ), + ( + 2598, + 71, + '9 x 2 Metal Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9 x 2 Disk ABS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AC Delco 9 x 2 Metallic Disk ABS Brakes', + 'Brakes' + ), + ( + 2599, + 101, + '205/40/17VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/40/17VR Performance', + 'Tires' + ), + ( + 2600, + 101, + '225/50/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 225/50/15VR Performance', + 'Tires' + ), + ( + 2601, + 101, + '205/50/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 205/50/15VR Performance', + 'Tires' + ), + ( + 2602, + 101, + '195/50/15VR Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Yokohama 195/50/15VR Performance', + 'Tires' + ), + ( + 2603, + 100, + '225/50/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 225/50/15 Radial', + 'Tires' + ), + ( + 2604, + 100, + '205/50/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/50/15 Radial', + 'Tires' + ), + ( + 2605, + 100, + '195/50/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/50/15 Radial', + 'Tires' + ), + ( + 2606, + 100, + '205/55/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/55/15 Radial', + 'Tires' + ), + ( + 2607, + 100, + '195/55/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/55/15 Radial', + 'Tires' + ), + ( + 2608, + 100, + '215/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 215/60/15 Radial', + 'Tires' + ), + ( + 2609, + 100, + '205/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/60/15 Radial', + 'Tires' + ), + ( + 2610, + 100, + '195/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/60/15 Radial', + 'Tires' + ), + ( + 2611, + 100, + '205/65/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 205/65/15 Radial', + 'Tires' + ), + ( + 2612, + 100, + '185/65/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 185/65/15 Radial', + 'Tires' + ), + ( + 2613, + 100, + '195/60/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/60/14 Radial', + 'Tires' + ), + ( + 2614, + 100, + '185/60/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 185/60/14 Radial', + 'Tires' + ), + ( + 2615, + 100, + '195/65/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 195/65/14 Radial', + 'Tires' + ), + ( + 2616, + 100, + '175/65/14 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 175/65/14 Radial', + 'Tires' + ), + ( + 2617, + 1, + '429-V8 NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429-V8 NASCAR', + 'Engine Block' + ), + ( + 2618, + 1, + '429-V8 NASCAR Mg', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'highly experimental magnesium block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '429 NASCAR Mg', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 429-V8 NASCAR Mg', + 'Engine Block' + ), + ( + 2619, + 5, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Wedge Top (0.5) Piston', + 'Pistons' + ), + ( + 2620, + 1, + 'FH Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Wedge Top Piston', + 'Pistons' + ), + ( + 2621, + 1, + 'Flathead Domed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Domed Top Piston', + 'Pistons' + ), + ( + 2622, + 8, + 'Hemi Recessed Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Recessed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Recessed FA Piston', + 'Pistons' + ), + ( + 2623, + 8, + 'Hemi Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Hemi Wedge FA Piston', + 'Pistons' + ), + ( + 2624, + 4, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Wedge Top Piston', + 'Pistons' + ), + ( + 2625, + 4, + 'Stock FA', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock FA', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock FA Piston', + 'Pistons' + ), + ( + 2626, + 4, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Wedge FA Piston', + 'Pistons' + ), + ( + 2627, + 6, + 'Wedge Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Wedge Top Piston', + 'Pistons' + ), + ( + 2628, + 6, + 'Nailhead Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Solid Valvetrain', + 'Valve Train' + ), + ( + 2629, + 6, + 'SB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Solid Valvetrain', + 'Valve Train' + ), + ( + 2630, + 6, + 'BB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Solid Valvetrain', + 'Valve Train' + ), + ( + 2631, + 79, + 'L-Head Flow Control', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flow Control', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2632, + 4, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac Solid Valvetrain', + 'Valve Train' + ), + ( + 2633, + 80, + 'Flathead Super Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flathead Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Ford Flathead Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2634, + 5, + 'SB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile SB Solid Valvetrain', + 'Valve Train' + ), + ( + 2635, + 5, + 'BB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldsmobile BB Solid Valvetrain', + 'Valve Train' + ), + ( + 2636, + 5, + 'W-31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W-31', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB W-31 FS Rod', + 'Connecting Rods' + ), + ( + 2637, + 13, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Ford Flathead Stock FS Rod', + 'Connecting Rods' + ), + ( + 2638, + 58, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Pro Billet Chrysler Hemi Rod', + 'Connecting Rods' + ), + ( + 2639, + 74, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Titanium', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Titanium Chrysler Hemi Connecting Rod', + 'Connecting Rods' + ), + ( + 2640, + 74, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Lightweight Billet Steel Chrysler Hemi Rod', + 'Connecting Rods' + ), + ( + 2641, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Chrysler Hemi Rod', + 'Connecting Rods' + ), + ( + 2642, + 74, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Billet Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crower Billet Steel Chrysler SB Rod', + 'Connecting Rods' + ), + ( + 2643, + 58, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Sportsman H-Beam', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lunati Sportsman H-Beam Chevrolet W Rod', + 'Connecting Rods' + ), + ( + 2644, + 3, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet W Stock FS Rod', + 'Connecting Rods' + ), + ( + 2645, + 80, + 'Nailhead Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Nailhead Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2646, + 80, + 'Buick SB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick SB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2647, + 80, + 'Buick BB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick BB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick BB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2648, + 79, + 'L-Head Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L-Head Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac L-Head Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2649, + 79, + 'Cadillac Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2650, + 4, + 'Stock BB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock CI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock CI Rod', + 'Connecting Rods' + ), + ( + 2651, + 4, + 'Forged Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Forged Steel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head FS Rod', + 'Connecting Rods' + ), + ( + 2652, + 6, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock FS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick SB FS Stock Rod', + 'Connecting Rods' + ), + ( + 2653, + 6, + 'Nailhead 364', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead 364', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead 364 FS Rod', + 'Connecting Rods' + ), + ( + 2654, + 50, + 'Big W Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch Chevy W Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2655, + 50, + 'Hemi Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Monarch Hemi Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2656, + 79, + 'FH Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flathead Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Ford Flathead Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2657, + 80, + 'Olds SB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds SB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Olds SB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2658, + 80, + 'Olds BB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Olds BB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2659, + 44, + 'HiPo Adept', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HiPo Adept', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Blinsky HiPo Adept Domed Aluminum Piston', + 'Pistons' + ), + ( + 2660, + 97, + '245/45/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 245/45/17ZR High Performance', + 'Tires' + ), + ( + 2661, + 97, + '225/60/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/60/16ZR High Performance', + 'Tires' + ), + ( + 2662, + 81, + '671', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '671', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Weiand 671 Blower', + 'Blower' + ), + ( + 2663, + 81, + '871', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '871', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Weiand 871 Blower', + 'Blower' + ), + ( + 2664, + 81, + '1071', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1071', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Weiand 1071 Blower', + 'Blower' + ), + ( + 2665, + 13, + 'Performer IAS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer IAS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer IAS Shock', + 'Shocks' + ), + ( + 2666, + 13, + 'Street Stock Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Stock Race', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Street Stock Race Shock', + 'Shocks' + ), + ( + 2667, + 13, + '24 Stud', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '24 Stud', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Ford Flathead Cylinder Head', + 'Cylinder Head' + ), + ( + 2668, + 13, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Chevrolet W Exhaust Headers', + 'Exhaust Manifold' + ), + ( + 2669, + 13, + 'TES Exh. Headers 385', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Ford 385 Exhaust Headers', + 'Exhaust Manifold' + ), + ( + 2670, + 13, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Exhaust Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TES Pontiac Exhaust Headers', + 'Exhaust Manifold' + ), + ( + 2671, + 13, + 'Cat-Back System', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cat-Back', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Cat-Back System Exhaust Pipes', + 'Exhaust Pipe' + ), + ( + 2672, + 18, + 'Fat Shiny', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fat Shiny', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fat Shiny Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 2673, + 13, + 'AB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock AB Coil Spring', + 'Springs' + ), + ( + 2674, + 13, + 'AS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock AS Coil Spring', + 'Springs' + ), + ( + 2675, + 13, + 'AGB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AGB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock AGB Coil Spring', + 'Springs' + ), + ( + 2676, + 13, + 'M', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'M', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock M Coil Spring', + 'Springs' + ), + ( + 2677, + 13, + 'F', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'F', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock F Coil Spring', + 'Springs' + ), + ( + 2678, + 13, + 'Tubular Panhard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tubular Panhard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Tubular Panhard Rod', + 'Sway Bar' + ), + ( + 2679, + 13, + 'Anti-Hop Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Anti-Hop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Anti-Hop Bar', + 'Traction Bar' + ), + ( + 2680, + 13, + 'Pro-Flo Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Flo Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Pro-Flo Round Air Cleaner', + 'Air Cleaner' + ), + ( + 2681, + 13, + 'Pro-Flo Oval', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Flo Oval', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Pro-Flo Oval Air Cleaner', + 'Air Cleaner' + ), + ( + 2682, + 13, + 'Pro-Flo Triangular', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Flo Triangular', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Pro-Flo Triangular Air Cleaner', + 'Air Cleaner' + ), + ( + 2683, + 13, + 'Elite Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Elite Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Elite Round Air Cleaner', + 'Air Cleaner' + ), + ( + 2684, + 13, + 'Elite Oval', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Elite Oval', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Elite Oval Air Cleaner', + 'Air Cleaner' + ), + ( + 2685, + 13, + 'Elite Triangular', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Elite Triangular', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Elite Triangular Air Cleaner', + 'Air Cleaner' + ), + ( + 2686, + 13, + 'Victor Series', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Victor Series', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Victor Series Cooling System', + 'Cooling System' + ), + ( + 2687, + 13, + 'Performer 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer 4V (500 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer 4V (500 cfm) Carburetor', + 'Carburetor' + ), + ( + 2688, + 13, + 'Performer 4V (750 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer 4V (750 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer 4V (750 cfm) Carburetor', + 'Carburetor' + ), + ( + 2689, + 13, + 'Q-Jet (795 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Q-Jet (795 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Q-Jet (795 cfm) Carburetor', + 'Carburetor' + ), + ( + 2690, + 13, + 'Q-Jet (850 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Q-Jet (850 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Q-Jet (850 cfm) Carburetor', + 'Carburetor' + ), + ( + 2691, + 13, + 'Torker AMC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Torker AMC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Torker AMC IM', + 'Intake Manifold' + ), + ( + 2692, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer AMC IM', + 'Intake Manifold' + ), + ( + 2693, + 13, + 'Pro-Flo EFI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pro-Flo EFI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Pro-Flo EFI System', + 'Carburetor' + ), + ( + 2694, + 14, + 'Excelerator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Excelerator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Excelerator Ignition', + 'Electrical System' + ), + ( + 2695, + 14, + 'Dominator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dominator', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Dominator Ignition', + 'Electrical System' + ), + ( + 2696, + 14, + 'Avenger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Avenger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley Avenger Ignition', + 'Electrical System' + ), + ( + 2697, + 14, + 'SystemMax Chevrolet BB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SystemMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Holley SystemMax Chevrolet BB CH', + 'Cylinder Head' + ), + ( + 2698, + 1, + 'E4 Low Range', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'E4 Low Range', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'E4 Low Range Ford Y Camshaft', + 'Camshaft' + ), + ( + 2699, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus AMC Camshaft', + 'Camshaft' + ), + ( + 2700, + 11, + 'WG', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'WG', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC WG Stock+ Camshaft', + 'Camshaft' + ), + ( + 2701, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Olds SB HP Cam', + 'Camshaft' + ), + ( + 2702, + 13, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Plus Olds BB HP Cam', + 'Camshaft' + ), + ( + 2703, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer AMC Hydraulic Lifters', + 'Valve Train' + ), + ( + 2704, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Chevrolet BB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2705, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Chevrolet SB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2706, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Chrysler BB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2707, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Chrysler SB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2708, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Ford 385 Hydraulic Lifters', + 'Valve Train' + ), + ( + 2709, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Ford BB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2710, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Ford C Hydraulic Lifters', + 'Valve Train' + ), + ( + 2711, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Ford SB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2712, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Oldsmobile BB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2713, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Oldsmobile SB Hydraulic Lifters', + 'Valve Train' + ), + ( + 2714, + 13, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Performer Pontiac Hydraulic Lifters', + 'Valve Train' + ), + ( + 2715, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Ford BB VT', + 'Valve Train' + ), + ( + 2716, + 21, + 'Energizer BSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Buick SB Valvetrain', + 'Valve Train' + ), + ( + 2717, + 21, + 'Energizer CBB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Chevrolet BB Valvetrain', + 'Valve Train' + ), + ( + 2718, + 21, + 'Energizer CSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Chevrolet SB Valvetrain', + 'Valve Train' + ), + ( + 2719, + 21, + 'Energizer CW', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Chevrolet W Valvetrain', + 'Valve Train' + ), + ( + 2720, + 21, + 'Energizer ChBB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Chrysler BB Valvetrain', + 'Valve Train' + ), + ( + 2721, + 21, + 'Energizer ChSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Chrysler SB Valvetrain', + 'Valve Train' + ), + ( + 2722, + 21, + 'Energizer F385', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Ford 385 Valvetrain', + 'Valve Train' + ), + ( + 2723, + 21, + 'Energizer FC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Ford C Valvetrain', + 'Valve Train' + ), + ( + 2724, + 21, + 'Energizer FSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Ford SB Valvetrain', + 'Valve Train' + ), + ( + 2725, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter AMC Valvetrain', + 'Valve Train' + ), + ( + 2726, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Buick SB Valvetrain', + 'Valve Train' + ), + ( + 2727, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chevrolet BB Valvetrain', + 'Valve Train' + ), + ( + 2728, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chevrolet SB Valvetrain', + 'Valve Train' + ), + ( + 2729, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chevrolet W Valvetrain', + 'Valve Train' + ), + ( + 2730, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chrysler BB Valvetrain', + 'Valve Train' + ), + ( + 2731, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chrysler Hemi Valvetrain', + 'Valve Train' + ), + ( + 2732, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Chrysler SB Valvetrain', + 'Valve Train' + ), + ( + 2733, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Ford 385 Valvetrain', + 'Valve Train' + ), + ( + 2734, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Ford C Valvetrain', + 'Valve Train' + ), + ( + 2735, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Ford SB Valvetrain', + 'Valve Train' + ), + ( + 2736, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller AMC VT', + 'Valve Train' + ), + ( + 2737, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chevrolet BB VT', + 'Valve Train' + ), + ( + 2738, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chevrolet SB VT', + 'Valve Train' + ), + ( + 2739, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chevrolet W VT', + 'Valve Train' + ), + ( + 2740, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chrysler BB VT', + 'Valve Train' + ), + ( + 2741, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chrysler Hemi VT', + 'Valve Train' + ), + ( + 2742, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Chrysler SB VT', + 'Valve Train' + ), + ( + 2743, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Ford 385 VT', + 'Valve Train' + ), + ( + 2744, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Ford C VT', + 'Valve Train' + ), + ( + 2745, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Ford SB VT', + 'Valve Train' + ), + ( + 2746, + 21, + 'Energizer OBB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Olds BB Valvetrain', + 'Valve Train' + ), + ( + 2747, + 21, + 'Energizer OSB', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Olds SB Valvetrain', + 'Valve Train' + ), + ( + 2748, + 21, + 'Energizer Pon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Energizer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane Energizer Hydraulic Pontiac Valvetrain', + 'Valve Train' + ), + ( + 2749, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Olds BB Valvetrain', + 'Valve Train' + ), + ( + 2750, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Olds SB Valvetrain', + 'Valve Train' + ), + ( + 2751, + 21, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Pontiac Valvetrain', + 'Valve Train' + ), + ( + 2752, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Olds BB VT', + 'Valve Train' + ), + ( + 2753, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Olds SB VT', + 'Valve Train' + ), + ( + 2754, + 21, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Roller Pontiac VT', + 'Valve Train' + ), + ( + 2755, + 11, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'NASCAR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC NASCAR CH', + 'Cylinder Head' + ), + ( + 2756, + 16, + '6V (600 cfm) R', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '6V (600 cfm)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rochester 6V (600 cfm) Carb', + 'Carburetor' + ), + ( + 2757, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker AMC Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2758, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Buick Nailhead Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2759, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac L-Head Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2760, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2761, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy SB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2762, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler SB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2763, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford Flathead Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2764, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford SB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2765, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford Y Block Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2766, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford Cleveland Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2767, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Oldsmobile SB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2768, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Oldsmobile BB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2769, + 82, + 'Hemi Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler Hemi Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 2770, + 11, + '401-V8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC 401-V8', + 'Engine Block' + ), + ( + 2771, + 11, + 'Stock (9.5) 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (9.5) 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (9.5) 401 W CH', + 'Cylinder Head' + ), + ( + 2772, + 11, + 'Stock (8.5) 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock (8.5) 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Stock (8.5) 401 W CH', + 'Cylinder Head' + ), + ( + 2773, + 38, + 'Aluminum AMC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum AMC', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offenhauser Aluminum AMC IM', + 'Intake Manifold' + ), + ( + 2774, + 1, + '9" (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (3.08) Differential', + 'Rear End' + ), + ( + 2775, + 1, + '9" (3.27)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (3.27)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (3.27) Differential', + 'Rear End' + ), + ( + 2776, + 1, + '9" (3.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (3.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (3.45) Differential', + 'Rear End' + ), + ( + 2777, + 1, + '9" (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (3.55) Differential', + 'Rear End' + ), + ( + 2778, + 1, + '9" (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (3.73) Differential', + 'Rear End' + ), + ( + 2779, + 1, + '9" (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '9" (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 9" (4.10) Differential', + 'Rear End' + ), + ( + 2780, + 1, + '8" (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (3.08) Differential', + 'Rear End' + ), + ( + 2781, + 1, + '8" (3.27)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (3.27)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (3.27) Differential', + 'Rear End' + ), + ( + 2782, + 1, + '8" (3.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (3.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (3.45) Differential', + 'Rear End' + ), + ( + 2783, + 1, + '8" (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (3.55) Differential', + 'Rear End' + ), + ( + 2784, + 1, + '8" (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (3.73) Differential', + 'Rear End' + ), + ( + 2785, + 1, + '8" (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '8" (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 8" (4.10) Differential', + 'Rear End' + ), + ( + 2786, + 15, + '10-bolt (2.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10-bolt (2.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (2.73) Differential', + 'Rear End' + ), + ( + 2787, + 15, + '10-bolt (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10-bolt (3.08)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (3.08) Differential', + 'Rear End' + ), + ( + 2788, + 15, + '10-bolt (3.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10-bolt (3.36)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (3.36) Differential', + 'Rear End' + ), + ( + 2789, + 15, + '10-bolt (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10-bolt (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (3.55) Differential', + 'Rear End' + ), + ( + 2790, + 15, + '10-bolt (3.70)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '10-bolt (3.70)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (3.70) Differential', + 'Rear End' + ), + ( + 2791, + 15, + '12-bolt (2.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (2.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (2.73) Differential', + 'Rear End' + ), + ( + 2792, + 15, + '12-bolt (3.07)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (3.07)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (3.07) Differential', + 'Rear End' + ), + ( + 2793, + 15, + '12-bolt (3.31)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (3.31)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 10-bolt (3.31) Differential', + 'Rear End' + ), + ( + 2794, + 15, + '12-bolt (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (3.55)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (3.55) Differential', + 'Rear End' + ), + ( + 2795, + 15, + '12-bolt (3.55) Police', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (3.55) Police', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (3.55) Police Differential', + 'Rear End' + ), + ( + 2796, + 15, + '12-bolt (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (3.73) Differential', + 'Rear End' + ), + ( + 2797, + 15, + '12-bolt (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '12-bolt (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM 12-bolt (4.10) Differential', + 'Rear End' + ), + ( + 2798, + 67, + '14-bolt (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14-bolt (4.10)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall 14-bolt (4.10) Differential', + 'Rear End' + ), + ( + 2799, + 67, + '14-bolt (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14-bolt (3.73)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall 14-bolt (3.73) Differential', + 'Rear End' + ), + ( + 2800, + 67, + '14-bolt (3.42)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '14-bolt (3.42)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall 14-bolt (3.42) Differential', + 'Rear End' + ), + ( + 2801, + 67, + 'Helix 3 Spd (M)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Helix (M)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall Helix 3 Spd (M)', + 'Transmission' + ), + ( + 2802, + 67, + 'Helix 3 Spd (A)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Helix (A)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hall Helix 3 Spd (A)', + 'Transmission' + ), + ( + 2803, + 1, + 'Stock Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 4V', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Stock 4V IM', + 'Intake Manifold' + ), + ( + 2804, + 1, + 'Dual Quad Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 2x4', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Stock 2x4 IM', + 'Intake Manifold' + ), + ( + 2805, + 1, + 'Supercharger Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock Blown', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Supercharger IM', + 'Intake Manifold' + ), + ( + 2806, + 13, + '3x2V Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2 Alumimun', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Y Block 3x2 IM', + 'Intake Manifold' + ), + ( + 2807, + 13, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Alumimun', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Y Block 4V Aluminum IM', + 'Intake Manifold' + ), + ( + 2808, + 13, + 'Aluminum Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Alumimum Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Edelbrock Y Block 4V Aluminum Single', + 'Intake Manifold' + ), + ( + 2809, + 38, + '3x2V Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '3x2V Alumimun', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offy Y Block 3x2 Aluminum IM', + 'Intake Manifold' + ), + ( + 2810, + 38, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Alumimun', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offy Y Block Aluminum 4V IM', + 'Intake Manifold' + ), + ( + 2811, + 38, + 'Aluminum Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Alumimum Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Offy Y Block Aluminum 4V Single IM', + 'Intake Manifold' + ), + ( + 2812, + 83, + 'Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Alumimun', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Aluminum 4V IM', + 'Intake Manifold' + ), + ( + 2813, + 83, + 'Special Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '4V Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Special 4V IM', + 'Intake Manifold' + ), + ( + 2814, + 83, + 'Lightning Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightning Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Lightning 4V Single IM', + 'Intake Manifold' + ), + ( + 2815, + 83, + 'HiBoy Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'HiBoy Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block HiBoy Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2816, + 83, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Midget Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2817, + 83, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Strip King Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2818, + 1, + 'Factory Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Factory Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Factory Headers', + 'Exhaust Manifold' + ), + ( + 2819, + 83, + 'Free Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Free Flow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Free Flow EM', + 'Exhaust Manifold' + ), + ( + 2820, + 83, + 'Free Flow Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Free Flow Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Free Flow Aluminum EM', + 'Exhaust Manifold' + ), + ( + 2821, + 83, + 'Street King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Street King Small Headers', + 'Exhaust Manifold' + ), + ( + 2822, + 83, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Strip King Small Headers', + 'Exhaust Manifold' + ), + ( + 2823, + 83, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Track King Large Headers', + 'Exhaust Manifold' + ), + ( + 2824, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Y Block Air Stream EM', + 'Exhaust Manifold' + ), + ( + 2825, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Y Block Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 2826, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Y Block Super Stream Large Headers', + 'Exhaust Manifold' + ), + ( + 2827, + 83, + 'Street King Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Street King Solid Valvetrain', + 'Valve Train' + ), + ( + 2828, + 83, + 'Strip King Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Strip King Solid Valvetrain', + 'Valve Train' + ), + ( + 2829, + 83, + 'Race Pro Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Pro Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Y Block Race Pro Roller Valvetrain', + 'Valve Train' + ), + ( + 2830, + 84, + 'Speed Lifter Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lifter Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Y Block Speed Lifter Solid Valvetrain', + 'Valve Train' + ), + ( + 2831, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Y Block Super Lift Solid Valvetrain', + 'Valve Train' + ), + ( + 2832, + 85, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Y Block Solid Valvetrain', + 'Valve Train' + ), + ( + 2833, + 85, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Y Block Performance Solid Valvetrain', + 'Valve Train' + ), + ( + 2834, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Y Block Race Roller Valvetrain', + 'Valve Train' + ), + ( + 2835, + 87, + 'Wedge Top (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top (.15) Piston', + 'Pistons' + ), + ( + 2836, + 87, + 'Wedge Top (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top (.35) Piston', + 'Pistons' + ), + ( + 2837, + 87, + 'Wedge Top (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top (.4) Piston', + 'Pistons' + ), + ( + 2838, + 87, + 'Wedge Top (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top (.2) Piston', + 'Pistons' + ), + ( + 2839, + 87, + 'Wedge Top (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge Top (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Wedge Top (.3) Piston', + 'Pistons' + ), + ( + 2840, + 86, + 'Domed (.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Domed (.1) Piston', + 'Pistons' + ), + ( + 2841, + 86, + 'Domed (.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Domed (.45) Piston', + 'Pistons' + ), + ( + 2842, + 86, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Domed (.2) Piston', + 'Pistons' + ), + ( + 2843, + 86, + 'Domed (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Domed (.35) Piston', + 'Pistons' + ), + ( + 2844, + 86, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Domed (.5) Piston', + 'Pistons' + ), + ( + 2845, + 88, + 'Super 292', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Extra Y', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Y Block Super 292 Crankshaft', + 'Crankshaft' + ), + ( + 2846, + 88, + 'Super 312', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Bird Specia', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely y Block Super 312 Crankshaft', + 'Crankshaft' + ), + ( + 2847, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Marathon Crankshaft', + 'Crankshaft' + ), + ( + 2848, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2849, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Champion Crankshaft', + 'Crankshaft' + ), + ( + 2851, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Stump Puller Crankshaft', + 'Crankshaft' + ), + ( + 2852, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Street Max Crankshaft', + 'Crankshaft' + ), + ( + 2853, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Super Max Crankshaft', + 'Crankshaft' + ), + ( + 2854, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Stump Puller Connecting Rods', + 'Connecting Rods' + ), + ( + 2855, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Street Max Connecting Rods', + 'Connecting Rods' + ), + ( + 2856, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Y Block Super Max Connecting Rods', + 'Connecting Rods' + ), + ( + 2857, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Marathon Connecting Rods', + 'Connecting Rods' + ), + ( + 2858, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Lightweight Connecting Rods', + 'Connecting Rods' + ), + ( + 2859, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Champion Connecting Rods', + 'Connecting Rods' + ), + ( + 2860, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Y Block Legend Connecting Rods', + 'Connecting Rods' + ), + ( + 2861, + 88, + 'Extra Y', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Extra Y', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Y Block Extra Y Connecting Rods', + 'Connecting Rods' + ), + ( + 2862, + 88, + 'T-Bird Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T-Bird Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Y Block T-Bird Special Connecting Rods', + 'Connecting Rods' + ), + ( + 2863, + 89, + 'Street 39', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 39', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Street 39 Camshaft', + 'Camshaft' + ), + ( + 2864, + 89, + 'Street 40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Street 40 Camshaft', + 'Camshaft' + ), + ( + 2865, + 89, + 'Super 39', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 39', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Super 39 HP Camshaft', + 'Camshaft' + ), + ( + 2866, + 89, + 'Super 40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 40', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Super 40 HP Camshaft', + 'Camshaft' + ), + ( + 2867, + 89, + 'Super 43', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 43', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Super 43 HP Camshaft', + 'Camshaft' + ), + ( + 2868, + 89, + 'Super 44', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 44', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Super 44 HP Camshaft', + 'Camshaft' + ), + ( + 2869, + 89, + 'Ultra 44', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultra 44', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Ultra 44 DP Camshaft', + 'Camshaft' + ), + ( + 2870, + 89, + 'Ultra 48', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultra 48', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Ultra 48 DP Camshaft', + 'Camshaft' + ), + ( + 2871, + 89, + 'Street 36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 36', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Y Block Street 36 Camshaft', + 'Camshaft' + ), + ( + 2872, + 9, + 'Charger R/T', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 2873, + 1, + 'Boss 302 (10.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss 302 (10.5) 2.19/1.72 Canted CH', + 'Cylinder Head' + ), + ( + 2874, + 1, + 'TP (10.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'TP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB TP Wedge CH', + 'Cylinder Head' + ), + ( + 2875, + 1, + 'Wedge (9.0) 1.84', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (9.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB (9.0) 1.84i/1.54e Wedge CH', + 'Cylinder Head' + ), + ( + 2876, + 1, + '70 Mustang Factory Scoop Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '70 Mustang Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 70 Mustang Factory Scoop Hood', + 'Hood' + ), + ( + 2877, + 90, + 'Big Bad AMX - AI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 2878, + 90, + 'Chevrolet Corvette - AI', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 2879, + 91, + 'Vortex Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vortex Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Vortex Single Plane IM', + 'Intake Manifold' + ), + ( + 2880, + 91, + 'Screamer Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Screamer Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Screamer Dual Plane IM', + 'Intake Manifold' + ), + ( + 2881, + 91, + 'Scooter Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Scooter Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Scooter Dual Plane IM', + 'Intake Manifold' + ), + ( + 2882, + 91, + 'Scooter Alum. Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Scooter Alum. Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Scooter Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 2883, + 92, + 'Classic Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Classic Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Classic Dual Plane IM', + 'Intake Manifold' + ), + ( + 2884, + 92, + 'Street Classic Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Classic Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Street Classic Dual Plane IM', + 'Intake Manifold' + ), + ( + 2885, + 92, + 'Classic Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Classic Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Classic Single Plane IM', + 'Intake Manifold' + ), + ( + 2886, + 92, + 'Super Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Super Single Plane IM', + 'Intake Manifold' + ), + ( + 2887, + 91, + 'Vortex Ultra Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vortex Ultra Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Vortex Ultra Light Single Plane IM', + 'Intake Manifold' + ), + ( + 2888, + 91, + 'Power Tower Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power Tower Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Power Tower Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2889, + 91, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Ultimate Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2890, + 92, + 'Classic Low Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Classic Low Tunnel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Classic Low Rise Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2891, + 92, + 'Classic Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Classic High Tunnel', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C & B Chevy SB Classic High Rise Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2892, + 91, + 'Screamer Ultra Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Screamer Ultra Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Screamer Ultra Light Dual Plane IM', + 'Intake Manifold' + ), + ( + 2893, + 91, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Rumble Pipe Small Headers', + 'Exhaust Manifold' + ), + ( + 2894, + 91, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Street Lion Small Headers', + 'Exhaust Manifold' + ), + ( + 2895, + 91, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Window Rattler Larger Headers', + 'Exhaust Manifold' + ), + ( + 2896, + 92, + 'Masterpiece', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Masterpiece', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Masterpiece EM', + 'Exhaust Manifold' + ), + ( + 2897, + 92, + 'Blueprint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Blueprint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Blueprint EM', + 'Exhaust Manifold' + ), + ( + 2898, + 92, + 'Beach Racer Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Beach Racer Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Beach Racer Small Headers', + 'Exhaust Manifold' + ), + ( + 2899, + 91, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy SB Street Mod EM', + 'Exhaust Manifold' + ), + ( + 2900, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Chevy SB Wedge (.15) Piston', + 'Pistons' + ), + ( + 2901, + 41, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Chevy SB Wedge (.35) Piston', + 'Pistons' + ), + ( + 2902, + 41, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Chevy SB Domed (.2) Piston', + 'Pistons' + ), + ( + 2903, + 41, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Chevy SB Domed (.3) Piston', + 'Pistons' + ), + ( + 2904, + 92, + 'Domed (.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.1) Piston', + 'Pistons' + ), + ( + 2905, + 92, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.2) Piston', + 'Pistons' + ), + ( + 2906, + 92, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.3) Piston', + 'Pistons' + ), + ( + 2907, + 92, + 'Domed (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.4) Piston', + 'Pistons' + ), + ( + 2908, + 92, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.5) Piston', + 'Pistons' + ), + ( + 2909, + 92, + 'Domed (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.6) Piston', + 'Pistons' + ), + ( + 2910, + 92, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'C&B Chevy SB Domed (.75) Piston', + 'Pistons' + ), + ( + 2911, + 84, + 'Speed Lifter Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lifter Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy SB Speed Lifter Solid Valvetrain', + 'Valve Train' + ), + ( + 2912, + 84, + 'Street Plus Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Plus Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy SB Street Plus Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2913, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy SB Premier Roller Valvetrain', + 'Valve Train' + ), + ( + 2914, + 85, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy SB Performance Solid Valvetrain', + 'Valve Train' + ), + ( + 2915, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy SB Performance Hydraulic Valvetrain', + 'Valve Train' + ), + ( + 2916, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy SB Race Roller Valvetrain', + 'Valve Train' + ), + ( + 2917, + 6, + 'Stock 364 Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '364 Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 364 DP IM', + 'Intake Manifold' + ), + ( + 2918, + 6, + 'Stock 401/425 Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '401/425 Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 401/425 DP IM', + 'Intake Manifold' + ), + ( + 2919, + 80, + 'Improved Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Improved Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Improved DP IM', + 'Intake Manifold' + ), + ( + 2920, + 80, + 'Breezer Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Breezer Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Breezer DP IM', + 'Intake Manifold' + ), + ( + 2921, + 93, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Buick Nailhead Street Port DP IM', + 'Intake Manifold' + ), + ( + 2922, + 93, + 'Street Port Alum. Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Alum.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Buick Nailhead Street Port Aluminum DP IM', + 'Intake Manifold' + ), + ( + 2923, + 80, + 'Tornado Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tornado Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Tornado SP IM', + 'Intake Manifold' + ), + ( + 2924, + 93, + 'Street Port Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Buick Nailhead Street Port SP IM', + 'Intake Manifold' + ), + ( + 2925, + 80, + 'Wind Tunnel Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wind Tunnel Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Wind Tunnel SP IM', + 'Intake Manifold' + ), + ( + 2926, + 80, + 'Cyclone Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cyclone Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Cyclone Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2927, + 80, + 'Hurricane Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hurricane Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Hurricane Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2928, + 80, + 'Super Cyclone Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Cyclone Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Super Cyclone Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2929, + 83, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Performance DP IM', + 'Intake Manifold' + ), + ( + 2930, + 83, + 'Perf. Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Alum. Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Performance Aluminum DP IM', + 'Intake Manifold' + ), + ( + 2931, + 93, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Road Squire DP IM', + 'Intake Manifold' + ), + ( + 2932, + 93, + 'Road Squire LW Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rd. Squire Alum. Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Road Squire Aluminum SP IM', + 'Intake Manifold' + ), + ( + 2933, + 93, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Centurion DP IM', + 'Intake Manifold' + ), + ( + 2934, + 93, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Street Knight SP IM', + 'Intake Manifold' + ), + ( + 2935, + 83, + 'Lightning Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightning Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Lightning SP IM', + 'Intake Manifold' + ), + ( + 2936, + 93, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Commander SP IM', + 'Intake Manifold' + ), + ( + 2937, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Emperor Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2938, + 83, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Midget Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2939, + 83, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Strip King Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2940, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford SB Street Lord Tunnel Ram IM', + 'Intake Manifold' + ), + ( + 2941, + 41, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Domed (.3) Piston', + 'Pistons' + ), + ( + 2942, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Domed (.75) Piston', + 'Pistons' + ), + ( + 2943, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Wedge (.5) Piston', + 'Pistons' + ), + ( + 2944, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Wedge (.15) Piston', + 'Pistons' + ), + ( + 2945, + 41, + 'Wedge (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford SB Wedge (.4) Piston', + 'Pistons' + ), + ( + 2946, + 86, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford SB Domed (.2) Piston', + 'Pistons' + ), + ( + 2947, + 86, + 'Domed (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford SB Domed (.35) Piston', + 'Pistons' + ), + ( + 2948, + 86, + 'Domed (.65)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.65)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford SB Domed (.65) Piston', + 'Pistons' + ), + ( + 2949, + 87, + 'Wedge (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Wedge (.3) Piston', + 'Pistons' + ), + ( + 2950, + 87, + 'Wedge (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Wedge (.6) Piston', + 'Pistons' + ), + ( + 2951, + 87, + 'Recessed (-.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.45)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Recessed (-.45) Piston', + 'Pistons' + ), + ( + 2952, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 2953, + 86, + 'Recessed (-.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford SB Recessed (-.15) Piston', + 'Pistons' + ), + ( + 2954, + 86, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Domed (.3) Piston', + 'Pistons' + ), + ( + 2955, + 87, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Domed (.25) Piston', + 'Pistons' + ), + ( + 2956, + 86, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Domed (.5) Piston', + 'Pistons' + ), + ( + 2957, + 86, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Wedge (.25) Piston', + 'Pistons' + ), + ( + 2958, + 87, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Wedge (.35) Piston', + 'Pistons' + ), + ( + 2959, + 86, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Wedge (.15) Piston', + 'Pistons' + ), + ( + 2960, + 87, + 'Recessed (-.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Recessed (-.2) Piston', + 'Pistons' + ), + ( + 2961, + 86, + 'Recessed (-.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.1)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Recessed (-.1) Piston', + 'Pistons' + ), + ( + 2962, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Recessed (-.25) Piston', + 'Pistons' + ), + ( + 2963, + 86, + 'Recessed (-.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Recessed (-.35) Piston', + 'Pistons' + ), + ( + 2964, + 86, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Flat Top Piston', + 'Pistons' + ), + ( + 2965, + 87, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flat Top', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Flat Top Piston', + 'Pistons' + ), + ( + 2966, + 88, + 'Century Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Century Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Buick Nailhead Century Special Rods', + 'Connecting Rods' + ), + ( + 2967, + 88, + 'Riviera Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Riviera Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Buick Nailhead Riviera Special Rods', + 'Connecting Rods' + ), + ( + 2968, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Champion Rods', + 'Connecting Rods' + ), + ( + 2969, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Legend Rods', + 'Connecting Rods' + ), + ( + 2970, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Lightweight Rods', + 'Connecting Rods' + ), + ( + 2971, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Marathon Rods', + 'Connecting Rods' + ), + ( + 2972, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Stump Puller Rods', + 'Connecting Rods' + ), + ( + 2973, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Street Max Rods', + 'Connecting Rods' + ), + ( + 2974, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Super Max Rods', + 'Connecting Rods' + ), + ( + 2975, + 88, + 'T351 Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'T351 Billet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Ford SB T351 Billet Rods', + 'Connecting Rods' + ), + ( + 2976, + 88, + 'Power I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power I', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Ford SB Power I Rods', + 'Connecting Rods' + ), + ( + 2977, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford SB Champion Crankshaft', + 'Crankshaft' + ), + ( + 2978, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Super Max Crankshaft', + 'Crankshaft' + ), + ( + 2979, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford SB Street Max Crankshaft', + 'Crankshaft' + ), + ( + 2980, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Stump Puller Crankshaft', + 'Crankshaft' + ), + ( + 2981, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Super Max Crankshaft', + 'Crankshaft' + ), + ( + 2982, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Buick Nailhead Street Max Crankshaft', + 'Crankshaft' + ), + ( + 2983, + 88, + 'Super 300', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 300', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Buick Nailhead Super 300 Crankshaft', + 'Crankshaft' + ), + ( + 2984, + 88, + 'Super 400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 400', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Buick Nailhead Super 400 Crankshaft', + 'Crankshaft' + ), + ( + 2985, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Champion Crankshaft', + 'Crankshaft' + ), + ( + 2986, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 2987, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Buick Nailhead Marathon Crankshaft', + 'Crankshaft' + ), + ( + 2988, + 84, + 'Super Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Buick Nailhead Super Lift VT', + 'Valve Train' + ), + ( + 2989, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Buick Nailhead Performance Hydraulic VT', + 'Valve Train' + ), + ( + 2990, + 80, + 'Craftsmith Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Craftsmith Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Craftsmith Roller VT', + 'Valve Train' + ), + ( + 2991, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Buick Nailhead Race Roller VT', + 'Valve Train' + ), + ( + 2992, + 85, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Buick Nailhead Solid VT', + 'Valve Train' + ), + ( + 2993, + 84, + 'Speed Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Buick Nailhead Speed Lift VT', + 'Valve Train' + ), + ( + 2994, + 80, + 'Craftsmith Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Craftsmith Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Craftsmith Hydraulic VT', + 'Valve Train' + ), + ( + 2995, + 80, + 'Craftsmith Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Craftsmith Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Craftsmith Solid VT', + 'Valve Train' + ), + ( + 2996, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Street King VT', + 'Valve Train' + ), + ( + 2997, + 83, + 'Strip King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Strip King VT', + 'Valve Train' + ), + ( + 2998, + 84, + 'Speed Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Ford SB Speed Lift VT', + 'Valve Train' + ), + ( + 2999, + 84, + 'Super Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Ford SB Super Lift VT', + 'Valve Train' + ), + ( + 3000, + 85, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Ford SB Solid VT', + 'Valve Train' + ), + ( + 3001, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Ford SB Performance Hydraulic VT', + 'Valve Train' + ), + ( + 3002, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Ford SB Race Roller VT', + 'Valve Train' + ), + ( + 3003, + 90, + 'AI 57 Vette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3004, + 90, + 'AI 69 Runner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3005, + 90, + 'AI 1964 Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3006, + 90, + 'AI 1949 Mercury Mod Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3007, + 90, + 'AI 1966 Shelby Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3008, + 1, + 'AI 70 Mustang', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3009, + 3, + 'AI Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3010, + 1, + 'AI 1953 Ford Crestline', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3011, + 3, + 'AI 1958 Chevy Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3012, + 3, + 'AI Chevy Bel Air', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3013, + 3, + 'AI 1955 Chevy Buick Century', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3014, + 90, + 'AI 1967 Chevy Chevelle SS', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3015, + 1, + 'AI 1970 Ford Boss 429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3016, + 10, + 'AI 1970 Plymouth Mod Cuda', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3017, + 4, + 'AI 1947 Cadillac Series 62', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3018, + 3, + 'AI 1957 Chevy Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3019, + 89, + 'Street 45', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 45', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Buick Nailhead Street 45 Camshaft', + 'Camshaft' + ), + ( + 3020, + 89, + 'Street 47', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 47', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Buick Nailhead Street 47 Camshaft', + 'Camshaft' + ), + ( + 3021, + 89, + 'Street 48', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street 48', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Buick Nailhead Street 48', + 'Camshaft' + ), + ( + 3022, + 89, + 'Super 47', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 47', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Buick Nailhead Super 47 Camshaft', + 'Camshaft' + ), + ( + 3023, + 89, + 'Super 49', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 49', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Fyne Grind Buick Nailhead Super 49 Camshaft', + 'Camshaft' + ), + ( + 3024, + 6, + 'Stock 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 401', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 401 Camshaft', + 'Camshaft' + ), + ( + 3025, + 6, + 'Stock 425', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock 425', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock 425 Camshaft', + 'Camshaft' + ), + ( + 3026, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford SB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3027, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford SB Super Stream Large Headers', + 'Exhaust Manifold' + ), + ( + 3028, + 80, + 'Street Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Street Headers', + 'Exhaust Manifold' + ), + ( + 3029, + 80, + 'Performance Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Performance Headers', + 'Exhaust Manifold' + ), + ( + 3030, + 80, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Lightweight EM', + 'Exhaust Manifold' + ), + ( + 3031, + 80, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dunbar Buick Nailhead Performance EM', + 'Exhaust Manifold' + ), + ( + 3032, + 83, + 'Police Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Police Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford SB Police Special EM', + 'Exhaust Manifold' + ), + ( + 3033, + 76, + '245/50/16ZR SCUT', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Panteli 245/50/16ZR SCUT', + 'Tires' + ), + ( + 3034, + 76, + '225/60/16ZR SCUT', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Panteli 225/60/16ZR SCUT', + 'Tires' + ), + ( + 3035, + 76, + '245/45/17ZR SCUT', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Panteli 245/45/17ZR SCUT', + 'Tires' + ), + ( + 3036, + 94, + 'Street Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Street Dual Plane IM', + 'Intake Manifold' + ), + ( + 3037, + 94, + 'Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Stocker Dual Plane IM', + 'Intake Manifold' + ), + ( + 3038, + 94, + 'Street Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Street Single Plane IM', + 'Intake Manifold' + ), + ( + 3039, + 94, + 'Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3040, + 94, + 'Super Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stocker Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Super Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3041, + 94, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Intimidator Tunnel Ram', + 'Intake Manifold' + ), + ( + 3042, + 94, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Bighorn Tunnel Ram', + 'Intake Manifold' + ), + ( + 3043, + 93, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chrysler SB Centurion Dual Plane IM', + 'Intake Manifold' + ), + ( + 3044, + 93, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chrysler SB Commander Single Plane IM', + 'Intake Manifold' + ), + ( + 3045, + 86, + 'Wedge (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Wedge (.3) Piston', + 'Pistons' + ), + ( + 3046, + 86, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3047, + 86, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Wedge (.75) Piston', + 'Pistons' + ), + ( + 3048, + 87, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3049, + 87, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Wedge (.25) Piston', + 'Pistons' + ), + ( + 3050, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3051, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3052, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3053, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3054, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3055, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler SB Domed (.25) Piston', + 'Pistons' + ), + ( + 3056, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler SB Domed (.75) Piston', + 'Pistons' + ), + ( + 3057, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler SB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3058, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler SB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3059, + 87, + 'Flat Top Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flat Top Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Flat Top Lightweight Piston', + 'Pistons' + ), + ( + 3060, + 95, + 'Replica', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Replica', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Percy Chrysler SB Replica Rods', + 'Connecting Rods' + ), + ( + 3061, + 95, + 'Replica Street Racer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Replica Street Racer', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Percy Chrysler SB Replica Street Racer Rods', + 'Connecting Rods' + ), + ( + 3062, + 95, + 'Factory Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Factory Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Percy Chrysler SB Factory Lightweight Rods', + 'Connecting Rods' + ), + ( + 3063, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Marathon Rods', + 'Connecting Rods' + ), + ( + 3064, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler SB Street Max Rods', + 'Connecting Rods' + ), + ( + 3065, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Lightweight Rods', + 'Connecting Rods' + ), + ( + 3066, + 88, + 'Super 340', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super 340', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Chrysler SB Super 340 Crankshaft', + 'Crankshaft' + ), + ( + 3067, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 3068, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler SB Marathon Crankshaft', + 'Crankshaft' + ), + ( + 3069, + 95, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Percy Chrysler SB Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 3070, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler SB Premier Roller VT', + 'Valve Train' + ), + ( + 3071, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler SB Super Lift Solid VT', + 'Valve Train' + ), + ( + 3072, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chrysler SB Race Roller VT', + 'Valve Train' + ), + ( + 3073, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler SB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3074, + 94, + 'LA Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LA Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB LA Street EM', + 'Exhaust Manifold' + ), + ( + 3075, + 94, + 'Performance LA', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance LA', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Performance LA HP EM', + 'Exhaust Manifold' + ), + ( + 3076, + 94, + 'LA Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'LA Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB LA Small Headers', + 'Exhaust Manifold' + ), + ( + 3077, + 94, + 'Super LA Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super LA Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler SB Super LA Large Headers', + 'Exhaust Manifold' + ), + ( + 3078, + 82, + 'Double Demon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Double Demon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler SB Double Demon HP EM', + 'Exhaust Manifold' + ), + ( + 3079, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler SB Super Stream Large Headers', + 'Exhaust Manifold' + ), + ( + 3080, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3081, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3082, + 93, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Crusader Tunnel Ram', + 'Intake Manifold' + ), + ( + 3083, + 93, + 'Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Assassin Single Plane IM', + 'Intake Manifold' + ), + ( + 3084, + 93, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Street Knight Single Plane IM', + 'Intake Manifold' + ), + ( + 3085, + 93, + 'Super Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Pontiac Super Centurion Dual Plane IM', + 'Intake Manifold' + ), + ( + 3086, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3087, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3088, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Pontiac Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3089, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Pontiac Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3090, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Pontiac Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3091, + 86, + 'Wedge (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.2)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Wedge (.2) Piston', + 'Pistons' + ), + ( + 3092, + 87, + 'Wedge (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.4)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Pontiac Wedge (.4) Piston', + 'Pistons' + ), + ( + 3093, + 86, + 'Wedge (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Wedge (.6) Piston', + 'Pistons' + ), + ( + 3094, + 86, + 'Wedge (.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.8)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Wedge (.8) Piston', + 'Pistons' + ), + ( + 3095, + 87, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Pontiac Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3096, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Pontiac Domed (.25) Piston', + 'Pistons' + ), + ( + 3097, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Pontiac Domed (.5) Piston', + 'Pistons' + ), + ( + 3098, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Pontiac Domed (.75) Piston', + 'Pistons' + ), + ( + 3099, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Pontiac Domed (1.0) Piston', + 'Pistons' + ), + ( + 3100, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Pontiac Domed (1.25) Piston', + 'Pistons' + ), + ( + 3101, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Champion Rods', + 'Connecting Rods' + ), + ( + 3102, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Lightweight Rods', + 'Connecting Rods' + ), + ( + 3103, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Marathon Rods', + 'Connecting Rods' + ), + ( + 3104, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Lightweight Crankshaft', + 'Crankshaft' + ), + ( + 3105, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Pontiac Marathon Crankshaft', + 'Crankshaft' + ), + ( + 3106, + 88, + 'SD Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SD Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hedgely Pontiac SD Special Crankshaft', + 'Crankshaft' + ), + ( + 3107, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Pontiac Premier Roller VT', + 'Valve Train' + ), + ( + 3108, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Pontiac Race Roller VT', + 'Valve Train' + ), + ( + 3109, + 82, + 'Airstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Airstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Pontiac Airstream EM', + 'Exhaust Manifold' + ), + ( + 3110, + 82, + 'Aluminum Airstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Airstream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Pontiac Aluminum Airstream EM', + 'Exhaust Manifold' + ), + ( + 3111, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Pontiac Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3112, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Pontiac Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3113, + 91, + 'Screamer Ultra Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Screamer Ultra Light Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Screamer Ultra Light DP IM', + 'Intake Manifold' + ), + ( + 3114, + 91, + 'Vortex Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vortex Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Vortex SP IM', + 'Intake Manifold' + ), + ( + 3115, + 91, + 'Vortex Ultra Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vortex Ultra Light Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Vortex Ultra Light SP IM', + 'Intake Manifold' + ), + ( + 3116, + 91, + 'Power Tower Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power Tower Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rad Chevy BB Power Tower Tunnel Ram', + 'Intake Manifold' + ), + ( + 3117, + 91, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Ultimate Tunnel Ram', + 'Intake Manifold' + ), + ( + 3118, + 41, + 'Recessed (-.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Recessed (-.15) Piston', + 'Pistons' + ), + ( + 3119, + 41, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3120, + 41, + 'Recessed (-.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Recessed (-.35) Piston', + 'Pistons' + ), + ( + 3121, + 41, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3122, + 41, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3123, + 41, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.35)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Wedge (.35) Piston', + 'Pistons' + ), + ( + 3124, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3125, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Wedge (.75) Piston', + 'Pistons' + ), + ( + 3126, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3127, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Domed (.25) Piston', + 'Pistons' + ), + ( + 3128, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Domed (.75) Piston', + 'Pistons' + ), + ( + 3129, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3130, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy BB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3131, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford Cleveland Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3132, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford Cleveland Street Max Rods', + 'Connecting Rods' + ), + ( + 3133, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford Cleveland Super Max Rods', + 'Connecting Rods' + ), + ( + 3134, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford Cleveland Lightweight Rods', + 'Connecting Rods' + ), + ( + 3135, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford Cleveland Marathon Rods', + 'Connecting Rods' + ), + ( + 3136, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford Cleveland Legend Rods', + 'Connecting Rods' + ), + ( + 3137, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3138, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Street Max Rods', + 'Connecting Rods' + ), + ( + 3139, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Super Max Rods', + 'Connecting Rods' + ), + ( + 3140, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Lightweight Rods', + 'Connecting Rods' + ), + ( + 3141, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Marathon Rods', + 'Connecting Rods' + ), + ( + 3142, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Legend Rods', + 'Connecting Rods' + ), + ( + 3143, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Champion Rods', + 'Connecting Rods' + ), + ( + 3144, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Lightweight Rods', + 'Connecting Rods' + ), + ( + 3145, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Marathon Rods', + 'Connecting Rods' + ), + ( + 3146, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Legend Rods', + 'Connecting Rods' + ), + ( + 3147, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Champion Rods', + 'Connecting Rods' + ), + ( + 3148, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Lightweight Rods', + 'Connecting Rods' + ), + ( + 3149, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Marathon Rods', + 'Connecting Rods' + ), + ( + 3150, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Legend Rods', + 'Connecting Rods' + ), + ( + 3151, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3152, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Street Max Rods', + 'Connecting Rods' + ), + ( + 3153, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Super Max Rods', + 'Connecting Rods' + ), + ( + 3154, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Contender Rods', + 'Connecting Rods' + ), + ( + 3155, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Champion Rods', + 'Connecting Rods' + ), + ( + 3156, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Lightweight Rods', + 'Connecting Rods' + ), + ( + 3157, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Marathon Rods', + 'Connecting Rods' + ), + ( + 3158, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Legend Rods', + 'Connecting Rods' + ), + ( + 3159, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3160, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Street Max Rods', + 'Connecting Rods' + ), + ( + 3161, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Super Max Rods', + 'Connecting Rods' + ), + ( + 3162, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3163, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Street Max Rods', + 'Connecting Rods' + ), + ( + 3164, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Super Max Rods', + 'Connecting Rods' + ), + ( + 3165, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Contender Rods', + 'Connecting Rods' + ), + ( + 3166, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Champion Rods', + 'Connecting Rods' + ), + ( + 3167, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Lightweight Rods', + 'Connecting Rods' + ), + ( + 3168, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Marathon Rods', + 'Connecting Rods' + ), + ( + 3169, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Legend Rods', + 'Connecting Rods' + ), + ( + 3170, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Contender Rods', + 'Connecting Rods' + ), + ( + 3171, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Champion Rods', + 'Connecting Rods' + ), + ( + 3172, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Lightweight Rods', + 'Connecting Rods' + ), + ( + 3173, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Marathon Rods', + 'Connecting Rods' + ), + ( + 3174, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Legend Rods', + 'Connecting Rods' + ), + ( + 3175, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Stump Puller Rods', + 'Connecting Rods' + ), + ( + 3176, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Street Max Rods', + 'Connecting Rods' + ), + ( + 3177, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Super Max Rods', + 'Connecting Rods' + ), + ( + 3178, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Contender Rods', + 'Connecting Rods' + ), + ( + 3179, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Champion Rods', + 'Connecting Rods' + ), + ( + 3180, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Lightweight Rods', + 'Connecting Rods' + ), + ( + 3181, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrylser BB Marathon Rods', + 'Connecting Rods' + ), + ( + 3182, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Legend Rods', + 'Connecting Rods' + ), + ( + 3183, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Contender Rods', + 'Connecting Rods' + ), + ( + 3184, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Champion Rods', + 'Connecting Rods' + ), + ( + 3185, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Lightweight Rods', + 'Connecting Rods' + ), + ( + 3186, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Marathon Rods', + 'Connecting Rods' + ), + ( + 3187, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Legend Rods', + 'Connecting Rods' + ), + ( + 3188, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cleveland Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3189, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cleveland Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3190, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cleveland Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3191, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cleveland Street King HP EM', + 'Exhaust Manifold' + ), + ( + 3192, + 83, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3193, + 83, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Strip King Headers', + 'Exhaust Manifold' + ), + ( + 3194, + 83, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Track King Headers', + 'Exhaust Manifold' + ), + ( + 3195, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford 385 Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3196, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford 385 Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3197, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford 385 Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3198, + 83, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Track King Headers', + 'Exhaust Manifold' + ), + ( + 3199, + 83, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Strip King Headers', + 'Exhaust Manifold' + ), + ( + 3200, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Street King EM', + 'Exhaust Manifold' + ), + ( + 3201, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford 385 Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3202, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Hemi Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3203, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Hemi Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3204, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Hemi Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3205, + 94, + 'Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Street EM', + 'Exhaust Manifold' + ), + ( + 3206, + 94, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Performance EM', + 'Exhaust Manifold' + ), + ( + 3207, + 94, + 'Hemi Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hemi Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Hemi Headers', + 'Exhaust Manifold' + ), + ( + 3208, + 94, + 'Super Hemi Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Hemi Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Super Hemi Headers', + 'Exhaust Manifold' + ), + ( + 3209, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac BB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3210, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac BB Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3211, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac BB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3212, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Cadillac BB Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3213, + 79, + 'Street Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB Street Headers', + 'Exhaust Manifold' + ), + ( + 3214, + 79, + 'Rad Cad Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Cad Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB Rad Cad Headers', + 'Exhaust Manifold' + ), + ( + 3215, + 79, + 'High Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'High Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB HP EM', + 'Exhaust Manifold' + ), + ( + 3216, + 91, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Street Mod EM', + 'Exhaust Manifold' + ), + ( + 3217, + 91, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Rumble Pipe Headers', + 'Exhaust Manifold' + ), + ( + 3218, + 91, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Street Lion Headers', + 'Exhaust Manifold' + ), + ( + 3219, + 91, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Window Rattler Headers', + 'Exhaust Manifold' + ), + ( + 3220, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy W Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3221, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy W Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3222, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy W Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3223, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy W Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3224, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker AMC Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3225, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker AMC Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3226, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker AMC Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3227, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker AMC Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3228, + 96, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Stalker HP EM', + 'Exhaust Manifold' + ), + ( + 3229, + 96, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Hunter Headers', + 'Exhaust Manifold' + ), + ( + 3230, + 96, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Predator Headers', + 'Exhaust Manifold' + ), + ( + 3231, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Olds BB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3232, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Olds BB Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3233, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Olds BB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3234, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Olds BB Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3235, + 96, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Olds BB Stalker HP EM', + 'Exhaust Manifold' + ), + ( + 3236, + 96, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Olds BB Hunter Headers', + 'Exhaust Manifold' + ), + ( + 3237, + 96, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Olds BB Predator Headers', + 'Exhaust Manifold' + ), + ( + 3238, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler BB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3239, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler BB Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3240, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler BB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3241, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler BB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3242, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chrysler BB Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3243, + 96, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stalker HP', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Chrysler BB Stalker HP EM', + 'Exhaust Manifold' + ), + ( + 3244, + 96, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hunter Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Chrysler BB Hunter Headers', + 'Exhaust Manifold' + ), + ( + 3245, + 96, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Predator Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark Chrysler BB Predator Headers', + 'Exhaust Manifold' + ), + ( + 3246, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford BB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3247, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford BB Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3248, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford BB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3249, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford BB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3250, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Ford BB Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3251, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Street King EM', + 'Exhaust Manifold' + ), + ( + 3252, + 83, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Strip King Headers', + 'Exhaust Manifold' + ), + ( + 3253, + 83, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Track King Headers', + 'Exhaust Manifold' + ), + ( + 3254, + 82, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy BB Air Stream EM', + 'Exhaust Manifold' + ), + ( + 3255, + 82, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Air Stream Aluminum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy BB Air Stream Aluminum EM', + 'Exhaust Manifold' + ), + ( + 3256, + 82, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Interceptor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy BB Interceptor EM', + 'Exhaust Manifold' + ), + ( + 3257, + 82, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Jet Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy BB Jet Stream Headers', + 'Exhaust Manifold' + ), + ( + 3258, + 82, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stream Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quaker Chevy BB Super Stream Headers', + 'Exhaust Manifold' + ), + ( + 3259, + 91, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Mod', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Street Mod EM', + 'Exhaust Manifold' + ), + ( + 3260, + 91, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rumble Pipe Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Rumble Pipe Headers', + 'Exhaust Manifold' + ), + ( + 3261, + 91, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lion Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Street Lion Headers', + 'Exhaust Manifold' + ), + ( + 3262, + 91, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Window Rattler Headers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy BB Window Rattler Headers', + 'Exhaust Manifold' + ), + ( + 3263, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lifter Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cleveland Speed Lifter Solid VT', + 'Valve Train' + ), + ( + 3264, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cleveland Super Lift Solid VT', + 'Valve Train' + ), + ( + 3265, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cleveland Premier Roller VT', + 'Valve Train' + ), + ( + 3266, + 83, + 'Strip King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Strip King Roller VT', + 'Valve Train' + ), + ( + 3267, + 83, + 'Track King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Track King Roller VT', + 'Valve Train' + ), + ( + 3268, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Ford 385 Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3269, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Ford 385 Super Lift Solid VT', + 'Valve Train' + ), + ( + 3270, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Ford 385 Premier Roller VT', + 'Valve Train' + ), + ( + 3271, + 83, + 'Strip King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Strip King Roller VT', + 'Valve Train' + ), + ( + 3272, + 83, + 'Track King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Track King Roller VT', + 'Valve Train' + ), + ( + 3273, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Hemi Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3274, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Hemi Super Lift Solid VT', + 'Valve Train' + ), + ( + 3275, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Hemi Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3276, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Hemi Premier Roller VT', + 'Valve Train' + ), + ( + 3277, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Hemi Race Roller VT', + 'Valve Train' + ), + ( + 3278, + 84, + 'Street Plus Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Plus Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cadillac BB Street Plus Hydraulic VT', + 'Valve Train' + ), + ( + 3279, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cadillac BB Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3280, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cadillac BB Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3281, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cadillac BB Super Lift Solid VT', + 'Valve Train' + ), + ( + 3282, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Cadillac BB Premier Roller VT', + 'Valve Train' + ), + ( + 3283, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Cadillac BB Performance Hydraulic VT', + 'Valve Train' + ), + ( + 3284, + 85, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Cadillac BB Performance Solid VT', + 'Valve Train' + ), + ( + 3285, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Cadillac BB Race Roller', + 'Valve Train' + ), + ( + 3286, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy W Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3287, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy W Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3288, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy W Super Lift Solid VT', + 'Valve Train' + ), + ( + 3289, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Millloy Chevy W Premier Roller VT', + 'Valve Train' + ), + ( + 3290, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy W Performance Hydraulic VT', + 'Valve Train' + ), + ( + 3291, + 85, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy W Performance Solid VT', + 'Valve Train' + ), + ( + 3292, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy W Race Roller VT', + 'Valve Train' + ), + ( + 3293, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy AMC Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3294, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy AMC Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3295, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy AMC Super Lift Solid VT', + 'Valve Train' + ), + ( + 3296, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy AMC Premier Roller VT', + 'Valve Train' + ), + ( + 3297, + 85, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift AMC Performance Hydraulic VT', + 'Valve Train' + ), + ( + 3298, + 85, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift AMC Performance Solid VT', + 'Valve Train' + ), + ( + 3299, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift AMC Race Roller VT', + 'Valve Train' + ), + ( + 3300, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Olds BB Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3301, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Olds BB Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3302, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Olds BB Super Lift Solid VT', + 'Valve Train' + ), + ( + 3303, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Olds BB Premier Roller VT', + 'Valve Train' + ), + ( + 3304, + 84, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Hydraulic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler BB Speed Lift Hydraulic VT', + 'Valve Train' + ), + ( + 3305, + 84, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Speed Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler BB Speed Lift Solid VT', + 'Valve Train' + ), + ( + 3306, + 84, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Lift Solid', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler BB Super Lift Solid VT', + 'Valve Train' + ), + ( + 3307, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chrysler BB Premier Roller VT', + 'Valve Train' + ), + ( + 3308, + 84, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Premier Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Milloy Chevy BB Premier Roller VT', + 'Valve Train' + ), + ( + 3309, + 85, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Race Roller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Quik Lift Chevy BB Race Roller VT', + 'Valve Train' + ), + ( + 3310, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Stump Puller Crank', + 'Crankshaft' + ), + ( + 3311, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Street Max Crank', + 'Crankshaft' + ), + ( + 3312, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Super Max Crank', + 'Crankshaft' + ), + ( + 3313, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Contender Crank', + 'Crankshaft' + ), + ( + 3314, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Champion Crank', + 'Crankshaft' + ), + ( + 3315, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Lightweight Crank', + 'Crankshaft' + ), + ( + 3316, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Marathon Crank', + 'Crankshaft' + ), + ( + 3317, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Legend Crank', + 'Crankshaft' + ), + ( + 3318, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Stump Puller Crank', + 'Crankshaft' + ), + ( + 3319, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Street Max Crank', + 'Crankshaft' + ), + ( + 3320, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Super Max Crank', + 'Crankshaft' + ), + ( + 3321, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Contender Crank', + 'Crankshaft' + ), + ( + 3322, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Champion Crank', + 'Crankshaft' + ), + ( + 3323, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Lightweight Crank', + 'Crankshaft' + ), + ( + 3324, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Marathon Crank', + 'Crankshaft' + ), + ( + 3325, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Legend Crank', + 'Crankshaft' + ), + ( + 3326, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Stump Puller Crank', + 'Crankshaft' + ), + ( + 3327, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Street Max Crank', + 'Crankshaft' + ), + ( + 3328, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Super Max Crank', + 'Crankshaft' + ), + ( + 3329, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Contender Crank', + 'Crankshaft' + ), + ( + 3330, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Champion Crank', + 'Crankshaft' + ), + ( + 3331, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Lighweight Crank', + 'Crankshaft' + ), + ( + 3332, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Marathon Crank', + 'Crankshaft' + ), + ( + 3333, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Legend Crank', + 'Crankshaft' + ), + ( + 3334, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Stump Puller Crank', + 'Crankshaft' + ), + ( + 3335, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Street Max Crank', + 'Crankshaft' + ), + ( + 3336, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nerwcomb Cadillac BB Super Max Crank', + 'Crankshaft' + ), + ( + 3337, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Contender Crank', + 'Crankshaft' + ), + ( + 3338, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Champion Crank', + 'Crankshaft' + ), + ( + 3339, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Lightweight Crank', + 'Crankshaft' + ), + ( + 3340, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Marathon Crank', + 'Crankshaft' + ), + ( + 3341, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Legend Crank', + 'Crankshaft' + ), + ( + 3342, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Stump Puller Crank', + 'Crankshaft' + ), + ( + 3343, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Street Max Crank', + 'Crankshaft' + ), + ( + 3344, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Super Max Crank', + 'Crankshaft' + ), + ( + 3345, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Contender Crank', + 'Crankshaft' + ), + ( + 3346, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Champion Crank', + 'Crankshaft' + ), + ( + 3347, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Lightweight Crank', + 'Crankshaft' + ), + ( + 3348, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Marathon Crank', + 'Crankshaft' + ), + ( + 3349, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Legend Crank', + 'Crankshaft' + ), + ( + 3350, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Stump Puller Crank', + 'Crankshaft' + ), + ( + 3351, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Street Max Crank', + 'Crankshaft' + ), + ( + 3352, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Super Max Crank', + 'Crankshaft' + ), + ( + 3353, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Contender Crank', + 'Crankshaft' + ), + ( + 3354, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Champion Crank', + 'Crankshaft' + ), + ( + 3355, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Lightweight Crank', + 'Crankshaft' + ), + ( + 3356, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Marathon Crank', + 'Crankshaft' + ), + ( + 3357, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Legend Crank', + 'Crankshaft' + ), + ( + 3358, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Stump Puller Crank', + 'Crankshaft' + ), + ( + 3359, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Street Max Crank', + 'Crankshaft' + ), + ( + 3360, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Super Max Crank', + 'Crankshaft' + ), + ( + 3361, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Contender Crank', + 'Crankshaft' + ), + ( + 3362, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Champion Crank', + 'Crankshaft' + ), + ( + 3363, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Lightweight Crank', + 'Crankshaft' + ), + ( + 3364, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Marathon Crank', + 'Crankshaft' + ), + ( + 3365, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Legend Crank', + 'Crankshaft' + ), + ( + 3366, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Stump Puller Crank', + 'Crankshaft' + ), + ( + 3367, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Street Max Crank', + 'Crankshaft' + ), + ( + 3368, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Super Max Crank', + 'Crankshaft' + ), + ( + 3369, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Contender Crank', + 'Crankshaft' + ), + ( + 3370, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Champion Crank', + 'Crankshaft' + ), + ( + 3371, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Lightweight Crank', + 'Crankshaft' + ), + ( + 3372, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Marathon Crank', + 'Crankshaft' + ), + ( + 3373, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Legend Crank', + 'Crankshaft' + ), + ( + 3374, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Stump Puller Crank', + 'Crankshaft' + ), + ( + 3375, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Street Max Crank', + 'Crankshaft' + ), + ( + 3376, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Super Max Crank', + 'Crankshaft' + ), + ( + 3377, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Contender Crank', + 'Crankshaft' + ), + ( + 3378, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Champion Crank', + 'Crankshaft' + ), + ( + 3379, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Lightweight Crank', + 'Crankshaft' + ), + ( + 3380, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Marathon Crank', + 'Crankshaft' + ), + ( + 3381, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Legend Crank', + 'Crankshaft' + ), + ( + 3382, + 87, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stump Puller', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy BB Stump Puller Crank', + 'Crankshaft' + ), + ( + 3383, + 87, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy BB Street Max Crank', + 'Crankshaft' + ), + ( + 3384, + 87, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Max', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy BB Super Max Crank', + 'Crankshaft' + ), + ( + 3385, + 86, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Contender', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy BB Contender Crank', + 'Crankshaft' + ), + ( + 3386, + 86, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Champion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy BB Champion Crank', + 'Crankshaft' + ), + ( + 3387, + 86, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightweight', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy BB Lightweight Crank', + 'Crankshaft' + ), + ( + 3388, + 86, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Marathon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy BB Marathon Crank', + 'Crankshaft' + ), + ( + 3389, + 86, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Legend', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy BB Legend Crank', + 'Crankshaft' + ), + ( + 3390, + 83, + 'Strip King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Strip King Dual Plane IM', + 'Intake Manifold' + ), + ( + 3391, + 83, + 'Street King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Street King Dual Plane IM', + 'Intake Manifold' + ), + ( + 3392, + 83, + 'Strip King Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Strip King Single Plane IM', + 'Intake Manifold' + ), + ( + 3393, + 83, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Midget Tunnel Ram', + 'Intake Manifold' + ), + ( + 3394, + 83, + 'Hiboy Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hiboy Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Hiboy Tunnel Ram', + 'Intake Manifold' + ), + ( + 3395, + 83, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford BB Strip King Tunnel Ram', + 'Intake Manifold' + ), + ( + 3396, + 94, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Bighorn Tunnel Ram', + 'Intake Manifold' + ), + ( + 3397, + 94, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Intimidator Tunnel Ram', + 'Intake Manifold' + ), + ( + 3398, + 94, + 'Super Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Super Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3399, + 94, + 'Super Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Super Stocker Dual Plane IM', + 'Intake Manifold' + ), + ( + 3400, + 94, + 'Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Stocker Dual Plane IM', + 'Intake Manifold' + ), + ( + 3401, + 94, + 'Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3402, + 94, + 'Street Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Street Single Plane IM', + 'Intake Manifold' + ), + ( + 3403, + 94, + 'Street Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Chrysler BB Street Dual Plane IM', + 'Intake Manifold' + ), + ( + 3404, + 93, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Road Squire Dual Plane IM', + 'Intake Manifold' + ), + ( + 3405, + 93, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Street Port Dual Plane IM', + 'Intake Manifold' + ), + ( + 3406, + 93, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Usurper Dual Plane IM', + 'Intake Manifold' + ), + ( + 3407, + 93, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Centurion Single Plane IM', + 'Intake Manifold' + ), + ( + 3408, + 93, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Commander Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Commander Single Plane IM', + 'Intake Manifold' + ), + ( + 3409, + 93, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Track Assassin Single Plane IM', + 'Intake Manifold' + ), + ( + 3410, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3411, + 93, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Crusader Tunnel Ram', + 'Intake Manifold' + ), + ( + 3412, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Olds BB Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3413, + 91, + 'Screamer Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Screamer Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Screamer Dual Plane IM', + 'Intake Manifold' + ), + ( + 3414, + 91, + 'Banshee Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Banshee Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Banshee Dual Plane IM', + 'Intake Manifold' + ), + ( + 3415, + 91, + 'Vortex Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vortex Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Vortex Single Plane IM', + 'Intake Manifold' + ), + ( + 3416, + 93, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chevy W Usurper Dual Plane IM', + 'Intake Manifold' + ), + ( + 3417, + 93, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chevy W Centurion Single Plane', + 'Intake Manifold' + ), + ( + 3418, + 93, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chevy W Track Assassin Single Plane IM', + 'Intake Manifold' + ), + ( + 3419, + 91, + 'Banshee Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Banshee Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Banshee Single Plane IM', + 'Intake Manifold' + ), + ( + 3420, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chevy W Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3421, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Chevy W Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3422, + 91, + 'Power Tower Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Power Tower Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Power Tower Tunnel Ram', + 'Intake Manifold' + ), + ( + 3423, + 91, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ultimate Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Rad Rat Chevy W Ultimate Tunnel Ram', + 'Intake Manifold' + ), + ( + 3424, + 93, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port AMC Track Assassin Single Plane IM', + 'Intake Manifold' + ), + ( + 3425, + 93, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port AMC Street Knight Single Plane IM', + 'Intake Manifold' + ), + ( + 3426, + 96, + 'Hunter Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Hunter Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Hunter Single Plane IM', + 'Intake Manifold' + ), + ( + 3427, + 96, + 'Predator Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Predator Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Predator Dual Plane IM', + 'Intake Manifold' + ), + ( + 3428, + 96, + 'Stalker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stalker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Stalker Dual Plane', + 'Intake Manifold' + ), + ( + 3429, + 96, + 'Tiger Shark Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Tiger Shark Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Shark AMC Tiger Shark Tunnel Ram', + 'Intake Manifold' + ), + ( + 3430, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port AMC Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3431, + 93, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port AMC Crusader Tunnel Ram', + 'Intake Manifold' + ), + ( + 3432, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port AMC Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3433, + 93, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Road Squire Dual Plane IM', + 'Intake Manifold' + ), + ( + 3434, + 93, + 'Road Squire LW Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Squire Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Road Aquire Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 3435, + 93, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Street Port Dual Plane IM', + 'Intake Manifold' + ), + ( + 3436, + 93, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Centurion Dual Plane IM', + 'Intake Manifold' + ), + ( + 3437, + 93, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Usurper Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Usurper Dual Plane IM', + 'Intake Manifold' + ), + ( + 3438, + 93, + 'Street Lord Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Street Lord Dual Plane IM', + 'Intake Manifold' + ), + ( + 3439, + 93, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Knight Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Street Knight Single Plane IM', + 'Intake Manifold' + ), + ( + 3440, + 93, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Centurion Single Plane IM', + 'Intake Manifold' + ), + ( + 3441, + 93, + 'Super Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Super Centurion Single Plane IM', + 'Intake Manifold' + ), + ( + 3442, + 93, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track Assassin Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Track Assassin Single Plane IM', + 'Intake Manifold' + ), + ( + 3443, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3444, + 93, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crusader Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Crusader Tunnel Ram', + 'Intake Manifold' + ), + ( + 3445, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3446, + 93, + 'Usurper Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Usurper Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cadillac BB Usurper Tunnel Ram', + 'Intake Manifold' + ), + ( + 3447, + 94, + 'Perf. Street Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Street Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Performance Street DP IM', + 'Intake Manifold' + ), + ( + 3448, + 94, + 'Perf. Alum. Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Street Aluminum Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Performance Street Aluminum Dual Plane IM', + 'Intake Manifold' + ), + ( + 3449, + 94, + 'Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Stocker Dual Plane IM', + 'Intake Manifold' + ), + ( + 3450, + 94, + 'Stocker Light Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Lightweight Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Stocker Lightweight Dual Plane IM', + 'Intake Manifold' + ), + ( + 3451, + 94, + 'Super Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stocker Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Super Stocker Dual Plane IM', + 'Intake Manifold' + ), + ( + 3452, + 94, + 'Perf. Street Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performace Street Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Performace Street Single Plane IM', + 'Intake Manifold' + ), + ( + 3453, + 94, + 'Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3454, + 94, + 'Super Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Stocker Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Super Stocker Single Plane IM', + 'Intake Manifold' + ), + ( + 3455, + 94, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Intimidator Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Intimidator Tunnel Ram', + 'Intake Manifold' + ), + ( + 3456, + 94, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bighorn Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Bighorn Tunnel Ram', + 'Intake Manifold' + ), + ( + 3457, + 93, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Road Squire Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford 385 Road Squire Dual Plane IM', + 'Intake Manifold' + ), + ( + 3458, + 83, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Performance Dual Plane IM', + 'Intake Manifold' + ), + ( + 3459, + 83, + 'Lightning Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Lightning Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Lightning Single Plane IM', + 'Intake Manifold' + ), + ( + 3460, + 83, + 'Track King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Track King Dual Plane IM', + 'Intake Manifold' + ), + ( + 3461, + 83, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Strip King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Strip King Tunnel Ram', + 'Intake Manifold' + ), + ( + 3462, + 83, + 'Track King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Track King Tunnel Ram', + 'Intake Manifold' + ), + ( + 3463, + 93, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford 385 Centurion Single Plane IM', + 'Intake Manifold' + ), + ( + 3464, + 93, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Lord Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford 385 Street Lord Tunnel Ram', + 'Intake Manifold' + ), + ( + 3465, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Ford 385 Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3466, + 93, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street Port Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cleveland Street Port Dual Plane IM', + 'Intake Manifold' + ), + ( + 3467, + 93, + 'Emperor Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cleveland Emperor Dual Plane IM', + 'Intake Manifold' + ), + ( + 3468, + 93, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Centurion Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cleveland Centurion Single Plane IM', + 'Intake Manifold' + ), + ( + 3469, + 93, + 'Emperor Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cleveland Emperor Single Plane IM', + 'Intake Manifold' + ), + ( + 3470, + 93, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Emperor Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perfect Port Cleveland Emperor Tunnel Ram', + 'Intake Manifold' + ), + ( + 3471, + 83, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Performance Dual Plane IM', + 'Intake Manifold' + ), + ( + 3472, + 83, + 'Track King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Dual Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Track King Dual Plane IM', + 'Intake Manifold' + ), + ( + 3473, + 83, + 'Performance Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Performance Single Plane IM', + 'Intake Manifold' + ), + ( + 3474, + 83, + 'Track King Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Track King Single Plane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Track King Single Plane IM', + 'Intake Manifold' + ), + ( + 3475, + 83, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Midget Tunnel Ram', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Midget Tunnel Ram', + 'Intake Manifold' + ), + ( + 3476, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3477, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford BB Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3478, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3479, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3480, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford BB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3481, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Wedge (.15) Piston', + 'Pistons' + ), + ( + 3482, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Wedge (.25) Piston', + 'Pistons' + ), + ( + 3483, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3484, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Wedge 9.75) Piston', + 'Pistons' + ), + ( + 3485, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3486, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Domed (.25) Piston', + 'Pistons' + ), + ( + 3488, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Domed (.75) Piston', + 'Pistons' + ), + ( + 3489, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3490, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford BB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3491, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3492, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chrysler BB Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3493, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3494, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3495, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chrysler BB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3496, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Wedge (.15) Piston', + 'Pistons' + ), + ( + 3497, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3498, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Wedge (.75) Piston', + 'Pistons' + ), + ( + 3499, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3500, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Domed (.25) Piston', + 'Pistons' + ), + ( + 3501, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Domed (.75) Piston', + 'Pistons' + ), + ( + 3502, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3503, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chrysler BB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3504, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3505, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Olds BB Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3506, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3507, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3508, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Olds BB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3509, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Wedge (.15) Piston', + 'Pistons' + ), + ( + 3510, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3511, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Wedge (.75) Piston', + 'Pistons' + ), + ( + 3512, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3513, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Domed (.25) Piston', + 'Pistons' + ), + ( + 3514, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Domed (.75) Piston', + 'Pistons' + ), + ( + 3515, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3516, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Olds BB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3517, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3518, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod AMC Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3519, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3520, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3521, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb AMC Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3522, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Wedge (.15) Piston', + 'Pistons' + ), + ( + 3523, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Wedge (.25) Piston', + 'Pistons' + ), + ( + 3524, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Wedge (.5) Piston', + 'Pistons' + ), + ( + 3525, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Wedge (.75) Piston', + 'Pistons' + ), + ( + 3526, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3527, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Domed (.25) Piston', + 'Pistons' + ), + ( + 3528, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Domed (.5) Piston', + 'Pistons' + ), + ( + 3529, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Domed (.75) Piston', + 'Pistons' + ), + ( + 3530, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Domed (1.0) Piston', + 'Pistons' + ), + ( + 3531, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons AMC Domed (1.25) Piston', + 'Pistons' + ), + ( + 3532, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Chevy W Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3533, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3534, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Chevy W Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3535, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Wedge (.15) Piston', + 'Pistons' + ), + ( + 3536, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Wedge (.25) Piston', + 'Pistons' + ), + ( + 3537, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Wedge (.5) Piston', + 'Pistons' + ), + ( + 3538, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Wedge (.75) Piston', + 'Pistons' + ), + ( + 3539, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3540, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Domed (.25) Piston', + 'Pistons' + ), + ( + 3541, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Domed (.5 Piston', + 'Pistons' + ), + ( + 3542, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Chevy W Domed (1.25) Piston', + 'Pistons' + ), + ( + 3543, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3544, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3545, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cadillac BB Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3546, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3547, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cadillac BB Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3548, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Domed (.25) Piston', + 'Pistons' + ), + ( + 3549, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Domed (.5) Piston', + 'Pistons' + ), + ( + 3550, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Domed (.75) Piston', + 'Pistons' + ), + ( + 3551, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Domed (1.0) Piston', + 'Pistons' + ), + ( + 3552, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Domed (1.25) Piston', + 'Pistons' + ), + ( + 3553, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Wedge (.15) Piston', + 'Pistons' + ), + ( + 3554, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Wedge (.25) Piston', + 'Pistons' + ), + ( + 3555, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Wedge (.5) Piston', + 'Pistons' + ), + ( + 3556, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Wedge (.75) Piston', + 'Pistons' + ), + ( + 3557, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cadillac BB Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3558, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3559, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3560, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Hemi Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3561, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3562, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Hemi Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3563, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Domed (.25) Piston', + 'Pistons' + ), + ( + 3564, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Domed (.5) Piston', + 'Pistons' + ), + ( + 3565, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Domed (.75) Piston', + 'Pistons' + ), + ( + 3566, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Domed (1.0) Piston', + 'Pistons' + ), + ( + 3567, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Domed (1.25) Piston', + 'Pistons' + ), + ( + 3568, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Wedge (.15) Piston', + 'Pistons' + ), + ( + 3569, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Wedge (.25) Piston', + 'Pistons' + ), + ( + 3570, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Wedge (.5) Piston', + 'Pistons' + ), + ( + 3571, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Wedge (.75) Piston', + 'Pistons' + ), + ( + 3572, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Hemi Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3573, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3574, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3575, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Ford 385 Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3576, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3577, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Ford 385 Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3578, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Domed (.25) Piston', + 'Pistons' + ), + ( + 3579, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Domed (.5) Piston', + 'Pistons' + ), + ( + 3580, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Domed (.75) Piston', + 'Pistons' + ), + ( + 3581, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Domed (1.0) Piston', + 'Pistons' + ), + ( + 3582, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Domed (1.25) Piston', + 'Pistons' + ), + ( + 3583, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Wedge (.15) Piston', + 'Pistons' + ), + ( + 3584, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Wedge (.25) Piston', + 'Pistons' + ), + ( + 3585, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Wedge (.5) Piston', + 'Pistons' + ), + ( + 3586, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Wedge (.75) Piston', + 'Pistons' + ), + ( + 3587, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Ford 385 Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3588, + 87, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Recessed (-.25) Piston', + 'Pistons' + ), + ( + 3589, + 87, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Recessed (-.5) Piston', + 'Pistons' + ), + ( + 3590, + 87, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Newcomb Cleveland Recessed (-.75) Piston', + 'Pistons' + ), + ( + 3591, + 86, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.3)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Recessed (-.3) Piston', + 'Pistons' + ), + ( + 3592, + 86, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Recessed (-.6)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Duro Rod Cleveland Recessed (-.6) Piston', + 'Pistons' + ), + ( + 3593, + 41, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Domed (.25) Piston', + 'Pistons' + ), + ( + 3594, + 41, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Domed (.5) Piston', + 'Pistons' + ), + ( + 3595, + 41, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Domed (.75) Piston', + 'Pistons' + ), + ( + 3596, + 41, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Domed (1.0) Piston', + 'Pistons' + ), + ( + 3597, + 41, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Domed (1.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Domed (1.25) Piston', + 'Pistons' + ), + ( + 3598, + 41, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.15)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Wedge (.15) Piston', + 'Pistons' + ), + ( + 3599, + 41, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.25)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Wedge (.25) Piston', + 'Pistons' + ), + ( + 3600, + 41, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.5)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Wedge (.5) Piston', + 'Pistons' + ), + ( + 3601, + 41, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (.75)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Wedge (.75) Piston', + 'Pistons' + ), + ( + 3602, + 41, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Wedge (1.0)', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'JE Pistons Cleveland Wedge (1.0) Piston', + 'Pistons' + ), + ( + 3603, + 3, + '1957 AI Chevrolet Nomad', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3604, + 90, + '1957 AI Ford Ranchero', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3605, + 7, + '1966 AI Pontiac Mod GTO', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3606, + 1, + '1932 AI Ford Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3607, + 1, + '1940 AI Ford Coupe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3608, + 1, + '1957 Ford Fairlane', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3609, + 1, + '1957 AI Ford Thunderbird', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3610, + 1, + '1964 AI Ford Galaxie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3611, + 1, + '1969 AI Ford Torino Cobra', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3612, + 1, + '1970 AI Ford Boss 302', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3613, + 3, + '1964 AI Chevy Impala', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3614, + 3, + '1970 AI Chevy Chevelle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3615, + 3, + '1963 AI Chevy Stingray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Vehicle' + ), + ( + 3616, + 79, + 'Highway Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Highway Plus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB Highway Plus Camshaft', + 'Camshaft' + ), + ( + 3617, + 79, + 'Streeter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Streeter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB Streeter Camshaft', + 'Camshaft' + ), + ( + 3618, + 79, + 'Racing', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Racing', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Leland Cadillac BB Racing Camshaft', + 'Camshaft' + ), + ( + 3619, + 94, + 'Extra Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Extra Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Extra Stock Camshaft', + 'Camshaft' + ), + ( + 3620, + 94, + 'Blueprint Classic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Blueprint Classic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Blueprint Classic Camshaft', + 'Camshaft' + ), + ( + 3621, + 83, + 'New Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'New Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 New Boss Camshaft', + 'Camshaft' + ), + ( + 3622, + 83, + 'New Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'New Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland New Boss Camshaft', + 'Camshaft' + ), + ( + 3623, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Cleveland Street King Camshaft', + 'Camshaft' + ), + ( + 3624, + 83, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Street King', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Oldfield Ford 385 Street King Camshaft', + 'Camshaft' + ), + ( + 3625, + 94, + 'Bighorn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Bighorn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Walter Hemi Bighorn Camshaft', + 'Camshaft' + ), + ( + 3626, + 97, + '225/35/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/35/17ZR HP', + 'Tires' + ), + ( + 3627, + 97, + '205/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 205/40/17ZR HP', + 'Tires' + ), + ( + 3628, + 97, + '215/40/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/40/16ZR HP', + 'Tires' + ), + ( + 3629, + 97, + '215/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/40/17ZR HP', + 'Tires' + ), + ( + 3630, + 97, + '225/40/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/40/16ZR HP', + 'Tires' + ), + ( + 3631, + 97, + '235/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 235/40/17ZR HP', + 'Tires' + ), + ( + 3632, + 97, + '245/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 245/40/17ZR HP', + 'Tires' + ), + ( + 3633, + 97, + '255/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 255/40/17ZR HP', + 'Tires' + ), + ( + 3634, + 97, + '265/40/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 265/40/17ZR HP', + 'Tires' + ), + ( + 3635, + 97, + '205/45/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 205/45/16ZR HP', + 'Tires' + ), + ( + 3636, + 97, + '215/45/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/45/16ZR HP', + 'Tires' + ), + ( + 3637, + 97, + '215/45/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/45/17ZR HP', + 'Tires' + ), + ( + 3638, + 97, + '225/45/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/45/16ZR HP', + 'Tires' + ), + ( + 3639, + 97, + '225/45/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/45/17ZR HP', + 'Tires' + ), + ( + 3640, + 97, + '235/45/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 235/45/17ZR HP', + 'Tires' + ), + ( + 3641, + 97, + '245/45/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 245/45/16ZR HP', + 'Tires' + ), + ( + 3642, + 97, + '205/50/15ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 205/50/15ZR HP', + 'Tires' + ), + ( + 3643, + 97, + '205/50/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 205/50/16ZR HP', + 'Tires' + ), + ( + 3644, + 97, + '205/50/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 205/50/17ZR HP', + 'Tires' + ), + ( + 3645, + 97, + '215/50/15ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/50/15ZR HP', + 'Tires' + ), + ( + 3646, + 97, + '215/50/17ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 215/50/17ZR HP', + 'Tires' + ), + ( + 3647, + 97, + '225/50/16ZR', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pirelli 225/50/16ZR HP', + 'Tires' + ), + ( + 3648, + 73, + 'Aluminum Alloy Slotted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Slotted', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Slotted Rim (RA00)', + 'Wheel Rims' + ), + ( + 3649, + 65, + 'Aluminum Alloy Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Round', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Round (RA01)', + 'Wheel Rims' + ), + ( + 3650, + 3, + '57 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '57 Corvette', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevrolet Chevy SB 57 Corvette (220hp) Camshaft', + 'Camshaft' + ), + ( + 3651, + 37, + '1.75" Cast Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75" CI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" CI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3652, + 37, + '1.75" Cast Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75" CI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" CI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3653, + 37, + '1.875" Cast Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 CI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" CI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3654, + 37, + '1.875" Cast Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 CI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" CI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3655, + 37, + '2" Cast Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" CI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" CI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3656, + 37, + '2" Cast Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" CI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" CI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3657, + 37, + '2.25" Cast Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.25 CI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2.25" CI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3658, + 37, + '1.75" Treated Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75 TI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" TI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3659, + 37, + '1.75" Treated Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75" TI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" TI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3660, + 37, + '1.875" Treated Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 TI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" TI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3661, + 37, + '1.875" Treated Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 TI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" TI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3662, + 37, + '2" Treated Iron Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" TI Single', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" TI Single Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3663, + 37, + '2" Treated Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" TI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" TI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3664, + 37, + '2.25" Treated Iron Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.25 TI Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2.25" TI Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3665, + 37, + '1.625" Forged Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 FS Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" FS Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3666, + 37, + '1.75" Forged Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75 FS Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" FS Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3667, + 37, + '1.875" Forged Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 FS Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" FS Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3668, + 37, + '2" Forged Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" FS Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" FS Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3669, + 37, + '2.25" Forged Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.25 FS Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2.25" FS Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3670, + 37, + '1.625" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Alloy Steel Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3671, + 37, + '1.75" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" Alloy Steel Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3672, + 37, + '2" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" Alloy Steel Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3673, + 37, + '2.25" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.25" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2.25" Alloy Steel Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3674, + 37, + '1.625" Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.625 Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.625" Alum. Alloy Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3675, + 37, + '1.75" Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.75 Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.75" Alum. Alloy Dual Exhaust', + 'Exhaust Pipe' + ), + ( + 3676, + 37, + '1.875" Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875 Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" Alum. Alloy Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3677, + 37, + '2" Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2" alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2" Alum. Alloy Dual Exhaust pipe', + 'Exhaust Pipe' + ), + ( + 3678, + 37, + '2.25" Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '2.25 Alum. Alloy Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 2.25" Alum Alloy Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3679, + 37, + '1.875" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '1.875" Alloy Steel Dual', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Manley 1.875" Alloy Steel Dual Exhaust Pipe', + 'Exhaust Pipe' + ), + ( + 3680, + 15, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Standard Single Point Ignition', + 'Electrical System' + ), + ( + 3681, + 15, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Performance Single Point Ignition', + 'Electrical System' + ), + ( + 3682, + 15, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Standard Dual Point Ignition', + 'Electrical System' + ), + ( + 3683, + 15, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Performance Dual Point Ignition', + 'Electrical System' + ), + ( + 3684, + 15, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Standard Electronic Ignition', + 'Electrical System' + ), + ( + 3685, + 15, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM Performance Electronic Ignition', + 'Electrical System' + ), + ( + 3686, + 8, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Standard Single Point Ignition', + 'Electrical System' + ), + ( + 3687, + 8, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Performance Single Point Ignition', + 'Electrical System' + ), + ( + 3688, + 8, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Standard Dual Point Ignition', + 'Electrical System' + ), + ( + 3689, + 8, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Performance Dual Point Ignition', + 'Electrical System' + ), + ( + 3690, + 8, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Standard Electronic Ignition', + 'Electrical System' + ), + ( + 3691, + 8, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler Performance Electronic Ignition', + 'Electrical System' + ), + ( + 3692, + 1, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Standard Single Point Ignition', + 'Electrical System' + ), + ( + 3693, + 1, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Performance Single Point Ignition', + 'Electrical System' + ), + ( + 3694, + 1, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Standard Dual Point Ignition', + 'Electrical System' + ), + ( + 3695, + 1, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Performance Dual Point Ignition', + 'Electrical System' + ), + ( + 3696, + 1, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Standard Electronic Ignition', + 'Electrical System' + ), + ( + 3697, + 1, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Electronic', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Performance Electronic Ignition', + 'Electrical System' + ), + ( + 3698, + 11, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Standard Single Point Ignition', + 'Electrical System' + ), + ( + 3699, + 11, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Single Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Performance Single Point Ignition', + 'Electrical System' + ), + ( + 3700, + 11, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Std. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Standard Dual Point Ignition', + 'Electrical System' + ), + ( + 3701, + 11, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Perf. Dual Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Performance Dual Point Ignition', + 'Electrical System' + ), + ( + 3702, + 45, + 'Aluminum Twistar 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Twistar 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Alloy Twistar 5', + 'Wheel Rims' + ), + ( + 3703, + 73, + 'Aluminum Rippled Orb', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Rippled Orb', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Rippled Orb', + 'Wheel Rims' + ), + ( + 3704, + 65, + 'Aluminum Hypnotic Star 6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Hypnotic Star 6', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Hypnotic Star 6', + 'Wheel Rims' + ), + ( + 3705, + 3, + 'Small Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy SB Standard Cooling System', + 'Cooling System' + ), + ( + 3706, + 3, + 'Small Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy SB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3707, + 45, + 'Aluminum Super Slot 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Super Slot 15', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Super Slot 15', + 'Wheel Rims' + ), + ( + 3708, + 73, + 'Aluminum Teardrop Slot 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Teardrop Slot 8', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Teardrop Slot 8', + 'Wheel Rims' + ), + ( + 3709, + 65, + 'Aluminum Twistar 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Twistar 7', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Twistar 7', + 'Wheel Rims' + ), + ( + 3710, + 45, + 'Aluminum Power Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Power Turbine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Aluminum Power Turbine', + 'Wheel Rims' + ), + ( + 3711, + 3, + 'W Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy W Block Standard Cooling System', + 'Cooling System' + ), + ( + 3712, + 3, + 'W Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'W Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy W Block Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3713, + 3, + 'Big Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy BB Standard Cooling System', + 'Cooling System' + ), + ( + 3714, + 3, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy BB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3715, + 8, + 'Small Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Standard Cooling System', + 'Cooling System' + ), + ( + 3716, + 8, + 'Small Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3717, + 8, + 'Small Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Performance Cooling System', + 'Cooling System' + ), + ( + 3718, + 8, + 'Big Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Standard Cooling System', + 'Cooling System' + ), + ( + 3719, + 8, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3720, + 8, + 'Big Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Performance Cooling System', + 'Cooling System' + ), + ( + 3721, + 11, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Standard Cooling System', + 'Cooling System' + ), + ( + 3722, + 11, + 'Heavy Duty', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Heavy Duty', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'AMC Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3723, + 4, + 'Big Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Standard Cooling System', + 'Cooling System' + ), + ( + 3724, + 4, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3725, + 7, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Standard Cooling System', + 'Cooling System' + ), + ( + 3726, + 7, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Performance Cooling System', + 'Cooling System' + ), + ( + 3727, + 5, + 'Big Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Standard Cooling System', + 'Cooling System' + ), + ( + 3728, + 5, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3729, + 6, + 'Nailhead Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Standard Cooling System', + 'Cooling System' + ), + ( + 3730, + 6, + 'Nailhead HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3731, + 4, + 'L-Head Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L-Head Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Standard Cooling System', + 'Cooling System' + ), + ( + 3732, + 1, + 'Flathead Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flathead Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Standard Cooling System', + 'Cooling System' + ), + ( + 3733, + 1, + 'Y Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Y Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Standard Cooling System', + 'Cooling System' + ), + ( + 3734, + 1, + 'Y Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Y Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3735, + 1, + 'Small Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Standard Cooling System', + 'Cooling System' + ), + ( + 3736, + 1, + 'Small Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3737, + 1, + 'Small Block Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss Cooling System', + 'Cooling System' + ), + ( + 3738, + 1, + 'Big Block Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Standard', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Standard Cooling System', + 'Cooling System' + ), + ( + 3739, + 1, + 'Big Block HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB HD', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Heavy Duty Cooling System', + 'Cooling System' + ), + ( + 3740, + 3, + 'Small Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy SB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3741, + 3, + 'Small Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy SB Peformance Lubrication System', + 'Lubrication System' + ), + ( + 3742, + 4, + 'Big Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac BB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3743, + 3, + 'Big Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chevy BB Performance Lubrication System', + 'Lubrication System' + ), + ( + 3744, + 8, + 'Small Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler SB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3745, + 8, + 'Big Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3746, + 8, + 'Big Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Chrysler BB Performance Lubrication System', + 'Lubrication System' + ), + ( + 3747, + 7, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Stock Lubrication System', + 'Lubrication System' + ), + ( + 3748, + 7, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Pontiac Performance Lubrication System', + 'Lubrication System' + ), + ( + 3749, + 5, + 'Big Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3750, + 5, + 'Big Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Olds BB Performance Lubrication System', + 'Lubrication System' + ), + ( + 3751, + 6, + 'Nailhead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Nailhead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Nailhead Stock Lubrication System', + 'Lubrication System' + ), + ( + 3752, + 4, + 'L-Head Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'L-Head Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cadillac L-Head Stock Lubrication System', + 'Lubrication System' + ), + ( + 3753, + 1, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Flathead Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead Stock Lubrication System', + 'Lubrication System' + ), + ( + 3754, + 1, + 'Y Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Y Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Y Block Stock Lubrication System', + 'Lubrication System' + ), + ( + 3755, + 1, + 'Small Block Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'SB Boss', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Boss Lubrication System', + 'Lubrication System' + ), + ( + 3756, + 1, + 'Windsor Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Windsor Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford SB Windsor Stock Lubrication System', + 'Lubrication System' + ), + ( + 3757, + 1, + 'Cleveland Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Cleveland Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Cleveland Stock Lubrication System', + 'Lubrication System' + ), + ( + 3758, + 1, + '385 Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Stock Lubrication System', + 'Lubrication System' + ), + ( + 3759, + 1, + '385 Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '385 Performance', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford 385 Performance Lubrication System', + 'Lubrication System' + ), + ( + 3760, + 1, + 'Big Block Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Stock', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Stock Lubrication System', + 'Lubrication System' + ), + ( + 3761, + 1, + 'Big Block Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'BB Perf.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford BB Performance Lubrication System', + 'Lubrication System' + ), + ( + 3762, + 15, + 'Super Muncie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Muncie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Super Muncie 4 Speed Manual', + 'Transmission' + ), + ( + 3763, + 15, + 'M21 4 Speed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'M21', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM M21 Close Ratio 4 Spd Manual', + 'Transmission' + ), + ( + 3764, + 15, + 'M13 3 Speed', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'M13', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'GM M13 HD 3 Speed Manual', + 'Transmission' + ), + ( + 3765, + 100, + '265/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 265/60/15 Radial', + 'Tires' + ), + ( + 3766, + 100, + '255/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 255/60/15 Radial', + 'Tires' + ), + ( + 3767, + 100, + '245/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 245/60/15 Radial', + 'Tires' + ), + ( + 3768, + 100, + '295/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 295/60/15 Radial', + 'Tires' + ), + ( + 3769, + 100, + '275/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 275/60/15 Radial', + 'Tires' + ), + ( + 3770, + 100, + '235/60/15 Radial', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Goodyear 235/60/15 Radial', + 'Tires' + ), + ( + 3771, + 21, + 'PowerMax FH', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'PowerMax', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Crane PowerMax Solid Lifter Ford FH Valvetrain', + 'Valve Train' + ), + ( + 3772, + 6, + 'Dynaflow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Dynaflow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Buick Dynaflow Automatic Transmission (TH-180C Copy)', + 'Transmission' + ), + ( + 3773, + 1, + '88', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + '88', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 'Ford Flathead 88 (HP) Camshaft', + 'Camshaft' + ); \ No newline at end of file diff --git a/migrations/0018-seedAbstractPartType.sql b/migrations/0018-seedAbstractPartType.sql new file mode 100644 index 000000000..d41b6b34e --- /dev/null +++ b/migrations/0018-seedAbstractPartType.sql @@ -0,0 +1,1952 @@ +INSERT INTO + abstract_part_type ( + abstract_part_type_id, + parent_abstract_part_type_id, + depends_on, + part_filename, + eapt, + gapt, + faft, + saft, + iaft, + jaft, + sw_aft, + baft, + modified_rule, + eut, + gut, + fut, + sut, + iut, + jut, + swut, + but, + part_paired, + schematic_picname1, + schematic_picname2, + block_family_compatibility, + repair_cost_modifier, + scrap_value_modifier, + garage_category + ) +VALUES + ( + 101, + NULL, + NULL, + NULL, + 'Vehicle', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1001, + 101, + 101, + 'sys_chas', + 'Suspension', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'sspa', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 2 + ), + ( + 2001, + 101, + 101, + 'sys_body', + 'Chassis', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'bod%d', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 3 + ), + ( + 4001, + 101, + 101, + 'sys_driv', + 'Drive Line', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'trna', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 5001, + 101, + 101, + 'drmbrake', + 'Brake Set', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'brka', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 6001, + 101, + 101, + NULL, + 'Visible Parts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 10001, + 5001, + 5001, + 'drmbrake', + 'Brakes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'In general, larger diameter, thicker brakes will provide better stopping power for a greater number of hard braking maneuvers. Disc and drum brakes have different fade characteristics.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'bk%02d', + 'SUS2', + 0, + 1.0000000, + 1.0000000, + 2 + ), + ( + 11001, + 1001, + 1001, + 'shock', + 'Shocks', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Shocks help damp out oscillations and absorb vibrations caused by road surface imperfections.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'sk%02d', + 'SUSP', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 12001, + 1001, + 1001, + 'springs', + 'Springs', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Altering the front/rear spring balance can change the steering behavior of the vehicle.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'sp%02d', + 'SUSP', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 13001, + 1001, + 1001, + 'swaybar', + 'Sway Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Increases lateral stiffness of the suspension, reducing sway in hard corners.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'sw%02d', + 'SUSP', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 14001, + 1001, + 1001, + 'traction', + 'Traction Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Increases suspension stiffness during acceleration, which helps the vehicle maintain traction.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'trbp', + 'SUSP', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 15001, + 101, + 101, + 'sys_whee', + 'Wheels', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'The wheel assembly is the primary influence on the vehicle''s traction capability.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'whla', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 2 + ), + ( + 16001, + 6001, + 6001, + 'fuzzdice', + 'Fuzzy Dice', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'It''s just for looks.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 17001, + 6001, + 6001, + NULL, + 'Roll Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 18001, + 6001, + 6001, + 'windtint', + 'Window Tinting', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'It''s just for looks.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 20001, + 2001, + 2001, + 'sys_body', + 'Body', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Spoilers improve the body''s downforce.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'bod%d', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 3 + ), + ( + 21001, + 6001, + 6001, + 'wskirts', + 'Wheels Skirts', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'It''s just for looks.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 22001, + 6001, + 6001, + 'horn', + 'Horn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Sound your horn! Pick from a wide variety of distinct horn sounds.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 23001, + 6001, + 6001, + 'runboard', + 'Running Boards', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Pure looks.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 26001, + 6001, + 6001, + 'foglight', + 'Fog Lights', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Extra lights.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 28001, + NULL, + NULL, + NULL, + 'Spot Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 29001, + 2001, + 2001, + 'spoil_ch', + 'Chin Spoiler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Provides aerodynamic downforce for improved traction at high speeds; be careful because too much downforce can over-stress an unmodified suspension.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'chsp', + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 30001, + 2001, + 2001, + 'spoil_rr', + 'Rear Spoiler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Provides aerodynamic downforce for improved traction at high speeds; be careful because too much downforce can over-stress an unmodified suspension.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'rspp', + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 31001, + 6001, + 6001, + 'topstyle', + 'Top Style', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'There is a slight disadvantage to a chopped top due to the disturbed airflow, which increases drag.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 32001, + 6001, + 6001, + 'wheelieb', + 'Wheelie Bar', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Pure looks.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 33001, + NULL, + NULL, + NULL, + 'Driver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'The heavier the driver, the more total weight, but more weight can help cornering.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 34001, + 6001, + 6001, + 'fender', + 'Fenders', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Remove them to slightly reduce the drag.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 35001, + 6001, + 6001, + 'bumper', + 'Bumpers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Can be removed from some cars to lose weight.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 36001, + 101, + 101, + 'engine1', + 'Engine', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Select an engine that meets your needs; too much horsepower can be just as bad as too little. Experiment!', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'enga', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 1 + ), + ( + 37001, + 101, + 101, + 'sys_exha', + 'Exhaust', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'This is an assembly, a collection of related parts that are grouped together. They may be installed, uninstalled, scrapped or traded as if they were individual parts.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'exha', + 'VEH%d', + 0, + 1.0000000, + 1.0000000, + 1 + ), + ( + 39001, + NULL, + NULL, + NULL, + 'Cop Lights', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 40001, + 6001, + 6001, + 'hood', + 'Hood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 100001, + 15001, + 15001, + 'wheel', + 'Wheel Rims', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Holds the tires and affects wheel inertia; light wheels will help the tire spin up faster, but may make the tire tend to slip.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'wrmp', + 'WHLA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 110001, + 15001, + 15001, + 'tire', + 'Tires', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'There''s a good reason for the old expression "where the rubber meets the road". Select a tire that meets your needs. High performance tires are precise, but can be unforgiving for the neophyte driver.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'tirp', + 'WHLA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 120001, + 6001, + 6001, + 'hubcap', + 'Hub Caps', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 130001, + 4001, + 4001, + 'transmis', + 'Transmission', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'High gear ratios are good for quick acceleration; low ratios provide higher top speed.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'trnp', + 'TRNA', + 0, + 1.0000000, + 1.0000000, + 1 + ), + ( + 140001, + 4001, + 4001, + 'rearend', + 'Rear End', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'High ratios usually (but not always) provide better acceleration; low ratios provide potentially higher top end speeds.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'rerp', + 'TRNA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 150001, + 4001, + 4001, + 'trancool', + 'Transmission Cooler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Protect your hard-working automatic transmission with a transmission cooler to prevent over-heating. If the automatic transmission fluid gets too hot, the transmission can be severely damaged.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'trcp', + 'TRNA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 160001, + 36001, + 36001, + 'eblock', + 'Engine Block', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'When upgrading your engine, keep in mind that more power isn''t always appropriate if you can''t handle it. Bigger isn''t always better.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'blkp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 180001, + 36001, + 36001, + 'crnkshft', + 'Crankshaft', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Affects engine inertia and governs wear on the rotating assembly. A lighter crankshaft will give you faster throttle response and less engine braking. A heavier crankshaft is generally more durable.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'crkp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 190001, + 36001, + 36001, + 'rods', + 'Connecting Rods', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Affects engine inertia and governs wear on the rotating assembly; lightweight, heavy duty connecting rods can increase engine speed and power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'conp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 200001, + 36001, + 36001, + 'pistons', + 'Pistons', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Affects engine inertia and governs wear on the rotating assembly; domed pistons can increase the compression ratio, which increases power. Lightweight pistons can increase the engine''s throttle response.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'pisp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 210001, + NULL, + NULL, + 'sys_cylh', + 'Cylinder Head A', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 230001, + 36001, + 36001, + 'coolpump', + 'Cooling System', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'If your engine is working hard, don''t forget to make sure the cooling system can handle the heat; be careful, however, because high-end systems can bleed off significant engine power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'colp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 240001, + 36001, + 36001, + 'distrib', + 'Electrical System', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'High RPM, high power engines need special electrical systems to provide powerful well-timed ignition.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'elcp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 250001, + 36001, + 36001, + 'oilcool', + 'Lubrication System', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Keep your engine running smooth and help prevent damage with a high performance lubrication system; high-performance lubrication systems can bleed off significant engine power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'lubp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 280001, + 36001, + 36001, + 'exhmani', + 'Exhaust Manifold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'There are many different types of exhaust manifolds; high performance exhausts or headers let the engine breathe and are one of the fastest ways to get a little extra performance.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'exmp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 290001, + 37001, + 37001, + 'pipes', + 'Exhaust Pipe', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'A higher performance exhaust pipe can improve your engine power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'exhp', + 'EXHA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 300001, + 37001, + 37001, + 'turbmuff', + 'Muffler', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'A higher performance muffler can improve your engine power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'mufp', + 'EXHA', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 310001, + 6001, + 6001, + 'tailptip', + 'Tail Pipe Tip', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 320001, + 36001, + 36001, + 'intmani', + 'Intake Manifold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'There are a wide variety of intake manifolds; a good high performance intake manifold can be expensive, but worth it. The type of manifold you select can dramatically change the RPM power band of your engine.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'intp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 330001, + 36001, + 36001, + 'carb', + 'Carburetor', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Bigger isn''t always better; choose a carburetor that flows the right amount of air (cfm) for the displacement and peak RPM of your engine.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'crbp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 340001, + 36001, + 36001, + 'airclean', + 'Air Cleaner', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Protect your engine from the elements with a nice air filter. You don''t want dirt in there, do you?', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'aclp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 340333, + 36001, + 36001, + 'scoop', + 'Air Scoop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Provides improved air flow into the engine and can improve performance.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'ascp', + 'BOD%d', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 340666, + 36001, + 36001, + 'airclean', + 'Air Intake Point', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Install either an air cleaner or air scoop here.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'aclp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 350001, + 36001, + 36001, + 'blower', + 'Blower', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Provides a pressure boost to the cylinders, leading to substantial power increases; can radically increase engine wear if engine compression ratio is too high.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'blwp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 350666, + 36001, + 36001, + NULL, + 'Supercharger', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Install either a blower or a nitrous injector here.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 360001, + 36001, + 36001, + 'nitrous', + 'Nitrous Injector', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Increases engine power by adding oxygen but causes excessive heat and additional engine damage.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'nitp', + 'ENGN', + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1000001, + 36001, + 36001, + 'cylhead', + 'Cylinder Head', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Cylinder heads are the single most important factor in determining engine performance. Higher compression and larger valves generally equal more power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'hedp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1100001, + 36001, + 36001, + 'camshaft', + 'Camshaft', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'The type of camshaft has a primary influence on engine performance. Street and Dual Purpose cams can add significant power.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'camp', + 'ENGN', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1200001, + 36001, + 36001, + 'valvetrn', + 'Valve Train', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Controls valve action and affects maximum engine RPMs. High performance lifters can dramatically increase performance, but tend to increase engine wear.', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'vlvp', + 'CYLY', + 1, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1300001, + NULL, + NULL, + 'valves', + 'Intake Valves', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1400001, + NULL, + NULL, + 'valves', + 'Exhaust Valves', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ), + ( + 1500001, + NULL, + NULL, + 'valvecov', + 'Valve Covers', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + 0, + 1.0000000, + 1.0000000, + 0 + ); \ No newline at end of file diff --git a/migrations/0019-seedAbstractPartGrade.sql b/migrations/0019-seedAbstractPartGrade.sql new file mode 100644 index 000000000..391c75b44 --- /dev/null +++ b/migrations/0019-seedAbstractPartGrade.sql @@ -0,0 +1,8 @@ +INSERT INTO + part_grade (part_grade_id, e_text, g_text, f_text, part_grade) +VALUES + (0, 'no grade', NULL, NULL, NULL), + (1, 'Stock', NULL, NULL, NULL), + (2, 'Performance', NULL, NULL, NULL), + (3, 'High Performance', NULL, NULL, NULL), + (4, 'Racing', NULL, NULL, NULL); \ No newline at end of file diff --git a/migrations/0020-seedAbstractPartType.sql b/migrations/0020-seedAbstractPartType.sql new file mode 100644 index 000000000..9535938ae --- /dev/null +++ b/migrations/0020-seedAbstractPartType.sql @@ -0,0 +1,16273 @@ +INSERT INTO + part_type ( + part_type_id, + abstract_part_type_id, + part_type, + part_filename, + part_grade_id + ) +VALUES + (101, 101, '1932 Ford V-8 Coupe', NULL, 1), + (102, 101, '1940 Ford Deluxe Coupe', NULL, 1), + (103, 101, '1953 Ford Crestline', NULL, 1), + (104, 101, '1957 Ford Fairlane 500', NULL, 1), + (105, 101, '1957 Ford Ranchero', NULL, 1), + (106, 101, '1957 Ford Thunderbird', NULL, 1), + (107, 101, '1963 Ford Thunderbird', NULL, 1), + (108, 101, '1965 Ford Mustang', NULL, 1), + (109, 101, '1964 Ford Galaxie 500', NULL, 1), + (110, 101, '1969 Ford Torino GT', NULL, 1), + (111, 101, '1970 Ford Boss 302 Mustang', NULL, 1), + (112, 101, '1949 Mercury Coupe', NULL, 1), + (113, 101, '1957 Chevrolet Bel-Air', NULL, 1), + (114, 101, '1957 Chevrolet Corvette', NULL, 1), + (115, 101, '1957 Chevrolet Nomad Wagon', NULL, 1), + (116, 101, '1964 Chevrolet Impala', NULL, 1), + ( + 117, + 101, + '1963 Chevrolet Corvette Stingray', + NULL, + 1 + ), + (118, 101, '1958 Chevrolet Impala', NULL, 1), + (119, 101, '1967 Chevrolet Chevelle', NULL, 1), + (120, 101, '1967 Chevrolet Camaro', NULL, 1), + (121, 101, '1970 Chevrolet Chevelle', NULL, 1), + (122, 101, '1970 Chevrolet El Camino', NULL, 1), + (123, 101, '1970 Chevrolet Nova', NULL, 1), + ( + 124, + 101, + '1947 Cadillac Series 62 Sedanette', + NULL, + 1 + ), + ( + 125, + 101, + '1959 Cadillac Eldorado Biarritz', + NULL, + 1 + ), + (126, 101, '1969 Oldsmobile 4-4-2', NULL, 1), + (127, 101, '1955 Buick Century', NULL, 1), + (128, 101, '1966 Pontiac GTO', NULL, 1), + (129, 101, '1969 Pontiac GTO', NULL, 1), + (130, 101, '1973 Pontiac Firebird T/A', NULL, 1), + (131, 101, '1969 AMX', NULL, 1), + (132, 101, '1969 Dodge Charger', NULL, 1), + (133, 101, '1969 Plymouth Road Runner', NULL, 1), + (134, 101, '1970 Cuda', NULL, 1), + (135, 101, '1971 Plymouth Duster', NULL, 1), + (138, 101, 'Traffic 2 door', NULL, 1), + (140, 101, '1967 Chevrolet Camaro SS', NULL, 1), + (142, 101, '1970 Ford Boss 429 Mustang', NULL, 1), + (146, 101, 'TRFMONTE', NULL, 1), + (147, 101, 'TRFDELVR', NULL, 1), + (148, 101, 'TRFBUS', NULL, 1), + (149, 101, 'TRFGSX', NULL, 1), + (150, 101, 'TRFSTANG', NULL, 1), + (151, 101, 'TRFTBIRD', NULL, 1), + (152, 101, 'TRFPUP1', NULL, 1), + (153, 101, 'TRF2DR', NULL, 1), + (154, 101, '1969 AMC Big Bad AMX', NULL, 1), + (157, 101, '1969 Plymouth GTX Coupe', NULL, 1), + (207, 101, 'Shelby 427 Cobra', NULL, 1), + (210, 101, '1970 Ford Mustang', NULL, 1), + (211, 101, '1969 Ford Torino GT Cobra', NULL, 1), + (212, 101, '1970 Ford Mustang Mach 1', NULL, 1), + (213, 101, '1970 Plymouth Hemi Cuda', NULL, 1), + (214, 101, '1970 Plymouth 440 Cuda', NULL, 1), + (215, 101, '1970 Plymouth AAR Cuda', NULL, 1), + (216, 101, '1971 Plymouth 340 Duster', NULL, 1), + (217, 101, '1964 Chevrolet Impala SS', NULL, 1), + (218, 101, '1967 Chevrolet Chevelle SS', NULL, 1), + (219, 101, '1967 Chevrolet Camaro RS', NULL, 1), + (220, 101, '1967 Chevrolet Camaro Z-28', NULL, 1), + (221, 101, '1970 Chevrolet Chevelle SS', NULL, 1), + (222, 101, '1970 Chevrolet El Camino SS', NULL, 1), + (223, 101, '1970 Chevrolet Nova SS', NULL, 1), + (224, 101, '1969 Oldsmobile 442 W-30', NULL, 1), + (225, 101, '1969 Oldsmobile Hurst 442', NULL, 1), + (226, 101, '1969 Pontiac GTO Judge', NULL, 1), + ( + 227, + 101, + '1973 Pontiac Firebird Formula', + NULL, + 1 + ), + (228, 101, '1973 Pontiac Firebird', NULL, 1), + ( + 1001, + 1001, + 'Generic Chassis Suspension', + 'SUSP', + 1 + ), + (2001, 2001, 'Generic Chassis Body', NULL, 1), + (4001, 4001, 'Generic Driveline Assembly', NULL, 1), + (5001, 5001, 'Generic Brake Set', NULL, 1), + ( + 6001, + 6001, + 'Generic Visible Parts Assembly', + NULL, + 1 + ), + ( + 10001, + 10001, + '10 x 2 Organic Disc Brake', + NULL, + 1 + ), + ( + 10002, + 10001, + '11 x 2 Organic Disc Brake', + NULL, + 2 + ), + ( + 10003, + 10001, + '12 x 2 Organic Disc Brake', + NULL, + 2 + ), + (10004, 10001, '9 x 2 Organic Disc Brake', NULL, 1), + ( + 10005, + 10001, + '9 x 2 Organic HT Disc Brake', + NULL, + 1 + ), + ( + 10006, + 10001, + '10 x 2 Organic HT Disc Brake', + NULL, + 1 + ), + ( + 10007, + 10001, + '11 x 2 Organic HT Disc Brake', + NULL, + 2 + ), + ( + 10008, + 10001, + '12 x 2 Organic HT Disc Brake', + NULL, + 2 + ), + (10009, 10001, '9 x 2 Organic Drum Brake', NULL, 1), + ( + 10010, + 10001, + '10 x 2 Organic Drum Brake', + NULL, + 1 + ), + ( + 10011, + 10001, + '11 x 2 Organic Drum Brake', + NULL, + 1 + ), + ( + 10012, + 10001, + '12 x 2 Organic Drum Brake', + NULL, + 1 + ), + ( + 10013, + 10001, + '9 x 2 Organic HT Drum Brake', + NULL, + 1 + ), + ( + 10014, + 10001, + '10 x 2 Organic HT Drum Brake', + NULL, + 1 + ), + ( + 10015, + 10001, + '11 x 2 Organic HT Drum Brake', + NULL, + 1 + ), + ( + 10016, + 10001, + '12 x 2 Organic HT Drum Brake', + NULL, + 2 + ), + ( + 10017, + 10001, + '11 x 2 Semi-Metallic Disc Brake', + NULL, + 2 + ), + ( + 10018, + 10001, + '12 x 2 Semi-Metallic Disc Brake', + NULL, + 2 + ), + ( + 10019, + 10001, + '11 x 2 Semi-Metallic Drum Brake', + NULL, + 2 + ), + ( + 10020, + 10001, + '12 x 2 Semi-Metallic Drum Brake', + NULL, + 2 + ), + ( + 10021, + 10001, + '11 x 2 Metallic Disc Brake', + NULL, + 2 + ), + ( + 10022, + 10001, + '12 x 2 Metallic Disc Brake', + NULL, + 3 + ), + ( + 10023, + 10001, + '14 x 2 Metallic Disc Brake', + NULL, + 4 + ), + ( + 10024, + 10001, + '16 x 2 Metallic Disc Brake', + NULL, + 4 + ), + ( + 10025, + 10001, + '10 x 2 Metallic Disc Brake', + NULL, + 2 + ), + ( + 10026, + 10001, + '9 x 2 Metallic Disc Brake', + NULL, + 2 + ), + ( + 10027, + 10001, + '10 x 2 Metallic Disc ABS Brake', + NULL, + 3 + ), + ( + 10028, + 10001, + '12 x 2 Metallic Disc ABS Brake', + NULL, + 3 + ), + ( + 10029, + 10001, + '14 x 2 Metallic Disc ABS Brake', + NULL, + 4 + ), + ( + 10030, + 10001, + '16 x 2 Metallic Disc ABS Brake', + NULL, + 4 + ), + ( + 10031, + 10001, + '11 x 2 Metallic Disc ABS Brake', + NULL, + 3 + ), + ( + 10032, + 10001, + '13 x 2 Organic Drum Brake', + NULL, + 3 + ), + ( + 10033, + 10001, + '13 x 2 Organic Disc Brake', + NULL, + 3 + ), + ( + 10034, + 10001, + '13 x 2 Organic HT Drum Brake', + NULL, + 3 + ), + ( + 10035, + 10001, + '13 x 2 Organic HT Disc Brake', + NULL, + 3 + ), + ( + 10036, + 10001, + '13 x 2 Metallic Disc Brake', + NULL, + 3 + ), + ( + 10037, + 10001, + '13 x 2 Semi-Metallic Disc Brake', + NULL, + 3 + ), + ( + 10038, + 10001, + '13 x 2 Metallic Disc ABS Brake', + NULL, + 3 + ), + ( + 10039, + 10001, + '14 x 2 Organic Drum Brake', + NULL, + 3 + ), + ( + 10040, + 10001, + '14 x 2 Organic Disc Brake', + NULL, + 3 + ), + ( + 10041, + 10001, + '14 x 2 Organic HT Drum Brake', + NULL, + 3 + ), + ( + 10042, + 10001, + '14 x 2 Organic HT Disc Brake', + NULL, + 3 + ), + ( + 10043, + 10001, + '9 x 2 Semi-Metallic Disc Brake', + NULL, + 2 + ), + ( + 10044, + 10001, + '9 x 2 Metallic Disc ABS Brake', + NULL, + 3 + ), + (11001, 11001, 'LD (0.2) Shock', NULL, 1), + (11002, 11001, 'LD (0.3) Shock', NULL, 1), + (11003, 11001, 'ND (0.2) Shock', NULL, 1), + (11004, 11001, 'ND (0.3) Shock', NULL, 1), + (11005, 11001, 'HD (0.24) Shock', NULL, 2), + (11006, 11001, 'HD (0.3) Shock', NULL, 2), + (11007, 11001, 'HD (0.36) Shock', NULL, 2), + (11008, 11001, 'XHD (0.3) Shock', NULL, 3), + (11009, 11001, 'XHD (0.36) Shock', NULL, 3), + (11010, 11001, 'XHD (0.4) Shock', NULL, 3), + (11011, 11001, 'ND (0.3) 12.5" Shock', NULL, 1), + ( + 11012, + 11001, + 'Edelbrock Performer IAS Shock', + NULL, + 2 + ), + ( + 11013, + 11001, + 'Edelbrock Street Stock Race Shock', + NULL, + 3 + ), + (12001, 12001, '70 lb/in traverse spring', NULL, 1), + (12002, 12001, '80 lb/in traverse spring', NULL, 1), + (12003, 12001, '90 lb/in traverse spring', NULL, 1), + ( + 12004, + 12001, + '100 lb/in traverse spring', + NULL, + 1 + ), + ( + 12005, + 12001, + '110 lb/in traverse spring', + NULL, + 1 + ), + (12006, 12001, '120 lb/in coil spring', NULL, 1), + (12007, 12001, '130 lb/in coil spring', NULL, 1), + (12008, 12001, '140 lb/in coil spring', NULL, 1), + (12009, 12001, '150 lb/in coil spring', NULL, 1), + (12010, 12001, '160 lb/in coil spring', NULL, 1), + (12011, 12001, '170 lb/in coil spring', NULL, 1), + (12012, 12001, '180 lb/in leaf spring', NULL, 2), + (12013, 12001, '190 lb/in leaf spring', NULL, 2), + (12014, 12001, '200 lb/in leaf spring', NULL, 3), + ( + 12015, + 12001, + '210 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12016, + 12001, + '220 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12017, + 12001, + '230 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12018, + 12001, + '240 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12019, + 12001, + '250 lb/in coil-over spring', + NULL, + 3 + ), + (12020, 12001, '100 lb/in coil spring', NULL, 1), + (12021, 12001, '110 lb/in coil spring', NULL, 1), + (12022, 12001, '150 lb/in leaf spring', NULL, 1), + (12023, 12001, '160 lb/in leaf spring', NULL, 1), + (12024, 12001, '170 lb/in leaf spring', NULL, 1), + ( + 12025, + 12001, + '190 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12026, + 12001, + '200 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12027, + 12001, + '180 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12028, + 12001, + '170 lb/in coil-over spring', + NULL, + 3 + ), + ( + 12029, + 12001, + '160 lb/in coil-over spring', + NULL, + 3 + ), + (12030, 12001, '140 lb/in leaf spring', NULL, 1), + (12031, 12001, '130 lb/in leaf spring', NULL, 1), + (12032, 12001, '120 lb/in leaf spring', NULL, 1), + (12033, 12001, '110 lb/in leaf spring', NULL, 1), + (12034, 12001, '220 lb/in coil spring', NULL, 1), + (12035, 12001, '230 lb/in coil spring', NULL, 1), + (12036, 12001, '240 lb/in coil spring', NULL, 1), + (12037, 12001, '250 lb/in coil spring', NULL, 2), + (12038, 12001, '260 lb/in coil spring', NULL, 2), + (12039, 12001, '270 lb/in coil spring', NULL, 2), + (12040, 12001, '280 lb/in coil spring', NULL, 2), + (12041, 12001, '290 lb/in coil spring', NULL, 2), + (12042, 12001, '300 lb/in coil spring', NULL, 2), + (12043, 12001, '310 lb/in coil spring', NULL, 2), + (12044, 12001, '320 lb/in coil spring', NULL, 2), + (12045, 12001, '330 lb/in coil spring', NULL, 2), + (12046, 12001, '340 lb/in coil spring', NULL, 2), + (12047, 12001, '350 lb/in coil spring', NULL, 2), + (12048, 12001, '360 lb/in coil spring', NULL, 3), + (12049, 12001, '370 lb/in coil spring', NULL, 3), + (12050, 12001, '380 lb/in coil spring', NULL, 3), + (12051, 12001, '390 lb/in coil spring', NULL, 3), + (12052, 12001, '400 lb/in coil spring', NULL, 3), + (12053, 12001, '410 lb/in coil spring', NULL, 3), + (12054, 12001, '420 lb/in coil spring', NULL, 3), + (12055, 12001, '430 lb/in coil spring', NULL, 3), + (12056, 12001, '440 lb/in coil spring', NULL, 3), + (12057, 12001, '450 lb/in coil spring', NULL, 3), + (12058, 12001, '460 lb/in coil spring', NULL, 4), + (12059, 12001, '470 lb/in coil spring', NULL, 4), + (12060, 12001, '480 lb/in coil spring', NULL, 4), + (12061, 12001, '490 lb/in coil spring', NULL, 4), + (12062, 12001, '500 lb/in coil spring', NULL, 4), + (12063, 12001, '510 lb/in coil spring', NULL, 4), + (12064, 12001, '180 lb/in coil spring', NULL, 1), + (12065, 12001, 'Edelbrock AS Coil Spring', NULL, 2), + (12066, 12001, 'Edelbrock AB Coil Spring', NULL, 2), + ( + 12067, + 12001, + 'Edelbrock AGB Coil Spring', + NULL, + 2 + ), + (12068, 12001, 'Edelbrock F Coil Spring', NULL, 2), + (12069, 12001, 'Edelbrock M Coil Spring', NULL, 2), + (13001, 13001, '50 Nm Sway Bar', NULL, 1), + (13002, 13001, '60 Nm Sway Bar', NULL, 1), + (13003, 13001, '70 Nm Sway Bar', NULL, 1), + (13004, 13001, '80 Nm Sway Bar', NULL, 1), + (13005, 13001, '90 Nm Sway Bar', NULL, 1), + (13006, 13001, '100 Nm Sway Bar', NULL, 1), + (13007, 13001, '110 Nm Sway Bar', NULL, 1), + (13008, 13001, '120 Nm Sway Bar', NULL, 1), + (13009, 13001, '130 Nm Sway Bar', NULL, 1), + (13010, 13001, '140 Nm Sway Bar', NULL, 1), + (13011, 13001, '150 Nm Sway Bar', NULL, 1), + (13012, 13001, '160 Nm Sway Bar', NULL, 1), + (13013, 13001, '170 Nm Sway Bar', NULL, 1), + (13014, 13001, '180 Nm Sway Bar', NULL, 2), + (13015, 13001, '190 Nm Sway Bar', NULL, 2), + (13016, 13001, '200 Nm Sway Bar', NULL, 2), + (13017, 13001, '210 Nm Sway Bar', NULL, 2), + (13018, 13001, '220 Nm Sway Bar', NULL, 2), + (13019, 13001, '230 Nm Sway Bar', NULL, 2), + (13020, 13001, '240 Nm Sway Bar', NULL, 2), + (13021, 13001, '250 Nm Sway Bar', NULL, 3), + (13022, 13001, '260 Nm Sway Bar', NULL, 3), + (13023, 13001, '270 Nm Sway Bar', NULL, 3), + (13024, 13001, '280 Nm Sway Bar', NULL, 3), + ( + 13025, + 13001, + 'Edelbrock Tubular Panhard Rod', + NULL, + 2 + ), + (14001, 14001, 'LD Traction Bar', NULL, 1), + (14002, 14001, 'ND Traction Bar', NULL, 2), + (14003, 14001, 'HD Traction Bar', NULL, 3), + (14004, 14001, 'XHD Traction Bar', NULL, 4), + (14005, 14001, 'Edelbrock Anti-Hop Bar', NULL, 2), + (15001, 15001, 'Wheel Assembly', NULL, 1), + ( + 16001, + 16001, + 'Fuzzy Dice Accessory', + 'fuzzdice', + 1 + ), + (17001, 17001, 'Generic Roll Bar', '.bodymod', 1), + ( + 18001, + 18001, + 'Medium Window Tinting', + '.bodymod', + 1 + ), + ( + 18002, + 18001, + 'Light Window Tinting', + '.bodymod', + 1 + ), + ( + 18003, + 18001, + 'Dark Window Tinting', + '.bodymod', + 1 + ), + ( + 18004, + 18001, + 'Very Dark Window Tinting', + '.bodymod', + 1 + ), + (20101, 20001, '1932 Ford Coupe', '32ford', 1), + (20102, 20001, '1940 Ford Coupe', '40ford', 1), + (20103, 20001, '1953 Ford Crestline', '53ford', 1), + (20104, 20001, '1957 Ford Fairlane', '57fair', 1), + (20105, 20001, '1957 Ford Ranchero', '57ranch', 1), + ( + 20106, + 20001, + '1957 Ford Thunderbird', + '57tbird', + 1 + ), + ( + 20107, + 20001, + '1963 Ford Thunderbird', + '63tbird', + 1 + ), + (20108, 20001, '1964 Ford Mustang', '64stang', 1), + (20109, 20001, '1964 Ford Galaxie', '64galaxi', 1), + ( + 20110, + 20001, + '1969 Ford Torino GT', + '69torino', + 1 + ), + (20111, 20001, '1970 Ford Boss 302', '70stang', 1), + (20112, 20001, '1949 Mercury Coupe', '49merc', 1), + ( + 20113, + 20001, + '1957 Chevrolet Bel-Air', + '57chevy', + 1 + ), + ( + 20114, + 20001, + '1957 Chevrolet Corvette', + '57vette', + 1 + ), + ( + 20115, + 20001, + '1957 Chevrolet Nomad', + '57nomad', + 1 + ), + ( + 20116, + 20001, + '1964 Chevrolet Impala', + '64impala', + 1 + ), + ( + 20117, + 20001, + '1963 Chevrolet Stingray', + '63vette', + 1 + ), + ( + 20118, + 20001, + '1958 Chevrolet Impala', + '58impala', + 1 + ), + ( + 20119, + 20001, + '1967 Chevrolet Chevelle', + '67chev', + 1 + ), + ( + 20120, + 20001, + '1967 Chevrolet Camaro', + '67camaro', + 1 + ), + ( + 20121, + 20001, + '1970 Chevrolet Chevelle', + '70chev', + 1 + ), + ( + 20122, + 20001, + '1970 Chevrolet El Camino', + '70camino', + 1 + ), + (20123, 20001, '1970 Chevrolet Nova', '70nova', 1), + ( + 20124, + 20001, + '1947 Cadillac Series 62', + '47caddy', + 1 + ), + ( + 20125, + 20001, + '1959 Cadillac Eldorado', + '59caddy', + 1 + ), + ( + 20126, + 20001, + '1969 Oldsmobile 4-4-2', + '69old442', + 1 + ), + (20127, 20001, '1955 Buick Century', '55cent', 1), + (20128, 20001, '1966 Pontiac GTO', '66gto', 1), + (20129, 20001, '1969 Pontiac GTO', '69gto', 1), + ( + 20130, + 20001, + '1973 Pontiac Firebird T/A', + '73trans', + 1 + ), + (20131, 20001, '1969 AMC AMX', '69amcamx', 1), + (20132, 20001, '1969 Dodge Charger', '69charge', 1), + ( + 20133, + 20001, + '1969 Plymouth Rd. Runner', + '69runner', + 1 + ), + (20134, 20001, '1970 Plymouth Cuda', '70hemicu', 1), + ( + 20135, + 20001, + '1971 Plymouth Duster', + '71duster', + 1 + ), + ( + 20138, + 20001, + '1999 EA Traffic 2 door', + 'trf2dr', + 1 + ), + ( + 20140, + 20001, + '1967 Chevrolet Camaro SS', + '67sscam', + 1 + ), + (20146, 20001, '1990 EA TRFMONTE', 'TRFMONTE', 1), + (20147, 20001, '1990 EA TRFDELVR', 'TRFDELVR', 1), + (20148, 20001, '1990 EA TRFBUS', 'TRFBUS', 1), + (20149, 20001, '1990 EA TRFGSX', 'TRFGSX', 1), + (20150, 20001, '1990 EA TRFSTANG', 'TRFSTANG', 1), + (20151, 20001, '1990 EA TRFTBIRD', 'TRFTBIRD', 1), + (20152, 20001, '1990 EA TRFPUP1', 'TRFPUP1', 1), + (20153, 20001, '1990 EA TRF2DR', 'TRF2DR', 1), + (20157, 20001, '1969 Plymouth GTX', '69GTX', 1), + (20207, 20001, '1966 Shelby 427 Cobra', '66cob', 1), + (20210, 20001, '1970 Ford Mustang', '70stang', 1), + ( + 20211, + 20001, + '1969 Ford Torino Cobra', + '69torino', + 1 + ), + (20212, 20001, '1970 Ford Mach 1', '70STANG', 1), + ( + 20213, + 20001, + '1970 Plymouth Hemi Cuda', + '70hemicu', + 1 + ), + ( + 20214, + 20001, + '1970 Plymouth 440 Cuda', + '70hemicu', + 1 + ), + ( + 20215, + 20001, + '1970 Plymouth AAR Cuda', + '70CUDA', + 1 + ), + ( + 20216, + 20001, + '1971 Plymouth 340 Duster', + '71duster', + 1 + ), + ( + 20217, + 20001, + '1964 Chevrolet Impala SS', + '64impala', + 1 + ), + ( + 20218, + 20001, + '1967 Chevrolet Chevelle SS', + '67chev', + 1 + ), + ( + 20219, + 20001, + '1967 Chevrolet Camaro RS', + '67camaro', + 1 + ), + ( + 20220, + 20001, + '1967 Chevrolet Camaro Z-28', + '67camaro', + 1 + ), + ( + 20221, + 20001, + '1970 Chevrolet Chevelle SS', + '70CHEV', + 1 + ), + ( + 20222, + 20001, + '1970 Chevrolet El Camino SS', + '70CAMINO', + 1 + ), + ( + 20223, + 20001, + '1970 Chevrolet Nova SS', + '70nova', + 1 + ), + ( + 20224, + 20001, + '1969 Oldsmobile 4-4-2 W-30', + '69W30old', + 1 + ), + ( + 20225, + 20001, + '1969 Oldsmobile Hurst 4-4-2', + '69old442', + 1 + ), + ( + 20226, + 20001, + '1969 Pontiac GTO Judge', + '69gto', + 1 + ), + ( + 20227, + 20001, + '1973 Pontiac Firebird Formula', + '73fireb', + 1 + ), + ( + 20228, + 20001, + '1973 Pontiac Firebird', + '73fireb', + 1 + ), + (21001, 21001, '1947 Cadillac', '.bodymod', 1), + (21002, 21001, '1949 Ford', '.bodymod', 1), + ( + 21003, + 21001, + '1973 Cadillac Fleetwood Eldorado', + '.bodymod', + 1 + ), + (21004, 21001, '1953 Chevy Bel Air', '.bodymod', 1), + (21005, 21001, '1967 Chevy Impala', '.bodymod', 1), + ( + 21006, + 21001, + '1969 Chevy Chevelle', + '.bodymod', + 1 + ), + ( + 21007, + 21001, + '1970 Chevrolet Monte Carlo', + '.bodymod', + 1 + ), + ( + 21008, + 21001, + '53 C.line Fender Skirt', + '.bodymod', + 1 + ), + (21009, 21001, '1955 Ford Fairlane', '.bodymod', 1), + ( + 21010, + 21001, + '1956 Ford / Thunderbird', + '.bodymod', + 1 + ), + ( + 21011, + 21001, + '1957 Ford / Thunderbird', + '.bodymod', + 1 + ), + (21012, 21001, '1937 Ford', '.bodymod', 1), + (21013, 21001, '1939 Chevrolet', '.bodymod', 1), + ( + 21014, + 21001, + '40 Coupe Fender Skirt', + '.bodymod', + 1 + ), + (21015, 21001, '1941 Plymouth', '.bodymod', 1), + ( + 21016, + 21001, + '49 Coupe Fender Skirt', + '.bodymod', + 1 + ), + (22001, 22001, 'Vanilla Horn', NULL, 1), + (22002, 22001, 'Cuda A', NULL, 1), + (22003, 22001, 'Cuda B', NULL, 1), + (22004, 22001, 'Cuda 2stone', NULL, 1), + (22005, 22001, 'El Camino A', NULL, 1), + (22006, 22001, 'El Camino B', NULL, 1), + (22007, 22001, 'Firebird A', NULL, 1), + (22008, 22001, 'Firebird B', NULL, 1), + (22009, 22001, 'Fury', NULL, 1), + (22010, 22001, 'GMC', NULL, 1), + (22011, 22001, 'Hillman', NULL, 1), + (22012, 22001, 'Impala', NULL, 1), + (22013, 22001, 'Metropolitan', NULL, 1), + (22014, 22001, 'Metropolitan Siren', NULL, 1), + (22015, 22001, 'Mustang', NULL, 1), + (22016, 22001, 'Snubnose', NULL, 1), + (22017, 22001, 'Aoooga A', NULL, 1), + (22018, 22001, 'Aoooga B', NULL, 1), + (22019, 22001, 'Aoooga C', NULL, 1), + (22020, 22001, 'Horn La cooca racha', NULL, 1), + (22021, 22001, 'Horn Reville', NULL, 1), + (22022, 22001, 'Horn Dixie', NULL, 1), + (22023, 22001, 'Horn Charge', NULL, 1), + (22024, 22001, 'Horn Charge Short', NULL, 1), + ( + 23001, + 23001, + '1927 Ford Model T Boards', + '.bodymod', + 1 + ), + ( + 23002, + 23001, + '1931 Ford Model A Boards', + '.bodymod', + 1 + ), + ( + 23003, + 23001, + '1932 Ford Coupe Boards', + '.bodymod', + 1 + ), + ( + 23004, + 23001, + '1932 Chevrolet Confederate Boards', + '.bodymod', + 1 + ), + ( + 23005, + 23001, + '1934 Ford Coupe Boards', + '.bodymod', + 1 + ), + ( + 23006, + 23001, + '1937 Ford Coupe Boards', + '.bodymod', + 1 + ), + ( + 23007, + 23001, + '1937 Chevy Coupe Boards', + '.bodymod', + 1 + ), + ( + 23008, + 23001, + '1939 Chevy Coupe Boards', + '.bodymod', + 1 + ), + ( + 23009, + 23001, + '1940 Ford Deluxe Coupe Boards', + '.bodymod', + 1 + ), + ( + 23010, + 23001, + '1941 Plymouth Coupe Boards', + '.bodymod', + 1 + ), + ( + 23011, + 23001, + '1947 Cadillac Sedanette Boards', + '.bodymod', + 1 + ), + ( + 23012, + 23001, + '1948 Ford Woody Boards', + '.bodymod', + 1 + ), + ( + 25001, + 340333, + 'Sipper Air Scoop 1%', + 'scooprec', + 1 + ), + ( + 25002, + 340333, + 'Slipstream Air Scoop 2%', + 'scooprec', + 2 + ), + ( + 25003, + 340333, + 'Impeller Air Scoop 3%', + 'scooptri', + 3 + ), + ( + 25004, + 340333, + 'Holley Forced Air Scoop 4%', + 'scooptri', + 3 + ), + ( + 25005, + 340333, + 'Holley Ram Air Scoop 5%', + 'scooprec', + 4 + ), + ( + 25006, + 340333, + 'Pontiac Ram Air Induction System', + 'SCOOPREC', + 2 + ), + ( + 25007, + 340333, + 'Olds W30 Forced Air Induction System', + 'SCOOPREC', + 2 + ), + ( + 25008, + 340333, + 'Flared Velocity Stack', + 'STACK1F', + 2 + ), + ( + 25009, + 340333, + 'Tall Flared Velocity Stack', + 'STACK1FH', + 2 + ), + ( + 25010, + 340333, + 'Straight Velocity Stack', + 'STACK1S', + 2 + ), + ( + 25011, + 340333, + 'Dual Flared Velocity Stacks', + 'STACK2F', + 2 + ), + ( + 25012, + 340333, + 'Dual Tall Flared Velocity Stacks', + 'STACK2FH', + 2 + ), + ( + 25013, + 340333, + 'Dual Straight Velocity Stacks', + 'STACK2S', + 2 + ), + ( + 25014, + 340333, + 'Triple Flared Velocity Stacks', + 'stack3f', + 2 + ), + ( + 25015, + 340333, + 'Triple Tall Flared Velocity Stacks', + 'stack3fh', + 2 + ), + ( + 25016, + 340333, + 'Triple Straight Velocity Stacks', + 'stack3s', + 2 + ), + ( + 25017, + 340333, + 'Quad Flared Velocity Stacks', + 'STACK4F', + 2 + ), + ( + 25018, + 340333, + 'Quad Tall Flared Velocity Stacks', + 'STACK4FH', + 2 + ), + ( + 25019, + 340333, + 'Quad Straight Velocity Stacks', + 'STACK4S', + 2 + ), + ( + 25020, + 340333, + 'Eight Flared Velocity Stacks', + 'STACK8F', + 2 + ), + ( + 25021, + 340333, + 'Eight Tall Flared Velocity Stacks', + 'STACK8FH', + 2 + ), + ( + 25022, + 340333, + 'Eight Straight Velocity Stacks', + 'STACK8S', + 2 + ), + (26001, 26001, 'White Fog Lights', 'FOGWHITE', 1), + (27001, 26001, 'Amber Fog Lights', 'FOGAMBER', 1), + ( + 28001, + 28001, + '1940 Ford Spot Light', + 'SPOTLITE', + 1 + ), + ( + 28002, + 28001, + '1947 Cadillac Spot Light', + 'SPOTLITE', + 1 + ), + ( + 28003, + 28001, + '1955 Buick Spot Light', + 'SPOTLITE', + 1 + ), + ( + 28004, + 28001, + '1957 Chevy Bel-Air Spot Light', + 'SPOTLITE', + 1 + ), + ( + 28005, + 28001, + '1957 Chevy Wagon Spot Light', + 'SPOTLITE', + 1 + ), + (29001, 29001, '25 kg Spoiler', '.bodymod', 1), + (29002, 29001, '50 kg Spoiler', '.bodymod', 1), + (29003, 29001, '75 kg Spoiler', '.bodymod', 1), + (29004, 29001, '100 kg Spoiler', '.bodymod', 2), + (29005, 29001, '125 kg Spoiler', '.bodymod', 2), + (29006, 29001, '150 kg Spoiler', '.bodymod', 2), + (29007, 29001, '175 kg Spoiler', '.bodymod', 3), + (29008, 29001, '200 kg Spoiler', '.bodymod', 3), + (29009, 29001, '225 kg Spoiler', '.bodymod', 3), + (29010, 29001, '250 kg Spoiler', '.bodymod', 4), + (30001, 30001, '25 kg Rear Spoiler', 'SPOILER', 1), + (30002, 30001, '50 kg Rear Spoiler', 'SPOILER', 1), + (30003, 30001, '75 kg Rear Spoiler', 'SPOILER', 1), + (30004, 30001, '100 kg Rear Spoiler', 'SPOILER', 2), + (30005, 30001, '125 kg Rear Spoiler', 'SPOILER', 2), + (30006, 30001, '150 kg Rear Spoiler', 'SPOILER', 2), + (30007, 30001, '175 kg Rear Spoiler', 'SPOILER', 3), + (30008, 30001, '200 kg Rear Spoiler', 'SPOILER', 3), + (30009, 30001, '225 kg Rear Spoiler', 'SPOILER', 3), + (30010, 30001, '250 kg Rear Spoiler', 'SPOILER', 4), + (31166, 31001, 'Hardtop', NULL, 1), + (31167, 31001, 'Chopped Top', '.chopped', 1), + (31168, 31001, 'Convertible Top', '.convert', 1), + (31169, 31001, 'Vinyl Top', '.vinyl', 1), + ( + 32001, + 32001, + 'Wheelie Bar Attachment', + 'WHEELIE', + 1 + ), + (33001, 33001, 'Speedline Driver', 'DRIVER10', 1), + (34001, 34001, '32 Ford Fenders', '.bodymod', 0), + (35001, 35001, '32 Ford Bumpers', '.bodymod', 0), + (35002, 35001, '40 Ford Bumpers', '.bodymod', 0), + ( + 35003, + 35001, + '65 Shelby Cobra Bumpers', + '.bodymod', + 0 + ), + (36002, 36001, 'Engine Assembly', NULL, 1), + (36003, 36001, 'Buick 322 4V (255 hp)', NULL, 1), + (36004, 36001, 'Chevy SB 265 2V (162 hp)', NULL, 1), + (36005, 36001, 'Chevy SB 265 4V (180 hp)', NULL, 1), + (36006, 36001, 'Chevy SB 265 4V (195 hp)', NULL, 1), + (36007, 36001, 'Chevy SB 283 2V (185 hp)', NULL, 1), + (36008, 36001, 'Chevy SB 283 4V (220 hp)', NULL, 1), + ( + 36009, + 36001, + 'Chevy SB 283 2x4V (245 hp)', + NULL, + 1 + ), + ( + 36010, + 36001, + 'Chevy SB 283 2x4V (270 hp)', + NULL, + 1 + ), + (36011, 36001, 'Chevy SB 283 FI (283 hp)', NULL, 2), + (36012, 36001, 'Chevy SB 283 FI (290 hp)', NULL, 2), + (36013, 36001, 'Chevy SB 283 FI (275 hp)', NULL, 2), + (36014, 36001, 'Chevy SB 283 FI (315 hp)', NULL, 2), + ( + 36015, + 36001, + 'Chevy SB 265 2x4V (225 hp)', + NULL, + 1 + ), + (36016, 36001, 'Chevy SB 327 4V (250 hp)', NULL, 1), + (36017, 36001, 'Chevy SB 327 4V (300 hp)', NULL, 1), + (36018, 36001, 'Chevy SB 327 4V (340 hp)', NULL, 2), + (36019, 36001, 'Chevy SB 327 FI (360 hp)', NULL, 2), + (36020, 36001, 'Chevy SB 327 4V (365 hp)', NULL, 2), + (36021, 36001, 'Chevy SB 327 FI (375 hp)', NULL, 2), + (36022, 36001, 'Chevy SB 302 4V (290 hp)', NULL, 2), + (36023, 36001, 'Chevy SB 350 4V (295 hp)', NULL, 1), + (36024, 36001, 'Chevy SB 350 4V (250 hp)', NULL, 1), + (36025, 36001, 'Chevy SB 350 4V (350 hp)', NULL, 2), + ( + 36026, + 36001, + 'Chevy SB 350 4V (360 hp) Z/28', + NULL, + 2 + ), + ( + 36027, + 36001, + 'Chevy SB 350 4V (370 hp) LT-1', + NULL, + 2 + ), + (36028, 36001, 'Chevy SB 400 4V (265 hp)', NULL, 1), + (36029, 36001, 'Chevy W 348 4V (250 hp)', NULL, 1), + ( + 36030, + 36001, + 'Chevy W 348 3x2V (280 hp)', + NULL, + 1 + ), + (36031, 36001, 'Chevy W 348 4V (305 hp)', NULL, 2), + (36032, 36001, 'Chevy W 348 4V (315 hp)', NULL, 2), + ( + 36033, + 36001, + 'Chevy W 348 3x2V (315 hp)', + NULL, + 2 + ), + (36034, 36001, 'Chevy W 348 4V (320 hp)', NULL, 2), + ( + 36035, + 36001, + 'Chevy W 348 3x2V (335 hp)', + NULL, + 2 + ), + (36036, 36001, 'Chevy W 348 4V (340 hp)', NULL, 2), + ( + 36037, + 36001, + 'Chevy W 348 3x2V (350 hp)', + NULL, + 2 + ), + (36038, 36001, 'Chevy W 409 4V (360 hp)', NULL, 2), + (36039, 36001, 'Chevy W 409 4V (380 hp)', NULL, 2), + ( + 36040, + 36001, + 'Chevy W 409 2x4V (409 hp)', + NULL, + 2 + ), + (36041, 36001, 'Chevy W 409 4V (340 hp)', NULL, 2), + (36042, 36001, 'Chevy W 409 4V (400 hp)', NULL, 2), + ( + 36043, + 36001, + 'Chevy W 409 2x4V (425 hp)', + NULL, + 2 + ), + ( + 36044, + 36001, + 'Chevy W 427 2x4V (430 hp) Z11', + NULL, + 2 + ), + (36045, 36001, 'Chevy BB 396 4V (325 hp)', NULL, 1), + (36046, 36001, 'Chevy BB 396 4V (350 hp)', NULL, 2), + (36047, 36001, 'Chevy BB 396 4V (425 hp)', NULL, 2), + (36048, 36001, 'Chevy BB 396 4V (360 hp)', NULL, 1), + (36049, 36001, 'Chevy BB 427 4V (390 hp)', NULL, 1), + (36050, 36001, 'Chevy BB 427 4V (425 hp)', NULL, 2), + ( + 36051, + 36001, + 'Chevy BB 427 3x2V (400 hp)', + NULL, + 2 + ), + ( + 36052, + 36001, + 'Chevy BB 427 4V (430 hp) L88', + NULL, + 3 + ), + ( + 36053, + 36001, + 'Chevy BB 427 3x2V (435 hp) L89', + NULL, + 3 + ), + ( + 36054, + 36001, + 'Chevy BB 427 3x2V (435 hp) L71', + NULL, + 3 + ), + (36055, 36001, 'Chevy BB 402 4V (325 hp)', NULL, 1), + ( + 36056, + 36001, + 'Chevy BB 454 4V (345 hp) LS4', + NULL, + 1 + ), + ( + 36057, + 36001, + 'Chevy BB 454 4V (360 hp) LS5', + NULL, + 1 + ), + ( + 36058, + 36001, + 'Chevy BB 454 4V (390 hp) LS5', + NULL, + 2 + ), + ( + 36059, + 36001, + 'Chevy BB 454 4V (450 hp) LS6', + NULL, + 3 + ), + ( + 36060, + 36001, + 'Chevy BB 454 4V (465 hp) LS7', + NULL, + 3 + ), + ( + 36061, + 36001, + 'Chevy BB 454 4V (425 hp) LS6', + NULL, + 3 + ), + (36062, 36001, 'Olds 455 2V (310 hp)', NULL, 1), + (36063, 36001, 'Olds 455 4V (365 hp)', NULL, 1), + (36064, 36001, 'Olds 455 4V (375 hp)', NULL, 1), + (36065, 36001, 'Olds 455 4V (390 hp)', NULL, 2), + (36066, 36001, 'Olds 455 4V (400 hp)', NULL, 2), + (36067, 36001, 'Olds 400 4V (345 hp)', NULL, 1), + (36068, 36001, 'Olds 400 4V (350 hp)', NULL, 1), + (36069, 36001, 'Olds 400 3x2V (365 hp)', NULL, 2), + (36070, 36001, 'Olds 400 2V (300 hp)', NULL, 1), + (36071, 36001, 'Olds 400 4V W30', NULL, 2), + (36072, 36001, 'Pontiac 389 2V (215 hp)', NULL, 1), + (36073, 36001, 'Pontiac 389 2V (245 hp)', NULL, 1), + (36074, 36001, 'Pontiac 389 4V (260 hp)', NULL, 1), + (36075, 36001, 'Pontiac 389 2V (280 hp)', NULL, 1), + (36076, 36001, 'Pontiac 389 4V (303 hp)', NULL, 1), + ( + 36077, + 36001, + 'Pontiac 389 Trophy 4V (300 hp)', + NULL, + 2 + ), + ( + 36078, + 36001, + 'Pontiac 389 Trophy 3x2V (315 hp)', + NULL, + 2 + ), + ( + 36079, + 36001, + 'Pontiac 389 SD 4V (330 hp)', + NULL, + 3 + ), + ( + 36080, + 36001, + 'Pontiac 389 SD 3x2V (345 hp)', + NULL, + 3 + ), + ( + 36081, + 36001, + 'Pontiac 389 Trophy 3x2V (333 hp)', + NULL, + 2 + ), + ( + 36082, + 36001, + 'Pontiac 389 Trophy 4V (318 hp)', + NULL, + 2 + ), + ( + 36083, + 36001, + 'Pontiac 389 SD 3x2V (363 hp)', + NULL, + 2 + ), + ( + 36084, + 36001, + 'Pontiac 421 SD 2x4V (373 hp)', + NULL, + 2 + ), + (36085, 36001, 'Pontiac 421 4V (320 hp)', NULL, 1), + ( + 36086, + 36001, + 'Pontiac 421 SD 2x4V (405 hp)', + NULL, + 3 + ), + ( + 36087, + 36001, + 'Pontiac 421 HO 4V (353 hp)', + NULL, + 2 + ), + ( + 36088, + 36001, + 'Pontiac 421 HO 3x2V (370 hp)', + NULL, + 2 + ), + ( + 36089, + 36001, + 'Pontiac 421 SD 4V (390 hp)', + NULL, + 3 + ), + ( + 36090, + 36001, + 'Pontiac 421 SD 2x4V (410 hp)', + NULL, + 3 + ), + (36091, 36001, 'Pontiac 400 2V (255 hp)', NULL, 1), + (36092, 36001, 'Pontiac 400 4V (290 hp)', NULL, 1), + (36093, 36001, 'Pontiac 400 Ram Air I', NULL, 2), + (36094, 36001, 'Pontiac 400 Ram Air II', NULL, 2), + (36095, 36001, 'Pontiac 400 Ram Air IV', NULL, 2), + (36096, 36001, 'Pontiac 455 4V (360 hp)', NULL, 2), + (36097, 36001, 'Pontiac 455 4V (370 hp)', NULL, 2), + ( + 36098, + 36001, + 'Pontiac 455 HO 4V (335 hp)', + NULL, + 1 + ), + ( + 36099, + 36001, + 'Pontiac 455 SD 4V (290 hp)', + NULL, + 2 + ), + (36100, 36001, 'Ford Y 292 4V (193 hp)', NULL, 1), + (36101, 36001, 'Ford Y 292 4V (198 hp)', NULL, 1), + (36102, 36001, 'Ford Y 292 4V (212 hp)', NULL, 1), + (36103, 36001, 'Ford Y 312 4V (210 hp)', NULL, 1), + (36104, 36001, 'Ford Y 312 4V (225 hp)', NULL, 1), + (36105, 36001, 'Ford Y 312 2x4V (265 hp)', NULL, 1), + (36106, 36001, 'Ford FE 352 4V (300 hp)', NULL, 2), + ( + 36107, + 36001, + 'Ford FE 352 HP 4V (360 hp)', + NULL, + 2 + ), + (36108, 36001, 'Ford FE 352 2V (220 hp)', NULL, 1), + (36109, 36001, 'Ford FE 390 4V (300 hp)', NULL, 1), + ( + 36110, + 36001, + 'Ford FE 390 HP 4V (375 hp)', + NULL, + 2 + ), + ( + 36111, + 36001, + 'Ford FE 390 HP 3x2V (401 hp)', + NULL, + 2 + ), + ( + 36112, + 36001, + 'Ford FE 390 PI 4V (330 hp)', + NULL, + 2 + ), + ( + 36113, + 36001, + 'Ford FE 390 3x2V (340 hp)', + NULL, + 1 + ), + (36114, 36001, 'Ford FE 390 2V (250 hp)', NULL, 1), + (36115, 36001, 'Ford FE 390 2V (275 hp)', NULL, 1), + (36116, 36001, 'Ford FE 390 4V (315 hp)', NULL, 1), + ( + 36117, + 36001, + 'Ford FE 390 GT 4V (335 hp)', + NULL, + 1 + ), + (36118, 36001, 'Ford FE 406 4V (385 hp)', NULL, 2), + ( + 36119, + 36001, + 'Ford FE 406 3x2V (405 hp)', + NULL, + 2 + ), + ( + 36120, + 36001, + 'Ford FE 427 LR 4V (410 hp)', + NULL, + 2 + ), + ( + 36121, + 36001, + 'Ford FE 427 MR 4V (410 hp)', + NULL, + 2 + ), + ( + 36122, + 36001, + 'Ford FE 427 MR 2x4V (425 hp)', + NULL, + 2 + ), + ( + 36123, + 36001, + 'Ford FE 427 SOHC 4V (615 hp)', + NULL, + 3 + ), + (36124, 36001, 'Ford FE 428 4V (345 hp)', NULL, 1), + (36125, 36001, 'Ford FE 428 4V (360 hp)', NULL, 1), + ( + 36126, + 36001, + 'Ford FE 428 CJ 4V (335 hp)', + NULL, + 2 + ), + ( + 36127, + 36001, + 'Ford FE 428 SCJ 4V (335 hp)', + NULL, + 2 + ), + (36128, 36001, 'Ford SB 260 2V (164 hp)', NULL, 1), + ( + 36129, + 36001, + 'Ford SB 289 HP 4V (271 hp)', + NULL, + 1 + ), + (36130, 36001, 'Ford SB 289 4V (210 hp)', NULL, 1), + (36131, 36001, 'Ford SB 289 4V (225 hp)', NULL, 1), + (36132, 36001, 'Ford SB 302 2V (210 hp)', NULL, 1), + (36133, 36001, 'Ford SB 302 4V (230 hp)', NULL, 1), + ( + 36134, + 36001, + 'Ford SB 302 Boss 4V (290 hp)', + NULL, + 2 + ), + (36135, 36001, 'Ford SB 351W 2V (250 hp)', NULL, 1), + (36136, 36001, 'Ford SB 351W 4V (290 hp)', NULL, 1), + (36137, 36001, 'Ford SB 351W 2V (240 hp)', NULL, 1), + (36138, 36001, 'Ford 351C 2V (250 hp)', NULL, 1), + (36139, 36001, 'Ford 351C 4V (300 hp)', NULL, 1), + (36140, 36001, 'Ford 351C CJ 4V (280 hp)', NULL, 2), + ( + 36141, + 36001, + 'Ford 351C Boss 4V (330 hp)', + NULL, + 2 + ), + (36142, 36001, 'Ford 351C HO 4V (275 hp)', NULL, 2), + (36143, 36001, 'Ford 351C 2V (177 hp)', NULL, 1), + (36144, 36001, 'Ford 400C 2V (260 hp)', NULL, 1), + (36145, 36001, 'Ford 400C 2V (172 hp)', NULL, 1), + (36146, 36001, 'Ford 385 429 4V (360 hp)', NULL, 1), + (36147, 36001, 'Ford 385 429 2V (320 hp)', NULL, 1), + ( + 36148, + 36001, + 'Ford 385 429 SCJ 4V (375 hp)', + NULL, + 2 + ), + ( + 36149, + 36001, + 'Ford 385 429 CJ 4V (370 hp)', + NULL, + 2 + ), + (36150, 36001, 'Ford 385 429 4V (212 hp)', NULL, 1), + (36151, 36001, 'Ford 385 429 NASCAR', NULL, 3), + (36152, 36001, 'Ford 385 460 4V (365 hp)', NULL, 1), + (36153, 36001, 'Ford 385 460 4V (224 hp)', NULL, 1), + ( + 36154, + 36001, + 'Ford 385 460 PI 4V (274 hp)', + NULL, + 1 + ), + ( + 36155, + 36001, + 'Chrysler BB 383 2V (305 hp)', + NULL, + 1 + ), + ( + 36156, + 36001, + 'Chrysler BB 383 4V (325 hp)', + NULL, + 1 + ), + ( + 36157, + 36001, + 'Chrysler BB 383 2V (270 hp)', + NULL, + 1 + ), + ( + 36158, + 36001, + 'Chrysler BB 383 2x4V (330 hp)', + NULL, + 2 + ), + ( + 36159, + 36001, + 'Chrysler BB 400 2V (190 hp)', + NULL, + 1 + ), + ( + 36160, + 36001, + 'Chrysler BB 400 4V (255 hp)', + NULL, + 1 + ), + ( + 36161, + 36001, + 'Chrysler BB 400 4V (205 hp)', + NULL, + 1 + ), + ( + 36162, + 36001, + 'Chrysler BB 413 4V (350 hp)', + NULL, + 1 + ), + ( + 36163, + 36001, + 'Chrysler BB 413 2x4V (380 hp)', + NULL, + 1 + ), + ( + 36164, + 36001, + 'Chrysler BB 413 Long Ram 2x4V (375 hp)', + NULL, + 2 + ), + ( + 36165, + 36001, + 'Chrysler BB 413 Short Ram 2x4V (400 hp)', + NULL, + 2 + ), + ( + 36166, + 36001, + 'Chrysler BB 413 Max Wedge 2x4V (410 hp)', + NULL, + 2 + ), + ( + 36167, + 36001, + 'Chrysler BB 413 Max Wedge 2x4V (420 hp)', + NULL, + 2 + ), + ( + 36168, + 36001, + 'Chrysler BB 413 4V (365 hp)', + NULL, + 1 + ), + ( + 36169, + 36001, + 'Chrysler BB 413 2x4V (390 hp)', + NULL, + 2 + ), + ( + 36170, + 36001, + 'Chrysler BB 426 Max Wedge III 2x4V (415 hp)', + NULL, + 2 + ), + ( + 36171, + 36001, + 'Chrysler BB 426 Max Wedge III 2x4V (425 hp)', + NULL, + 2 + ), + ( + 36172, + 36001, + 'Chrysler BB 426 Max Wedge 2x4V (415 hp)', + NULL, + 2 + ), + ( + 36173, + 36001, + 'Chrysler BB 426 Max Wedge 2x4V (425 hp)', + NULL, + 3 + ), + ( + 36174, + 36001, + 'Chrysler BB 426 4V (365 hp) b', + NULL, + 1 + ), + ( + 36175, + 36001, + 'Chrysler Hemi 426 2x4V (425 hp)', + NULL, + 3 + ), + ( + 36176, + 36001, + 'Chrysler BB 440 4V (350 hp)', + NULL, + 1 + ), + ( + 36177, + 36001, + 'Chrysler BB 440 3x2V (390 hp)', + NULL, + 2 + ), + (36178, 36001, 'AMC 343 2V (235 hp)', NULL, 1), + (36179, 36001, 'AMC 390 4V (315 hp)', NULL, 1), + (36180, 36001, 'AMC 390 4V (325 hp)', NULL, 2), + ( + 36181, + 36001, + 'AMC 390 4V Rebel Machine (340 hp)', + NULL, + 2 + ), + (36182, 36001, 'Chevy SB 265 4V (205 hp)', NULL, 2), + ( + 36183, + 36001, + 'Chevy W 409 2x4V (425 hp)', + NULL, + 3 + ), + ( + 36184, + 36001, + 'Chevrolet BB 402 4V (350 hp)', + NULL, + 2 + ), + ( + 36185, + 36001, + 'Chevrolet BB 402 4V (375 hp)', + NULL, + 2 + ), + (36186, 36001, 'Pontiac 400 Ram Air III', NULL, 2), + (36187, 36001, 'Pontiac 400 Ram Air V', NULL, 3), + (36188, 36001, 'Ford FE 352 4V (235 hp)', NULL, 1), + (36189, 36001, 'Shade Tree 2V (140 hp)', NULL, 1), + (37001, 37001, 'Generic Exh Assembly', NULL, 1), + (39001, 39001, 'Cop Lights', 'siren', 1), + (40001, 40001, 'Vanilla Hood', '.bodymod', 1), + (40002, 40001, '32 Coupe', '.bodymod', 1), + (40003, 40001, '40 Coupe', '.bodymod', 1), + (40004, 40001, '49 Mercury', '.bodymod', 1), + (40005, 40001, '53 Coupe', '.bodymod', 1), + (40006, 40001, '57 Fairlane', '.bodymod', 1), + (40007, 40001, '57 Ranchero', '.bodymod', 1), + (40008, 40001, '57 Thunderbird', '.bodymod', 1), + (40009, 40001, '63 Thunderbird', '.bodymod', 1), + (40010, 40001, '64 Mustang', '.bodymod', 1), + (40011, 40001, '64 Galaxie', '.bodymod', 1), + (40012, 40001, '69 Torino', '.bodymod', 1), + (40013, 40001, '70 Mustang', '.bodymod', 1), + (40014, 40001, '47 Caddy', '.bodymod', 1), + (40015, 40001, '55 Century', '.bodymod', 1), + (40016, 40001, '57 Bel-Air', '.bodymod', 1), + (40017, 40001, '57 Nomad', '.bodymod', 1), + (40018, 40001, '57 Corvette', '.bodymod', 1), + (40019, 40001, '58 Impala', '.bodymod', 1), + (40020, 40001, '59 Eldorado', '.bodymod', 1), + (40021, 40001, '63 Corvette', '.bodymod', 1), + (40022, 40001, '64 Impala', '.bodymod', 1), + (40023, 40001, '66 GTO', '.bodymod', 1), + (40024, 40001, '67 Chevelle', '.bodymod', 1), + (40025, 40001, '67 Camaro', '.bodymod', 1), + (40026, 40001, '69 Olds 442', '.bodymod', 1), + (40027, 40001, '69 GTO', '.bodymod', 1), + (40028, 40001, '70 El Camino', '.bodymod', 1), + (40029, 40001, '70 Nova', '.bodymod', 1), + (40030, 40001, '70 Chevelle', '.bodymod', 1), + (40031, 40001, '73 Firebird', '.bodymod', 1), + (40032, 40001, '69 Charger', '.bodymod', 1), + (40033, 40001, '69 Road Runner', '.bodymod', 1), + (40034, 40001, '69 AMX', '.bodymod', 1), + (40035, 40001, '70 Cuda', '.large', 1), + (40036, 40001, '71 Duster', '.bodymod', 1), + ( + 40037, + 40001, + '1963 Ford Thunderbird Scoop', + '.factory', + 2 + ), + ( + 40038, + 40001, + '1969 Hurst/Olds 4-4-2 Scoop', + '.factory', + 2 + ), + ( + 40039, + 40001, + '1969 Ford Torino GT Scoop', + '.factory', + 2 + ), + ( + 40040, + 40001, + '1969 Ford Torino Scoop', + '.factory', + 2 + ), + ( + 40041, + 40001, + '1967 Chevy Chevelle SS-396 Scoop', + '.factory', + 2 + ), + ( + 40042, + 40001, + '1967 Camaro SS-396 Scoop', + '.bodymod', + 2 + ), + ( + 40043, + 40001, + '1957 Ford Thunderbird Scoop', + '.factory', + 2 + ), + ( + 40044, + 40001, + '1964 Pontiac GTO Scoop', + '.factory', + 2 + ), + ( + 40045, + 40001, + '1963 Corvette Stingray Scoop', + '.factory', + 2 + ), + ( + 40046, + 40001, + '1969 Oldsmobile 4-4-2 W-30 Scoop', + '.factory', + 2 + ), + ( + 40047, + 40001, + '1973 Pontiac Firebird Scoop', + '.factory', + 2 + ), + ( + 40048, + 40001, + '1966 Pontiac GTO Scoop', + '.factory', + 2 + ), + ( + 40049, + 40001, + '1969 Pontiac GTO Scoop', + '.factory', + 2 + ), + ( + 40050, + 40001, + '1969 Pontiac Firebird Scoop', + '.factory', + 2 + ), + ( + 40051, + 40001, + '1969 Plymouth Road Runner Scoop', + '.factory', + 2 + ), + ( + 40052, + 40001, + '1970 Buick Gran Sport Scoop', + '.factory', + 2 + ), + ( + 40053, + 40001, + '1970 Chevy Nova SS-396 Scoop', + '.factory', + 2 + ), + ( + 40054, + 40001, + '1970 Plymouth ''Cuda Scoop', + '.bodymod', + 2 + ), + ( + 40055, + 40001, + '1973 Pontiac Trans-Am Scoop', + '.factory', + 2 + ), + ( + 40056, + 40001, + '1970 Dodge Challenger R/T Scoop', + '.factory', + 2 + ), + ( + 40057, + 40001, + '1958 Chevy Impala Sport Scoop', + '.factory', + 2 + ), + ( + 40058, + 40001, + '1970 Plymouth ''Cuda Hemi Scoop', + '.factory', + 2 + ), + (40059, 40001, 'Hood Mod Bel-Air', '.large', 2), + ( + 40060, + 40001, + '66 Shelby Cobra Hood', + '.bodymod', + 1 + ), + ( + 40061, + 40001, + '1970 Chevy Chevelle SS Hood', + '.factory', + 1 + ), + ( + 40062, + 40001, + '1970 Ford Mustang Factory Scoop Hood', + '.factory', + 2 + ), + ( + 100001, + 100001, + 'Cast Iron Rim (Round Flat)', + 'RIM01', + 1 + ), + ( + 100002, + 100001, + 'Steel Rim (Web Polished)', + 'RIM11', + 1 + ), + ( + 100003, + 100001, + 'Steel Slotted Rim (Star Polished)', + 'RIM02', + 1 + ), + ( + 100004, + 100001, + 'Aluminum Alloy Rim (Twist Split Star)', + 'RIM05', + 2 + ), + ( + 100005, + 100001, + 'Magnesium Rim (Round Flat)', + 'RIM01', + 3 + ), + (100006, 100001, 'HS-00', 'HC00', 1), + (100007, 100001, 'HS-01', 'HC01', 1), + (100008, 100001, 'HS-02', 'HC02', 1), + (100009, 100001, 'HS-03', 'HC03', 1), + (100010, 100001, 'HS-04', 'HC04', 1), + (100011, 100001, 'HS-05', 'HC05', 1), + (100012, 100001, 'HS-06', 'HC06', 1), + (100013, 100001, 'HS-07', 'HC07', 1), + (100014, 100001, 'HS-08', 'HC08', 1), + (100015, 100001, 'HS-09', 'HC09', 1), + (100016, 100001, 'HS-10', 'HC10', 1), + (100017, 100001, 'HS-11', 'HC11', 1), + (100018, 100001, 'HS-12', 'HC12', 1), + (100019, 100001, 'HS-13', 'HC13', 1), + (100020, 100001, 'HS-14', 'HC14', 1), + (100021, 100001, 'HS-15', 'HC15', 1), + (100022, 100001, 'HS-16', 'HC16', 1), + (100023, 100001, 'HS-17', 'HC17', 1), + (100024, 100001, 'HS-18', 'HC18', 1), + (100025, 100001, 'HS-19', 'HC19', 1), + (100026, 100001, 'HS-20', 'HC20', 1), + (100027, 100001, 'HS-21', 'HC21', 1), + (100028, 100001, 'HS-22', 'HC22', 1), + (100029, 100001, 'HS-23', 'HC23', 1), + (100030, 100001, 'HS-24', 'HC24', 1), + (100031, 100001, 'HS-25', 'HC25', 1), + (100032, 100001, 'HS-26', 'HC26', 1), + (100033, 100001, 'HS-27', 'HC27', 1), + (100034, 100001, 'HS-28', 'HC28', 1), + (100035, 100001, 'HS-29', 'HC29', 1), + (100036, 100001, 'HS-30', 'HC30', 1), + (100037, 100001, 'HS-31', 'HC31', 1), + (100038, 100001, 'HS-32', 'HC32', 1), + (100039, 100001, 'HS-33', 'HC33', 1), + (100040, 100001, 'HS-34', 'HC34', 1), + (100041, 100001, 'HS-35', 'HC35', 1), + (100042, 100001, 'HS-36', 'HC36', 1), + (100043, 100001, 'HS-37', 'HC37', 1), + (100044, 100001, 'HS-38', 'HC38', 1), + (100045, 100001, 'HS-39', 'HC39', 1), + (100046, 100001, 'HS-40', 'HC40', 1), + (100047, 100001, 'HS-41', 'HC41', 1), + (100048, 100001, 'HS-42', 'HC42', 1), + (100049, 100001, 'HS-43', 'HC43', 1), + (100050, 100001, 'HS-44', 'HC44', 1), + (100051, 100001, 'HS-45', 'HC45', 1), + (100052, 100001, 'HS-46', 'HC46', 1), + (100053, 100001, 'HS-47', 'HC47', 1), + (100054, 100001, 'HS-48', 'HC48', 1), + (100055, 100001, 'HS-49', 'HC49', 1), + (100056, 100001, 'HS-50', 'HC50', 1), + (100057, 100001, 'HS-51', 'HC51', 1), + (100058, 100001, 'HS-52', 'HC52', 1), + (100059, 100001, 'HS-53', 'hc53', 1), + (100060, 100001, 'HS-54', 'hc54', 1), + (100061, 100001, 'HS-55', 'hc55', 1), + (100062, 100001, 'HS-56', 'hc56', 1), + (100063, 100001, 'HS-57', 'hc57', 1), + (100064, 100001, 'HS-58', 'hc58', 1), + (100065, 100001, 'HA-00', 'HCA00', 1), + (100066, 100001, 'HA-01', 'HCA01', 1), + (100067, 100001, 'HA-02', 'HCA02', 1), + (100068, 100001, 'HA-03', 'HCA03', 1), + (100069, 100001, 'HA-04', 'HCA04', 1), + (100070, 100001, 'HA-05', 'HCA05', 1), + (100071, 100001, 'HA-06', 'HCA06', 1), + (100072, 100001, 'HA-07', 'HCA07', 1), + (100073, 100001, 'HA-08', 'HCA08', 1), + (100074, 100001, 'HA-09', 'HCA09', 1), + (100075, 100001, 'HA-10', 'HCA10', 1), + (100076, 100001, 'HA-11', 'HCA11', 1), + (100077, 100001, 'HA-12', 'HCA12', 1), + (100078, 100001, 'HA-13', 'HCA13', 1), + (100079, 100001, 'HA-14', 'HCA14', 1), + (100080, 100001, 'HA-15', 'HCA15', 1), + (100081, 100001, 'HA-16', 'HCA16', 1), + (100082, 100001, 'HA-17', 'HCA17', 1), + (100083, 100001, 'HA-18', 'HCA18', 1), + (100084, 100001, 'HA-19', 'HCA19', 1), + (100085, 100001, 'HA-20', 'HCA20', 1), + (100086, 100001, 'HA-21', 'HCA21', 1), + (100087, 100001, 'HA-22', 'HCA22', 1), + (100088, 100001, 'HA-23', 'HCA23', 1), + (100089, 100001, 'HA-24', 'HCA24', 1), + (100090, 100001, 'HA-25', 'HCA25', 1), + (100091, 100001, 'HA-26', 'HCA26', 1), + (100092, 100001, 'HA-27', 'HCA27', 1), + (100093, 100001, 'RS-00', 'RIM00', 1), + (100094, 100001, 'RS-01', 'RIM01', 1), + (100095, 100001, 'RS-02', 'RIM02', 1), + (100096, 100001, 'RS-03', 'RIM03', 1), + (100097, 100001, 'RS-04', 'RIM04', 1), + (100098, 100001, 'RS-05', 'RIM05', 1), + (100099, 100001, 'RS-06', 'RIM06', 1), + (100100, 100001, 'RS-07', 'RIM07', 1), + (100101, 100001, 'RS-08', 'RIM08', 1), + (100102, 100001, 'RS-09', 'RIM09', 1), + (100103, 100001, 'RS-10', 'RIM10', 1), + (100104, 100001, 'RS-11', 'RIM11', 1), + (100105, 100001, 'RS-12', 'RIM12', 1), + (100106, 100001, 'RA-00', 'RIMA00', 1), + (100107, 100001, 'RA-01', 'RIMA01', 1), + (100108, 100001, 'RA-02', 'RIMA02', 1), + (100109, 100001, 'RA-03', 'RIMA03', 1), + (100110, 100001, 'RA-04', 'RIMA04', 1), + (100111, 100001, 'RA-05', 'RIMA05', 1), + (100112, 100001, 'RA-06', 'RIMA06', 1), + (100113, 100001, 'RA-07', 'RIMA07', 1), + (100114, 100001, 'RA-08', 'RIMA08', 1), + (100115, 100001, 'RA-09', 'RIMA09', 1), + (100116, 100001, 'RA-10', 'RIMA10', 1), + (100117, 100001, 'RA-11', 'RIMA11', 1), + (100118, 100001, 'RA-12', 'RIMA12', 1), + (100119, 100001, 'RA-13', 'RIMA13', 1), + (100120, 100001, 'RA-14', 'RIMA14', 1), + (100121, 100001, 'RA-15', 'RIMA15', 1), + (100122, 100001, 'RA-16', 'RIMA16', 1), + (100123, 100001, 'RA-17', 'RIMA17', 1), + (100124, 100001, 'RA-18', 'RIMA18', 1), + (100125, 100001, 'RA-19', 'RIMA19', 1), + (100126, 100001, 'RA-20', 'RIMA20', 1), + (100127, 100001, 'RA-21', 'RIMA21', 1), + (100128, 100001, 'RA-22', 'RIMA22', 1), + (100129, 100001, 'RA-23', 'RIMA23', 1), + (100130, 100001, 'RA-24', 'RIMA24', 1), + (100131, 100001, 'RA-25', 'RIMA25', 1), + (100132, 100001, 'RA-26', 'RIMA26', 1), + (100133, 100001, 'RA-27', 'RIMA27', 1), + (100134, 100001, 'RA-28', 'RIMA28', 1), + (100135, 100001, 'RA-29', 'RIMA29', 1), + ( + 100136, + 100001, + '22.5" Heavy Truck Rim', + 'RIM01', + 1 + ), + (100137, 100001, 'Aluminum Slot', 'RIMA00', 2), + (100138, 100001, 'Aluminum Round', 'RIMA01', 1), + (100139, 100001, 'Aluminum Twistar 5', 'HCA03', 2), + (100140, 100001, 'Aluminum Rippled Orb', 'HC14', 2), + ( + 100141, + 100001, + 'Aluminum Hypnotic Star 6', + 'HC13', + 2 + ), + ( + 100142, + 100001, + 'Aluminum Super Slot 15', + 'HCA03', + 2 + ), + ( + 100143, + 100001, + 'Aluminum Teardrop Slot 8', + 'HCA04', + 2 + ), + (100144, 100001, 'Aluminum Twistar 7', 'HCA05', 2), + ( + 100145, + 100001, + 'Aluminum Power Turbine', + 'HCA15', + 2 + ), + ( + 110001, + 110001, + '18 x 5.25 Bias Ply Blackwalls (2ply)', + 'TIREBLAC', + 1 + ), + ( + 110002, + 110001, + '150/82/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110003, + 110001, + '170/82/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110004, + 110001, + '178/82/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110005, + 110001, + '190/82/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110006, + 110001, + '210/82/14 Bias Ply', + 'TIREBLAC', + 2 + ), + ( + 110007, + 110001, + '150/92/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110008, + 110001, + '170/92/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110009, + 110001, + '178/92/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110010, + 110001, + '190/92/14 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110011, + 110001, + '210/92/14 Bias Ply', + 'TIREBLAC', + 2 + ), + ( + 110012, + 110001, + '170/82/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110013, + 110001, + '190/82/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110014, + 110001, + '210/82/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110015, + 110001, + '150/92/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110016, + 110001, + '170/92/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110017, + 110001, + '190/92/15 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110018, + 110001, + '150/92/16 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110019, + 110001, + '170/92/16 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110020, + 110001, + '190/92/16 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110021, + 110001, + '210/92/16 Bias Ply', + 'TIREBLAC', + 1 + ), + ( + 110022, + 110001, + '190/60/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110023, + 110001, + '214/60/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110024, + 110001, + '238/60/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110025, + 110001, + '190/72/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110026, + 110001, + '202/72/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110027, + 110001, + '214/72/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110028, + 110001, + '226/72/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110029, + 110001, + '238/72/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110030, + 110001, + '166/82/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110031, + 110001, + '178/82/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110032, + 110001, + '190/82/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110033, + 110001, + '202/82/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110034, + 110001, + '214/82/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110035, + 110001, + '178/92/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110036, + 110001, + '202/92/14 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110037, + 110001, + '178/60/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110038, + 110001, + '202/60/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110039, + 110001, + '226/60/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110040, + 110001, + '238/60/15 Bias Belted', + 'TIREBLAC', + 2 + ), + ( + 110041, + 110001, + '202/72/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110042, + 110001, + '226/72/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110043, + 110001, + '238/72/15 Bias Belted', + 'TIREBLAC', + 2 + ), + ( + 110044, + 110001, + '190/82/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110045, + 110001, + '214/82/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110046, + 110001, + '238/82/15 Bias Belted', + 'TIREBLAC', + 2 + ), + ( + 110047, + 110001, + '178/92/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110048, + 110001, + '202/92/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110049, + 110001, + '226/92/15 Bias Belted', + 'TIREBLAC', + 1 + ), + ( + 110050, + 110001, + '238/92/15 Bias Belted', + 'TIREBLAC', + 2 + ), + (110051, 110001, '185/65/14 Radial', 'TIREBLAC', 1), + (110052, 110001, '205/65/14 Radial', 'TIREBLAC', 1), + (110053, 110001, '195/70/14 Radial', 'TIREBLAC', 1), + (110054, 110001, '215/70/14 Radial', 'TIREBLAC', 1), + (110055, 110001, '195/75/14 Radial', 'TIREBLAC', 1), + (110056, 110001, '205/75/14 Radial', 'TIREBLAC', 1), + (110057, 110001, '195/65/15 Radial', 'TIREBLAC', 1), + (110058, 110001, '215/65/15 Radial', 'TIREBLAC', 2), + (110059, 110001, '205/70/15 Radial', 'TIREBLAC', 1), + (110060, 110001, '215/70/15 Radial', 'TIREBLAC', 1), + (110061, 110001, '225/70/15 Radial', 'TIREBLAC', 2), + (110062, 110001, '205/75/15 Radial', 'TIREBLAC', 1), + (110063, 110001, '215/75/15 Radial', 'TIREBLAC', 1), + (110064, 110001, '235/75/15 Radial', 'TIREBLAC', 2), + (110065, 110001, '215/65/16 Radial', 'TIREBLAC', 1), + (110066, 110001, '215/60/16 Radial', 'TIREBLAC', 1), + (110067, 110001, '225/60/16 Radial', 'TIREBLAC', 1), + (110068, 110001, '225/55/16 Radial', 'TIREBLAC', 1), + ( + 110069, + 110001, + '205/55/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110070, + 110001, + '195/60/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110071, + 110001, + '205/60/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110072, + 110001, + '215/60/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110073, + 110001, + '185/65/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110074, + 110001, + '195/65/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110075, + 110001, + '205/65/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110076, + 110001, + '215/65/15 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110077, + 110001, + '225/55/16 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110078, + 110001, + '215/60/16 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110079, + 110001, + '225/60/16 Radial Rain', + 'TIREBLAC', + 2 + ), + ( + 110080, + 110001, + '195/55/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110081, + 110001, + '205/55/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110082, + 110001, + '195/60/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110083, + 110001, + '205/60/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110084, + 110001, + '215/60/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110085, + 110001, + '185/65/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110086, + 110001, + '195/65/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110087, + 110001, + '205/65/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110088, + 110001, + '215/65/15VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110089, + 110001, + '205/40/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110090, + 110001, + '215/40/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110091, + 110001, + '205/45/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110092, + 110001, + '215/45/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110093, + 110001, + '205/50/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110094, + 110001, + '225/50/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110095, + 110001, + '245/50/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110096, + 110001, + '205/55/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110097, + 110001, + '215/55/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110098, + 110001, + '225/55/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110099, + 110001, + '215/60/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110100, + 110001, + '225/60/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110101, + 110001, + '235/60/16VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110102, + 110001, + '215/40/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110103, + 110001, + '235/40/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110104, + 110001, + '255/40/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110105, + 110001, + '215/45/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110106, + 110001, + '225/45/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110107, + 110001, + '235/45/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110108, + 110001, + '245/45/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110109, + 110001, + '315/35/17VR Performance', + 'TIREBLAC', + 3 + ), + ( + 110110, + 110001, + '195/55/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110111, + 110001, + '205/55/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110112, + 110001, + '195/60/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110113, + 110001, + '205/60/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110114, + 110001, + '215/60/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110115, + 110001, + '185/65/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110116, + 110001, + '195/65/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110117, + 110001, + '205/65/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110118, + 110001, + '215/65/15VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110119, + 110001, + '205/40/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110120, + 110001, + '205/45/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110121, + 110001, + '215/45/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110122, + 110001, + '205/50/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110123, + 110001, + '225/50/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110124, + 110001, + '245/50/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110125, + 110001, + '205/55/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110126, + 110001, + '225/55/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110127, + 110001, + '215/60/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110128, + 110001, + '225/60/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110129, + 110001, + '235/60/16VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110130, + 110001, + '215/40/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110131, + 110001, + '235/40/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110132, + 110001, + '215/45/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110133, + 110001, + '225/45/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110134, + 110001, + '235/45/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110135, + 110001, + '245/45/17VR Performance Rain', + 'TIREBLAC', + 3 + ), + ( + 110136, + 110001, + '162/68/18 Bias Belted', + 'TIREBLAC', + 1 + ), + (110137, 110001, 'Big Tire', 'TIREBLAC', 1), + ( + 110138, + 110001, + '245/50/16VR High Performance', + 'TIREBLAC', + 4 + ), + (110139, 110001, '195/60/15 Street', 'TIREBLAC', 2), + ( + 110140, + 110001, + '295/80/22.5 Bus Tire', + 'TIREBLAC', + 1 + ), + ( + 110141, + 110001, + '207/70/14 (D70-14)', + 'TIREWHIT', + 1 + ), + ( + 110142, + 110001, + '212/70/14 (E70-14)', + 'TIREWHIT', + 1 + ), + ( + 110143, + 110001, + '221/70/14 (F70-14)', + 'TIREWHIT', + 1 + ), + ( + 110144, + 110001, + '232/70/14 (G70-14)', + 'TIREWHIT', + 1 + ), + ( + 110145, + 110001, + '210/70/15 (E70-15)', + 'TIREWHIT', + 1 + ), + ( + 110146, + 110001, + '216/70/15 (F70-15)', + 'TIREWHIT', + 1 + ), + ( + 110147, + 110001, + '227/70/15 (G70-15)', + 'TIREWHIT', + 1 + ), + ( + 110148, + 110001, + '231/60/15 (F60-15)', + 'TIREWHIT', + 1 + ), + ( + 110149, + 110001, + '243/60/15 (G60-15)', + 'TIREWHIT', + 1 + ), + ( + 110150, + 110001, + '224/60/15 (E60-15)', + 'TIREWHIT', + 1 + ), + (110151, 110001, '175/65/14 Radial', 'TIREBLAC', 1), + (110152, 110001, '195/65/14 Radial', 'TIREBLAC', 1), + (110153, 110001, '185/60/14 Radial', 'TIREBLAC', 1), + (110154, 110001, '195/60/14 Radial', 'TIREBLAC', 1), + (110155, 110001, '185/65/15 Radial', 'TIREBLAC', 1), + (110156, 110001, '205/65/15 Radial', 'TIREBLAC', 1), + (110157, 110001, '195/60/15 Radial', 'TIRERED', 1), + (110158, 110001, '205/60/15 Radial', 'TIRERED', 1), + (110159, 110001, '215/60/15 Radial', 'TIRERED', 1), + (110160, 110001, '195/55/15 Radial', 'TIRERED', 1), + (110161, 110001, '205/55/15 Radial', 'TIRERED', 1), + (110162, 110001, '195/50/15 Radial', 'TIRERED', 1), + (110163, 110001, '205/50/15 Radial', 'TIRERED', 1), + (110164, 110001, '225/50/15 Radial', 'TIRERED', 1), + ( + 110165, + 110001, + '195/50/15VR Performance', + 'TIREBLAC', + 2 + ), + ( + 110166, + 110001, + '205/50/15VR Performance', + 'TIREBLAC', + 2 + ), + ( + 110167, + 110001, + '225/50/15VR Performance', + 'TIREBLAC', + 2 + ), + ( + 110168, + 110001, + '205/40/17VR Performance', + 'TIREBLAC', + 2 + ), + ( + 110169, + 110001, + '245/45/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110170, + 110001, + '225/60/16VR High Performance', + 'TIREBLAC', + 4 + ), + (110171, 110001, '225/60/16ZR SCUT', 'TIREBLAC', 4), + (110172, 110001, '245/45/17ZR SCUT', 'TIREBLAC', 4), + (110173, 110001, '245/50/16ZR SCUT', 'TIREBLAC', 4), + ( + 110174, + 110001, + '225/35/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110175, + 110001, + '205/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110176, + 110001, + '215/40/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110177, + 110001, + '215/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110178, + 110001, + '225/40/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110179, + 110001, + '235/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110180, + 110001, + '245/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110181, + 110001, + '255/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110182, + 110001, + '265/40/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110183, + 110001, + '205/45/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110184, + 110001, + '215/45/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110185, + 110001, + '215/45/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110186, + 110001, + '225/45/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110187, + 110001, + '225/45/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110188, + 110001, + '235/45/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110189, + 110001, + '245/45/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110190, + 110001, + '205/50/15VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110191, + 110001, + '205/50/16VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110192, + 110001, + '205/50/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110193, + 110001, + '215/50/15VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110194, + 110001, + '215/50/17VR High Performance', + 'TIREBLAC', + 4 + ), + ( + 110195, + 110001, + '225/50/16VR High Performance', + 'TIREBLAC', + 4 + ), + (110196, 110001, '235/60/15 Radial', 'TIREBLAC', 1), + (110197, 110001, '275/60/15 Radial', 'TIREBLAC', 2), + (110198, 110001, '295/60/15 Radial', 'TIREBLAC', 3), + (110199, 110001, '245/60/15 Radial', 'TIREBLAC', 2), + (110200, 110001, '255/60/15 Radial', 'TIREBLAC', 2), + (110201, 110001, '265/60/15 Radial', 'TIREBLAC', 2), + ( + 130001, + 130001, + '3-Speed Auto (2.5/1.56/1)', + NULL, + 1 + ), + ( + 130002, + 130001, + '3-Speed Auto (2.4/1.479/1)', + NULL, + 1 + ), + ( + 130003, + 130001, + '4-Speed Auto (2.741/1.568/1/0.674)', + NULL, + 1 + ), + ( + 130004, + 130001, + '3-Speed Auto (2.52/1.52/1) A', + NULL, + 1 + ), + ( + 130005, + 130001, + '3-Speed Auto (2.482/1.482/1)', + NULL, + 1 + ), + ( + 130006, + 130001, + '4-Speed Auto (3.059/1.625/1/0.696) A', + NULL, + 1 + ), + ( + 130007, + 130001, + '4-Speed Auto (2.4/1.479/1/0.723)', + NULL, + 1 + ), + ( + 130008, + 130001, + '4-Speed Auto (2.482/1.482/1/0.75)', + NULL, + 1 + ), + ( + 130009, + 130001, + '4-Speed Auto (2.74/1.57/1/0.67)', + NULL, + 1 + ), + ( + 130010, + 130001, + '4-Speed Auto (3.06/1.62/1/0.7)', + NULL, + 1 + ), + ( + 130011, + 130001, + '4-Speed Auto (3.97/2.55/1.55/1)', + NULL, + 1 + ), + ( + 130012, + 130001, + '3-Speed Manual (2.5/1.18/1)', + NULL, + 1 + ), + ( + 130013, + 130001, + '5-Speed Manual (2.95/1.94/1.34/1/0.63)', + NULL, + 2 + ), + ( + 130014, + 130001, + '5-Speed Manual (2.75/1.94/1.34/1/0.74)', + NULL, + 2 + ), + ( + 130015, + 130001, + '4-Speed Manual (2.64/1.61/1.23/1)', + NULL, + 1 + ), + ( + 130016, + 130001, + '4-Speed Manual (2.88/1.74/1.33/1)', + NULL, + 1 + ), + ( + 130017, + 130001, + '4-Speed Manual (3.44/2.28/1.46/1)', + NULL, + 1 + ), + ( + 130018, + 130001, + '4-Speed Manual (2.66/1.91/1.39/1)', + NULL, + 1 + ), + ( + 130019, + 130001, + '4-Speed Manual (2.22/1.64/1.28/1)', + NULL, + 1 + ), + ( + 130020, + 130001, + '4-Speed Manual (2.65/1.93/1.39/1)', + NULL, + 1 + ), + ( + 130021, + 130001, + 'Powerglide Auto (1.82/1) Chevrolet 2-Speed Powerglide', + NULL, + 1 + ), + ( + 130022, + 130001, + 'Chevrolet 3-Speed Standard Ratio', + NULL, + 1 + ), + ( + 130023, + 130001, + '3-Speed Close Ratio (2.21/1.32/1)', + NULL, + 1 + ), + ( + 130024, + 130001, + 'Chevrolet 3-Speed w/ Overdrive', + NULL, + 1 + ), + ( + 130025, + 130001, + '4-Speed Close Ratio (2.21/1.66/1.31/1)', + NULL, + 2 + ), + ( + 130026, + 130001, + 'Ford Cruise-O-Matic (Automatic)', + NULL, + 1 + ), + ( + 130027, + 130001, + 'Muncie Close-Ratio M22 (2.2/1.64/1.27/1)', + NULL, + 2 + ), + ( + 130028, + 130001, + 'Muncie Early Wide-Ratio (Manual)', + NULL, + 1 + ), + ( + 130029, + 130001, + 'Muncie Close-Ratio (Manual)', + NULL, + 1 + ), + ( + 130030, + 130001, + 'Muncie Wide-Ratio M20 Manual (2.52/1.88/1.46/1)', + NULL, + 1 + ), + ( + 130031, + 130001, + '1997 Corvette 4-Speed Automatic Transmission', + NULL, + 3 + ), + ( + 130032, + 130001, + 'Speedliner 5-Speed Automatic Transmission', + NULL, + 3 + ), + ( + 130033, + 130001, + 'Powerglide Automatic (1.76/1)', + NULL, + 1 + ), + ( + 130034, + 130001, + 'Turbo Hydra-Matic 350 (Automatic)', + NULL, + 1 + ), + ( + 130035, + 130001, + 'Ford C-4 Dual Range (Automatic)', + NULL, + 1 + ), + ( + 130036, + 130001, + 'Borg-Warner T-10 Special Close-Ratio (Manual)', + NULL, + 3 + ), + ( + 130037, + 130001, + 'Borg-Warner T-10X Special Competition (Manual)', + NULL, + 3 + ), + ( + 130038, + 130001, + 'Borg-Warner T-10W Special Wide-Ratio (Manual)', + NULL, + 3 + ), + ( + 130039, + 130001, + 'Borg-Warner T-10Y Second Design, Extra Low-Ratio (Manual)', + NULL, + 3 + ), + ( + 130040, + 130001, + 'T+C Top Loader Close Ratio M (2.32/1.69/1.29/1)', + NULL, + 1 + ), + ( + 130041, + 130001, + 'Ford T+C Top Loader Overdrive (Manual)', + NULL, + 1 + ), + ( + 130042, + 130001, + 'Ford T+C Top Loader Overdrive2 (Manual)', + NULL, + 1 + ), + ( + 130043, + 130001, + '3-speed Synchro-Mesh (Manual)', + NULL, + 1 + ), + ( + 130044, + 130001, + '4-speed All-Synchro (Manual)', + NULL, + 1 + ), + ( + 130045, + 130001, + 'Bully 727 Torqueflite A (2.45/1.45/1)', + NULL, + 2 + ), + ( + 130046, + 130001, + 'Bully Turbo-Hydro 400 A (2.48/1.48/1)', + NULL, + 2 + ), + (130047, 130001, 'Borg T-85 3 spd manual', NULL, 2), + ( + 130048, + 130001, + 'Ford-o-matic Auto (1.76/1)', + NULL, + 1 + ), + ( + 130049, + 130001, + 'Shift Command A (2.45/1.45/1)', + NULL, + 2 + ), + ( + 130050, + 130001, + 'Borg-Warner T56 6 Speed Auto', + NULL, + 3 + ), + ( + 130051, + 130001, + 'LD 3-Speed Manual (2.5/1.18/1)', + NULL, + 1 + ), + ( + 130052, + 130001, + 'Hall Helix 3-Speed Manual', + NULL, + 4 + ), + ( + 130053, + 130001, + 'Hall Helix 3-Speed Automatic', + NULL, + 4 + ), + (130054, 130001, 'Super Muncie', NULL, 3), + ( + 130055, + 130001, + 'Muncie Close-Ratio M21 (2.2/1.64/1.27/1)', + NULL, + 1 + ), + (130056, 130001, 'M13 3 Speed Manual', NULL, 2), + ( + 130057, + 130001, + 'Buick Dynaflow Auto (2.4/1.479/1)', + NULL, + 1 + ), + ( + 140001, + 140001, + 'Rear Differential (2.73)', + NULL, + 1 + ), + ( + 140002, + 140001, + 'Rear Differential (2.93)', + NULL, + 1 + ), + ( + 140003, + 140001, + 'Rear Differential (3.00)', + NULL, + 1 + ), + ( + 140004, + 140001, + 'Rear Differential (3.23)', + NULL, + 1 + ), + ( + 140005, + 140001, + 'Rear Differential (3.31)', + NULL, + 1 + ), + ( + 140006, + 140001, + 'Rear Differential (3.42)', + NULL, + 2 + ), + ( + 140007, + 140001, + 'Rear Differential (3.50)', + NULL, + 2 + ), + ( + 140008, + 140001, + 'Rear Differential (3.54)', + NULL, + 2 + ), + ( + 140009, + 140001, + 'Rear Differential (3.55)', + NULL, + 2 + ), + ( + 140010, + 140001, + 'Rear Differential (3.64)', + NULL, + 2 + ), + ( + 140011, + 140001, + 'Rear Differential (3.70)', + NULL, + 2 + ), + ( + 140012, + 140001, + 'Rear Differential (3.77)', + NULL, + 2 + ), + ( + 140013, + 140001, + 'Rear Differential (3.90)', + NULL, + 3 + ), + ( + 140014, + 140001, + 'Rear Differential (4.10)', + NULL, + 3 + ), + ( + 140015, + 140001, + 'Rear Differential (4.33)', + NULL, + 3 + ), + ( + 140016, + 140001, + 'Ford 3.10 Differential (Ford-O-Matic)', + NULL, + 1 + ), + ( + 140017, + 140001, + 'Rear Differential (3.56)', + NULL, + 2 + ), + ( + 140018, + 140001, + 'GM Rear Differential 3.40 (Dynaflow)', + NULL, + 1 + ), + ( + 140019, + 140001, + 'Rear Differential (3.25)', + NULL, + 1 + ), + ( + 140020, + 140001, + 'Rear Differential (3.91)', + NULL, + 3 + ), + ( + 140021, + 140001, + 'GM Rear Differential (3.71)', + NULL, + 2 + ), + ( + 140022, + 140001, + 'Rear Differential (3.07) L', + NULL, + 1 + ), + ( + 140023, + 140001, + 'Rear Differential (4.10) LD', + NULL, + 1 + ), + ( + 140024, + 140001, + 'Rear Differential (3.90) LD', + NULL, + 1 + ), + ( + 140025, + 140001, + 'Rear Differential (3.31) LD', + NULL, + 1 + ), + (140026, 140001, 'Ford 9" (3.08)', NULL, 2), + (140027, 140001, 'Ford 9" (3.27)', NULL, 2), + (140028, 140001, 'Ford 9" (3.45)', NULL, 2), + (140029, 140001, 'Ford 9" (3.55)', NULL, 2), + (140030, 140001, 'Ford 9" (3.73)', NULL, 2), + (140031, 140001, 'Ford 9" (4.10)', NULL, 3), + (140032, 140001, 'Ford 8" (3.08)', NULL, 1), + (140033, 140001, 'Ford 8" (3.27)', NULL, 1), + (140034, 140001, 'Ford 8" (3.45)', NULL, 1), + (140035, 140001, 'Ford 8" (3.55)', NULL, 1), + (140036, 140001, 'Ford 8" (3.73)', NULL, 1), + (140037, 140001, 'Ford 8" (4.10)', NULL, 1), + (140038, 140001, 'GM 10-bolt (2.73)', NULL, 1), + (140039, 140001, 'GM 10-bolt (3.08)', NULL, 1), + (140040, 140001, 'GM 10-bolt (3.36)', NULL, 1), + (140041, 140001, 'GM 10-bolt (3.55)', NULL, 1), + (140042, 140001, 'GM 10-bolt (3.70)', NULL, 1), + (140043, 140001, 'GM 12-bolt (3.07)', NULL, 2), + (140044, 140001, 'GM 12-bolt (3.31)', NULL, 2), + (140045, 140001, 'GM 12-bolt (3.55)', NULL, 2), + (140046, 140001, 'GM 12-bolt (3.73)', NULL, 2), + (140047, 140001, 'GM 12-bolt (4.10)', NULL, 3), + (140048, 140001, 'GM 12-bolt (2.73)', NULL, 2), + ( + 140049, + 140001, + 'GM 12-bolt (3.55) Police', + NULL, + 3 + ), + (140050, 140001, 'Hall 14-bolt (3.42)', NULL, 3), + (140051, 140001, 'Hall 14-bolt (3.73)', NULL, 3), + (140052, 140001, 'Hall 14-bolt (4.10)', NULL, 3), + ( + 150001, + 150001, + 'Bully Torqueflite HD Transmission Cooler', + NULL, + 3 + ), + ( + 150002, + 150001, + 'Bully Turbo ND Tranmission Cooler', + NULL, + 2 + ), + ( + 150003, + 150001, + 'Bully Powerglide LD Transmission Cooler', + NULL, + 1 + ), + ( + 150004, + 150001, + 'Bully C-6 XHD Transmission Cooler', + NULL, + 4 + ), + (160001, 160001, 'Buick V8 322', 'ENGINE', 2), + (160002, 160001, 'Buick SB V8 350', 'ENGINE', 2), + (160003, 160001, 'Buick BB V8 455', 'ENGINE', 3), + (160004, 160001, 'Chevy W V8 427', 'ENGINE', 3), + (160005, 160001, 'Chevy V8 265', 'ENGINE', 1), + (160006, 160001, 'Chevy V8 283', 'ENGINE', 1), + (160007, 160001, 'Chevy V8 302', 'ENGINE', 1), + (160008, 160001, 'Chevy V8 307', 'ENGINE', 1), + (160009, 160001, 'Chevy V8 327', 'ENGINE', 2), + ( + 160010, + 160001, + 'Cadillac L-Head V8 346', + 'ENGINE', + 1 + ), + (160011, 160001, 'Chevy V8 348', 'ENGINE', 1), + (160012, 160001, 'Chevy V8 350', 'ENGINE', 2), + (160013, 160001, 'Cadillac V8 390', 'ENGINE', 2), + (160014, 160001, 'Chevy V8 396', 'ENGINE', 2), + (160015, 160001, 'Chevy V8 400', 'ENGINE', 2), + (160016, 160001, 'Chevy V8 409', 'ENGINE', 3), + (160017, 160001, 'Chevy V8 454', 'ENGINE', 3), + (160018, 160001, 'Chevy V8 502', 'ENGINE', 4), + (160019, 160001, 'Chevy V8 402', 'ENGINE', 3), + ( + 160020, + 160001, + 'Ford V8 351 Windsor', + 'ENGINE', + 2 + ), + (160021, 160001, 'Ford V8 400', 'ENGINE', 3), + ( + 160022, + 160001, + '221-V8 24-bolt (32)', + 'ENGINE', + 1 + ), + (160023, 160001, 'Ford V8 239', 'ENGINE', 1), + (160024, 160001, 'Ford V8 260', 'ENGINE', 1), + (160025, 160001, 'Ford V8 272', 'ENGINE', 1), + (160026, 160001, 'Ford V8 289', 'ENGINE', 1), + (160027, 160001, 'Ford V8 292', 'ENGINE', 1), + (160028, 160001, 'Ford V8 302', 'ENGINE', 1), + (160029, 160001, 'Ford V8 312', 'ENGINE', 1), + (160030, 160001, 'Ford V8 351', 'ENGINE', 2), + (160031, 160001, 'Ford V8 390', 'ENGINE', 2), + (160032, 160001, 'Ford V8 406', 'ENGINE', 3), + (160033, 160001, 'Ford V8 427', 'ENGINE', 3), + (160034, 160001, 'Ford V8 428', 'ENGINE', 3), + (160035, 160001, 'Ford V8 429', 'ENGINE', 3), + (160036, 160001, 'Ford V8 352', 'ENGINE', 2), + (160037, 160001, 'Oldsmobile V8 350', 'ENGINE', 2), + (160038, 160001, 'Oldsmobile V8 400', 'ENGINE', 3), + (160039, 160001, 'Oldsmobile V8 455', 'ENGINE', 3), + (160040, 160001, 'Pontiac V8 350', 'ENGINE', 2), + (160041, 160001, 'Pontiac V8 421', 'ENGINE', 3), + (160042, 160001, 'Pontiac V8 389', 'ENGINE', 2), + (160043, 160001, 'Pontiac V8 400', 'ENGINE', 3), + (160044, 160001, 'Pontiac V8 428', 'ENGINE', 3), + (160045, 160001, 'Pontiac V8 455', 'ENGINE', 3), + ( + 160046, + 160001, + 'AMC V8 290 Aluminum Indy', + 'ENGINE', + 4 + ), + (160047, 160001, 'Ford V8 460', 'ENGINE', 3), + (160048, 160001, 'Chevy V8 427', 'ENGINE', 3), + (160049, 160001, 'Hi-Pro V8 5.0L', 'ENGINE', 4), + ( + 160050, + 160001, + 'Mercury Flathead 255', + 'ENGINE', + 1 + ), + (160051, 160001, 'Chrysler V8 273', 'ENGINE', 1), + (160052, 160001, 'Chrysler V8 318', 'ENGINE', 1), + (160053, 160001, 'Chrysler V8 340', 'ENGINE', 2), + (160054, 160001, 'Chrysler V8 360', 'ENGINE', 2), + (160055, 160001, 'Chrysler V8 383', 'ENGINE', 2), + (160056, 160001, 'Chrysler V8 400', 'ENGINE', 3), + (160057, 160001, 'Chrysler V8 413', 'ENGINE', 3), + (160058, 160001, 'Chrysler V8 426', 'ENGINE', 3), + (160059, 160001, 'Chrysler V8 440', 'ENGINE', 3), + (160060, 160001, 'AMC V8 290', 'ENGINE', 1), + (160061, 160001, 'AMC V8 343', 'ENGINE', 2), + (160062, 160001, 'AMC V8 390', 'ENGINE', 2), + (160063, 160001, 'ShadeTree V8 265', 'ENGINE', 1), + (160064, 160001, 'AMC V8 360', 'ENGINE', 2), + ( + 160065, + 160001, + 'Chrysler V8 426 Hemi', + 'ENGINE', + 4 + ), + (160066, 160001, 'Ford V8 390 HP', 'ENGINE', 3), + (160067, 160001, 'Ford V8 429 Boss', 'ENGINE', 4), + (160068, 160001, 'Ford V8 289 HP', 'ENGINE', 2), + (160069, 160001, 'Ford V8 302 Boss', 'ENGINE', 2), + (160070, 160001, 'Buick BB V8 400', 'ENGINE', 3), + (160071, 160001, 'Buick BB V8 430', 'ENGINE', 3), + (160072, 160001, 'Chevy V8 427 ZL1', 'ENGINE', 4), + (160073, 160001, 'Buick V8 364', 'ENGINE', 2), + (160074, 160001, 'Buick V8 401', 'ENGINE', 3), + (160075, 160001, 'Buick V8 425', 'ENGINE', 3), + (160076, 160001, 'Buick SB V8 300', 'ENGINE', 1), + (160077, 160001, 'Buick SB V8 340', 'ENGINE', 2), + (160078, 160001, 'Cadillac V8 365', 'ENGINE', 2), + (160079, 160001, 'Cadillac V8 429', 'ENGINE', 3), + ( + 160080, + 160001, + 'Ford 385 NASCAR Mg Block', + 'ENGINE', + 4 + ), + ( + 160081, + 160001, + 'Ford 385 NASCAR Block', + 'ENGINE', + 4 + ), + (160082, 160001, 'AMC V8 401', 'ENGINE', 3), + ( + 180001, + 180001, + 'Chevrolet SB Cast Iron Crankshaft', + NULL, + 1 + ), + ( + 180002, + 180001, + 'Chevrolet BB Stock CI Crankshaft', + NULL, + 1 + ), + ( + 180003, + 180001, + 'Buick BB Stock Crankshaft', + NULL, + 1 + ), + ( + 180004, + 180001, + 'Buick SB Stock Crankshaft', + NULL, + 1 + ), + ( + 180005, + 180001, + 'Cadillac BB Stock Crankshaft', + NULL, + 1 + ), + ( + 180006, + 180001, + 'Chevrolet BB Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180007, + 180001, + 'Chevrolet SB Stock FS Crankshaft', + NULL, + 1 + ), + ( + 180008, + 180001, + 'Chrysler BB Stock FS Crankshaft', + NULL, + 1 + ), + ( + 180009, + 180001, + 'Chrysler SB Stock FS Crankshaft', + NULL, + 1 + ), + ( + 180010, + 180001, + 'Ford BB Stock Crankshaft', + NULL, + 1 + ), + ( + 180011, + 180001, + 'Ford Y Stock Crankshaft', + NULL, + 1 + ), + ( + 180012, + 180001, + 'Ford Flathead Stock Crankshaft', + NULL, + 1 + ), + ( + 180013, + 180001, + 'Olds BB Forged Steel Crankshaft', + NULL, + 1 + ), + ( + 180014, + 180001, + 'Olds SB Stock Crankshaft', + NULL, + 1 + ), + ( + 180015, + 180001, + 'AMC Stock TI Crankshaft', + NULL, + 1 + ), + ( + 180016, + 180001, + 'Pontiac Stock Crankshaft', + NULL, + 1 + ), + ( + 180017, + 180001, + 'Chevrolet SB Treated Iron Crankshaft', + NULL, + 1 + ), + ( + 180018, + 180001, + 'Crower Pure-Stock Chevrolet SB Crankshaft', + NULL, + 1 + ), + ( + 180019, + 180001, + 'Crower Stock-Plus Chevrolet SB Crankshaft', + NULL, + 2 + ), + ( + 180020, + 180001, + 'Crower Enduro Chevrolet SB Crankshaft', + NULL, + 2 + ), + ( + 180021, + 180001, + 'Crower Ultra-Light Chevrolet SB Crankshaft', + NULL, + 2 + ), + ( + 180022, + 180001, + 'Crower Standard Chevrolet SB Crankshaft', + NULL, + 3 + ), + ( + 180023, + 180001, + 'Crower Standard Chevrolet BB Crankshaft', + NULL, + 3 + ), + ( + 180024, + 180001, + 'Olds SB Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180025, + 180001, + 'Olds BB Stock Cast Iron Crankshaft', + NULL, + 1 + ), + ( + 180026, + 180001, + 'Olds BB Stock Treated Iron Crankshaft', + NULL, + 1 + ), + ( + 180027, + 180001, + 'Pontiac Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180028, + 180001, + 'Pontiac Armasteel (TI) Crankshaft', + NULL, + 1 + ), + ( + 180029, + 180001, + 'Pontiac SD Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180030, + 180001, + 'Ford SB Stock TI Crankshaft', + NULL, + 1 + ), + ( + 180031, + 180001, + 'Ford BB Truck Forged Steel Crankshaft', + NULL, + 1 + ), + ( + 180032, + 180001, + 'Ford BB 427 MR Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180033, + 180001, + 'Ford BB Treated Iron Crankshaft', + NULL, + 2 + ), + ( + 180034, + 180001, + 'Ford SB Boss (TI) Crankshaft', + NULL, + 2 + ), + ( + 180035, + 180001, + 'Ford BB Forged Steel Crankshaft', + NULL, + 2 + ), + ( + 180036, + 180001, + 'Chrysler BB Stock CI Crankshaft', + NULL, + 1 + ), + ( + 180037, + 180001, + 'Chrysler Hemi (FS) Crankshaft', + NULL, + 2 + ), + ( + 180038, + 180001, + 'Chrysler SB Stock CI Crankshaft', + NULL, + 1 + ), + ( + 180039, + 180001, + 'Crower Enduro Chevrolet BB Crankshaft', + NULL, + 2 + ), + ( + 180040, + 180001, + 'Crower Ultra-Light Chevrolet BB Crankshaft', + NULL, + 2 + ), + ( + 180041, + 180001, + 'Crower Enduro Ford SB Crankshaft', + NULL, + 2 + ), + ( + 180042, + 180001, + 'Crower Standard Ford SB Crankshaft', + NULL, + 3 + ), + ( + 180043, + 180001, + 'Crower Enduro Ford BB Crankshaft', + NULL, + 2 + ), + ( + 180044, + 180001, + 'Crower Standard Ford BB Crankshaft', + NULL, + 3 + ), + ( + 180045, + 180001, + 'Crower Enduro Chrysler BB Crankshaft', + NULL, + 2 + ), + ( + 180046, + 180001, + 'Crower Enduro Chrysler SB Crankshaft', + NULL, + 2 + ), + ( + 180047, + 180001, + 'Crower Standard Chrysler BB Crankshaft', + NULL, + 3 + ), + ( + 180048, + 180001, + 'Crower Standard Chrysler SB Crankshaft', + NULL, + 3 + ), + ( + 180049, + 180001, + 'Buick Nailhead Stock FS Crankshaft', + NULL, + 1 + ), + ( + 180050, + 180001, + 'Ford BB HD CI Crankshaft', + NULL, + 2 + ), + ( + 180051, + 180001, + 'Ford SB HP TI Crankshaft', + NULL, + 2 + ), + ( + 180052, + 180001, + 'AMC Group 19 Crankshaft', + NULL, + 2 + ), + ( + 180053, + 180001, + 'Cadillac L-Head Crankshaft', + NULL, + 1 + ), + ( + 180054, + 180001, + 'Ford Cleveland Block Stock Crankshaft', + NULL, + 1 + ), + ( + 180055, + 180001, + 'Ford Cleveland Block Boss Crankshaft', + NULL, + 2 + ), + ( + 180056, + 180001, + 'Ford 385 Block Stock CI Crankshaft', + NULL, + 1 + ), + ( + 180057, + 180001, + 'Ford 385 Block Boss FS Crankshaft', + NULL, + 2 + ), + ( + 180058, + 180001, + 'Ford 385 Block NASCAR Crankshaft', + NULL, + 4 + ), + ( + 180059, + 180001, + 'Ford Y Truck Crankshaft', + NULL, + 1 + ), + ( + 180060, + 180001, + 'Chevrolet W Stock FS Crankshaft', + NULL, + 1 + ), + ( + 180061, + 180001, + 'Buick Nailhead Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180062, + 180001, + 'Buick SB Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180063, + 180001, + 'Buick BB Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180064, + 180001, + 'Cadillac L-Head Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180065, + 180001, + 'Cadillac Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180066, + 180001, + 'Chevrolet W Block Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180067, + 180001, + 'Chrysler Hemi Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180068, + 180001, + 'Ford Flathead Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180069, + 180001, + 'Oldsmobile SB Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180070, + 180001, + 'Oldsmobile BB Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180071, + 180001, + 'Newcomb Y Block Stump Puller Crankshaft', + NULL, + 2 + ), + ( + 180072, + 180001, + 'Newcomb Y Block Street Max Crankshaft', + NULL, + 2 + ), + ( + 180073, + 180001, + 'Newcomb Y Block Super Max Crankshaft', + NULL, + 2 + ), + ( + 180074, + 180001, + 'Duro Rod Y Block Marathon Crankshaft', + NULL, + 1 + ), + ( + 180075, + 180001, + 'Duro Rod Y Block Lightweight Crankshaft', + NULL, + 2 + ), + ( + 180076, + 180001, + 'Duro Rod Y Block Champion Crankshaft', + NULL, + 2 + ), + ( + 180077, + 180001, + 'Hedgely Y Block Super 292 Crankshaft', + NULL, + 1 + ), + ( + 180078, + 180001, + 'Hedgely Y Block Super 312 Crankshaft', + NULL, + 2 + ), + ( + 180079, + 180001, + 'Duro Rod Ford SB Champion Crank', + NULL, + 2 + ), + ( + 180080, + 180001, + 'Newcomb Ford SB Super Max Crank', + NULL, + 2 + ), + ( + 180081, + 180001, + 'Newcomb Ford SB Street Max Crank', + NULL, + 2 + ), + ( + 180082, + 180001, + 'Newcomb Buick Nailhead Stump Puller Crank', + NULL, + 2 + ), + ( + 180083, + 180001, + 'Newcomb Buick Nailhead Super Max Crank', + NULL, + 2 + ), + ( + 180084, + 180001, + 'Newcomb Buick Nailhead Street Max Crank', + NULL, + 2 + ), + ( + 180085, + 180001, + 'Hedgely Buick Nailhead Super 300 Crank', + NULL, + 1 + ), + ( + 180086, + 180001, + 'Hedgely Buick Nailhead Super 400 Crank', + NULL, + 2 + ), + ( + 180087, + 180001, + 'Duro Rod Buick Nailhead Champion Crank', + NULL, + 2 + ), + ( + 180088, + 180001, + 'Duro Rod Buick Nailhead Lightweight Crank', + NULL, + 2 + ), + ( + 180089, + 180001, + 'Duro Rod Buick Nailhead Marathon Crank', + NULL, + 2 + ), + ( + 180090, + 180001, + 'Hedgely Chrysler SB Super 340 Crank', + NULL, + 2 + ), + ( + 180091, + 180001, + 'Duro Rod Chrysler SB Lightweight Crank', + NULL, + 2 + ), + ( + 180092, + 180001, + 'Duro Rod Chrysler SB Marathon Crank', + NULL, + 2 + ), + ( + 180093, + 180001, + 'Percy Chrysler SB Lightweight Crank', + NULL, + 3 + ), + ( + 180094, + 180001, + 'Duro Rod Pontiac Lightweight Crank', + NULL, + 2 + ), + ( + 180095, + 180001, + 'Duro Rod Pontiac Marathon Crank', + NULL, + 2 + ), + ( + 180096, + 180001, + 'Hedgely Pontiac SD Special Crank', + NULL, + 2 + ), + ( + 180097, + 180001, + 'Newcomb Cleveland Stump Puller Crank', + NULL, + 1 + ), + ( + 180098, + 180001, + 'Newcomb Cleveland Street Max Crank', + NULL, + 2 + ), + ( + 180099, + 180001, + 'Newcomb Cleveland Super Max Crank', + NULL, + 3 + ), + ( + 180100, + 180001, + 'Duro Rod Cleveland Contender Crank', + NULL, + 1 + ), + ( + 180101, + 180001, + 'Duro Rod Cleveland Champion Crank', + NULL, + 2 + ), + ( + 180102, + 180001, + 'Duro Rod Cleveland Lightweight Crank', + NULL, + 3 + ), + ( + 180103, + 180001, + 'Duro Rod Cleveland Marathon Crank', + NULL, + 3 + ), + ( + 180104, + 180001, + 'Duro Rod Cleveland Legend Crank', + NULL, + 4 + ), + ( + 180105, + 180001, + 'Newcomb Ford 385 Stump Puller Crank', + NULL, + 1 + ), + ( + 180106, + 180001, + 'Newcomb Ford 385 Street Max Crank', + NULL, + 2 + ), + ( + 180107, + 180001, + 'Newcomb Ford 385 Super Max Crank', + NULL, + 3 + ), + ( + 180108, + 180001, + 'Duro Rod Ford 385 Contender Crank', + NULL, + 1 + ), + ( + 180109, + 180001, + 'Duro Rod Ford 385 Champion Crank', + NULL, + 2 + ), + ( + 180110, + 180001, + 'Duro Rod Ford 385 Lightweight Crank', + NULL, + 3 + ), + ( + 180111, + 180001, + 'Duro Rod Ford 385 Marathon Crank', + NULL, + 3 + ), + ( + 180112, + 180001, + 'Duro Rod Ford 385 Legend Crank', + NULL, + 4 + ), + ( + 180113, + 180001, + 'Newcomb Hemi Stump Puller Crank', + NULL, + 1 + ), + ( + 180114, + 180001, + 'Newcomb Hemi Street Max Crank', + NULL, + 2 + ), + ( + 180115, + 180001, + 'Newcomb Hemi Super Max Crank', + NULL, + 3 + ), + ( + 180116, + 180001, + 'Duro Rod Hemi Contender Crank', + NULL, + 1 + ), + ( + 180117, + 180001, + 'Duro Rod Hemi Champion Crank', + NULL, + 2 + ), + ( + 180118, + 180001, + 'Duro Rod Hemi Lighweight Crank', + NULL, + 3 + ), + ( + 180119, + 180001, + 'Duro Rod Hemi Marathon Crank', + NULL, + 3 + ), + ( + 180120, + 180001, + 'Duro Rod Hemi Legend Crank', + NULL, + 4 + ), + ( + 180121, + 180001, + 'Newcomb Cadillac BB Stump Puller Crank', + NULL, + 1 + ), + ( + 180122, + 180001, + 'Newcomb Cadillac BB Street Max Crank', + NULL, + 2 + ), + ( + 180123, + 180001, + 'Newcomb Cadillac BB Super Max Crank', + NULL, + 3 + ), + ( + 180124, + 180001, + 'Duro Rod Cadillac BB Contender Crank', + NULL, + 1 + ), + ( + 180125, + 180001, + 'Duro Rod Cadillac BB Champion Crank', + NULL, + 2 + ), + ( + 180126, + 180001, + 'Duro Rod Cadillac BB Lightweight Crank', + NULL, + 3 + ), + ( + 180127, + 180001, + 'Duro Rod Cadillac BB Marathon Crank', + NULL, + 3 + ), + ( + 180128, + 180001, + 'Duro Rod Cadillac BB Legend Crank', + NULL, + 4 + ), + ( + 180129, + 180001, + 'Duro Rod Chevy W Contender Crank', + NULL, + 2 + ), + ( + 180130, + 180001, + 'Duro Rod Chevy W Champion Crank', + NULL, + 2 + ), + ( + 180131, + 180001, + 'Duro Rod Chevy W Lightweight Crank', + NULL, + 3 + ), + ( + 180132, + 180001, + 'Duro Rod Chevy W Marathon Crank', + NULL, + 3 + ), + ( + 180133, + 180001, + 'Duro Rod Chevy W Legend Crank', + NULL, + 4 + ), + ( + 180134, + 180001, + 'Newcomb Chevy W Stump Puller Crank', + NULL, + 1 + ), + ( + 180135, + 180001, + 'Newcomb Chevy W Street Max Crank', + NULL, + 2 + ), + ( + 180136, + 180001, + 'Newcomb Chevy W Super Max Crank', + NULL, + 3 + ), + ( + 180137, + 180001, + 'Newcomb AMC Stump Puller Crank', + NULL, + 1 + ), + ( + 180138, + 180001, + 'Newcomb AMC Street Max Crank', + NULL, + 2 + ), + ( + 180139, + 180001, + 'Newcomb AMC Super Max Crank', + NULL, + 3 + ), + ( + 180140, + 180001, + 'Duro Rod AMC Contender Crank', + NULL, + 1 + ), + ( + 180141, + 180001, + 'Duro Rod AMC Champion Crank', + NULL, + 2 + ), + ( + 180142, + 180001, + 'Duro Rod AMC Lightweight Crank', + NULL, + 3 + ), + ( + 180143, + 180001, + 'Duro Rod AMC Marathon Crank', + NULL, + 3 + ), + ( + 180144, + 180001, + 'Duro Rod AMC Legend Crank', + NULL, + 4 + ), + ( + 180145, + 180001, + 'Newcomb Olds BB Stump Puller Crank', + NULL, + 1 + ), + ( + 180146, + 180001, + 'Newcomb Olds BB Street Max Crank', + NULL, + 2 + ), + ( + 180147, + 180001, + 'Newcomb Olds BB Super Max Crank', + NULL, + 3 + ), + ( + 180148, + 180001, + 'Duro Rod Olds BB Contender Crank', + NULL, + 1 + ), + ( + 180149, + 180001, + 'Duro Rod Olds BB Champion Crank', + NULL, + 2 + ), + ( + 180150, + 180001, + 'Duro Rod Olds BB Lightweight Crank', + NULL, + 3 + ), + ( + 180151, + 180001, + 'Duro Rod Olds BB Marathon Crank', + NULL, + 3 + ), + ( + 180152, + 180001, + 'Duro Rod Olds BB Legend Crank', + NULL, + 4 + ), + ( + 180153, + 180001, + 'Newcomb Chrylser BB Stump Puller Crank', + NULL, + 1 + ), + ( + 180154, + 180001, + 'Newcomb Chrysler BB Street Max Crank', + NULL, + 2 + ), + ( + 180155, + 180001, + 'Newcomb Chrysler BB Super Max Crank', + NULL, + 3 + ), + ( + 180156, + 180001, + 'Duro Rod Chrysler BB Contender Crank', + NULL, + 1 + ), + ( + 180157, + 180001, + 'Duro Rod Chrysler BB Champion Crank', + NULL, + 2 + ), + ( + 180158, + 180001, + 'Duro Rod Chrysler BB Lightweight Crank', + NULL, + 3 + ), + ( + 180159, + 180001, + 'Duro Rod Chrysler BB Marathon Crank', + NULL, + 3 + ), + ( + 180160, + 180001, + 'Duro Rod Chrysler BB Legend Crank', + NULL, + 4 + ), + ( + 180161, + 180001, + 'Newcomb Ford BB Stump Puller Crank', + NULL, + 1 + ), + ( + 180162, + 180001, + 'Newcomb Ford BB Street Max Crank', + NULL, + 2 + ), + ( + 180163, + 180001, + 'Newcomb Ford BB Super Max Crank', + NULL, + 3 + ), + ( + 180164, + 180001, + 'Duro Rod Ford BB Contender Crank', + NULL, + 1 + ), + ( + 180165, + 180001, + 'Duro Rod Ford BB Champion Crank', + NULL, + 2 + ), + ( + 180166, + 180001, + 'Duro Rod Ford BB Lightweight Crank', + NULL, + 3 + ), + ( + 180167, + 180001, + 'Duro Rod Ford BB Marathon Crank', + NULL, + 3 + ), + ( + 180168, + 180001, + 'Duro Rod Ford BB Legend Crank', + NULL, + 4 + ), + ( + 180169, + 180001, + 'Newcomb Chevy BB Stump Puller Crank', + NULL, + 1 + ), + ( + 180170, + 180001, + 'Newcomb Chevy BB Street Max Crank', + NULL, + 2 + ), + ( + 180171, + 180001, + 'Newcomb Chevy BB Super Max Crank', + NULL, + 3 + ), + ( + 180172, + 180001, + 'Duro Rod Chevy BB Contender Crank', + NULL, + 1 + ), + ( + 180173, + 180001, + 'Duro Rod Chevy BB Champion Crank', + NULL, + 2 + ), + ( + 180174, + 180001, + 'Duro Rod Chevy BB Lightweight Crank', + NULL, + 3 + ), + ( + 180175, + 180001, + 'Duro Rod Chevy BB Marathon Crank', + NULL, + 3 + ), + ( + 180176, + 180001, + 'Duro Rod Chevy BB Legend Crank', + NULL, + 4 + ), + (190001, 190001, 'Ford SB Boss 302 Rod', NULL, 2), + ( + 190002, + 190001, + 'Ford BB HD Capscrew Rod', + NULL, + 2 + ), + (190003, 190001, 'Ford BB HP 390 Rod', NULL, 2), + (190004, 190001, 'Pontiac Ram Air V Rod', NULL, 2), + ( + 190005, + 190001, + 'Cadillac BB Stock CI Rod', + NULL, + 1 + ), + (190006, 190001, 'Pontiac CI Stock Rod', NULL, 1), + (190007, 190001, 'Buick BB Stock Rod', NULL, 1), + ( + 190008, + 190001, + 'Buick Nailhead Stock Rod', + NULL, + 1 + ), + (190009, 190001, 'Cadillac BB Stock Rod', NULL, 1), + (190010, 190001, 'Chevrolet BB Stock Rod', NULL, 1), + (190011, 190001, 'Chevrolet SB Stock Rod', NULL, 1), + (190012, 190001, 'Chrysler BB Stock Rod', NULL, 1), + (190013, 190001, 'Chrysler SB Stock Rod', NULL, 1), + (190014, 190001, 'Ford BB Stock Rod', NULL, 1), + (190015, 190001, 'Ford SB Stock Rod', NULL, 1), + ( + 190016, + 190001, + 'Ford Flathead Stock Rod', + NULL, + 1 + ), + (190017, 190001, 'Olds BB Stock Rod', NULL, 1), + (190018, 190001, 'Olds SB Stock Rod', NULL, 1), + (190019, 190001, 'AMC Stock Rod', NULL, 1), + (190020, 190001, 'Pontiac Stock Rod', NULL, 1), + ( + 190021, + 190001, + 'Crower Sportsman Ford SB Rod', + NULL, + 2 + ), + ( + 190022, + 190001, + 'Crower Billet Steel Ford SB Rod', + NULL, + 3 + ), + ( + 190023, + 190001, + 'Crower Lightweight Billet Steel Ford SB Rod', + NULL, + 3 + ), + ( + 190024, + 190001, + 'Crower Maxi-Light 93 Billet Steel Ford SB Rod', + NULL, + 3 + ), + ( + 190025, + 190001, + 'Crower Titanium Ford BB Rod', + NULL, + 4 + ), + ( + 190026, + 190001, + 'Ford BB Le Mans Capscrew Rod', + NULL, + 4 + ), + (190027, 190001, 'Ford BB PI Rod', NULL, 2), + (190028, 190001, 'Ford 385 Boss Rod', NULL, 3), + (190029, 190001, 'Ford 385 820-S Rod', NULL, 4), + (190030, 190001, 'Ford 385 820-T Rod', NULL, 3), + (190031, 190001, 'Chrysler BB HD Rod', NULL, 2), + ( + 190032, + 190001, + 'Crower Sportsman Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190033, + 190001, + 'Crower Sportsman Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190034, + 190001, + 'Crower Billet Steel Ford BB Rod', + NULL, + 2 + ), + ( + 190035, + 190001, + 'Crower Billet Steel Pontiac Rod', + NULL, + 2 + ), + ( + 190036, + 190001, + 'Crower Billet Steel Olds BB Rod', + NULL, + 2 + ), + ( + 190037, + 190001, + 'Crower Billet Steel Buick BB Rod', + NULL, + 2 + ), + ( + 190038, + 190001, + 'Crower Billet Steel Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190039, + 190001, + 'Crower Billet Steel Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190040, + 190001, + 'Crower Lightweight Billet Steel Buick BB Rod', + NULL, + 2 + ), + ( + 190041, + 190001, + 'Crower Lightweight Billet Steel Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190042, + 190001, + 'Crower Lightweight Billet Steel Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190043, + 190001, + 'Crower Lightweight Billet Steel Ford BB Rod', + NULL, + 2 + ), + ( + 190044, + 190001, + 'Crower Lightweight Billet Steel Olds BB Rod', + NULL, + 2 + ), + ( + 190045, + 190001, + 'Crower Lightweight Billet Steel Pontiac Rod', + NULL, + 2 + ), + ( + 190046, + 190001, + 'Crower Maxi-Light 93 Billet Steel Chevrolet SB Rod', + NULL, + 3 + ), + ( + 190047, + 190001, + 'Crower Titanium Buick BB Rod', + NULL, + 4 + ), + ( + 190048, + 190001, + 'Crower Titanium Chevrolet BB Rod', + NULL, + 4 + ), + ( + 190049, + 190001, + 'Crower Titanium Chevrolet SB Rod', + NULL, + 4 + ), + ( + 190050, + 190001, + 'Lunati Forged Aluminum Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190051, + 190001, + 'Lunati Forged Aluminum Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190052, + 190001, + 'Lunati Street Race Ford SB Rod', + NULL, + 2 + ), + ( + 190053, + 190001, + 'Lunati Street Race Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190054, + 190001, + 'Lunati Street Race Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190055, + 190001, + 'Lunati Pro Billet Ford SB Rod', + NULL, + 3 + ), + ( + 190056, + 190001, + 'Lunati Pro Billet Chevrolet SB Rod', + NULL, + 3 + ), + ( + 190057, + 190001, + 'Lunati Pro Billet Chevrolet BB Rod', + NULL, + 3 + ), + ( + 190058, + 190001, + 'Lunati Pro Mod Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190059, + 190001, + 'Lunati Pro Mod Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190060, + 190001, + 'Lunati Sportsman H-Beam Chevrolet SB Rod', + NULL, + 2 + ), + ( + 190061, + 190001, + 'Lunati Sportsman H-Beam Chevrolet BB Rod', + NULL, + 2 + ), + ( + 190062, + 190001, + 'Lunati Sportsman H-Beam Ford BB Rod', + NULL, + 2 + ), + ( + 190063, + 190001, + 'Lunati Sportsman H-Beam Ford SB Rod', + NULL, + 2 + ), + ( + 190064, + 190001, + 'Lunati Sportsman H-Beam Chrysler BB Rod', + NULL, + 2 + ), + ( + 190065, + 190001, + 'Lunati Sportsman H-Beam Pontiac Rod', + NULL, + 2 + ), + ( + 190066, + 190001, + 'Chevrolet SB 400 FS Rod', + NULL, + 1 + ), + (190067, 190001, 'Chevrolet W HD FS Rod', NULL, 2), + (190068, 190001, 'AMC Stock TI Rod', NULL, 1), + (190069, 190001, 'Chrysler Hemi Rods', NULL, 3), + (190070, 190001, 'Cadillac L-Head Rods', NULL, 1), + ( + 190071, + 190001, + 'Buick SB Cast Iron Connecting Rod', + NULL, + 1 + ), + ( + 190072, + 190001, + 'Ford Cleveland Block Stock Rods', + NULL, + 1 + ), + ( + 190073, + 190001, + 'Ford Cleveland Block Boss Rods', + NULL, + 2 + ), + ( + 190074, + 190001, + 'Ford 385 Block Stock Rod', + NULL, + 1 + ), + (190075, 190001, 'Ford SB HP Rod', NULL, 2), + (190076, 190001, 'Ford Y Stock Rods', NULL, 1), + (190077, 190001, 'Ford Y Truck Rods', NULL, 1), + (190078, 190001, 'Buick Nailhead 364 Rod', NULL, 2), + (190079, 190001, 'Buick SB FS Rod', NULL, 2), + (190080, 190001, 'Cadillac L-Head FS Rod', NULL, 2), + ( + 190081, + 190001, + 'Chevrolet W Stock FS Rod', + NULL, + 1 + ), + ( + 190082, + 190001, + 'Lunati Sportsman H-Beam Chevrolet W Rod', + NULL, + 2 + ), + ( + 190083, + 190001, + 'Crower Billet Steel Chrysler SB Rod', + NULL, + 2 + ), + ( + 190084, + 190001, + 'Crower Billet Steel Chrysler Hemi Rod', + NULL, + 3 + ), + ( + 190085, + 190001, + 'Crower Lightweight Billet Steel Chrysler Hemi Rod', + NULL, + 3 + ), + ( + 190086, + 190001, + 'Crower Titanium Chrysler Hemi Rod', + NULL, + 4 + ), + ( + 190087, + 190001, + 'Lunati Pro Billet Chrysler Hemi Rod', + NULL, + 3 + ), + ( + 190088, + 190001, + 'Edelbrock Ford Flathead FS Rod', + NULL, + 2 + ), + (190089, 190001, 'Olds SB W-31 FS Rod', NULL, 2), + ( + 190090, + 190001, + 'Newcomb Y Block Stump Puller Rod', + NULL, + 1 + ), + ( + 190091, + 190001, + 'Newcomb Y Block Street Max Rod', + NULL, + 2 + ), + ( + 190092, + 190001, + 'Newcomb Y Block Super Max Rod', + NULL, + 2 + ), + ( + 190093, + 190001, + 'Duro Rod Y Block Marathon Rod', + NULL, + 1 + ), + ( + 190094, + 190001, + 'Duro Rod Y Block Lightweight Rod', + NULL, + 2 + ), + ( + 190095, + 190001, + 'Duro Rod Y Block Champion Rod', + NULL, + 2 + ), + ( + 190096, + 190001, + 'Duro Rod Y Block Legend Rod', + NULL, + 3 + ), + ( + 190097, + 190001, + 'Hedgely Y Block Extra Y Rod', + NULL, + 1 + ), + ( + 190098, + 190001, + 'Hedgely Y Block T-Bird Special Rod', + NULL, + 2 + ), + ( + 190099, + 190001, + 'Hedgely Buick Nailhead Century Special Rod', + NULL, + 1 + ), + ( + 190100, + 190001, + 'Hedgely Buick Nailhead Riviera Special Rod', + NULL, + 2 + ), + ( + 190101, + 190001, + 'Duro Rod Buick Nailhead Champion Rod', + NULL, + 2 + ), + ( + 190102, + 190001, + 'Duro Rod Buick Nailhead Legend Rod', + NULL, + 3 + ), + ( + 190103, + 190001, + 'Duro Rod Buick Nailhead Lightweight Rod', + NULL, + 2 + ), + ( + 190104, + 190001, + 'Duro Rod Buick Nailhead Marathon Rod', + NULL, + 2 + ), + ( + 190105, + 190001, + 'Newcomb Buick Nailhead Stump Puller Rod', + NULL, + 2 + ), + ( + 190106, + 190001, + 'Newcomb Buick Nailhead Street Max Rod', + NULL, + 2 + ), + ( + 190107, + 190001, + 'Newcomb Buick Nailhead Super Max Rod', + NULL, + 3 + ), + ( + 190108, + 190001, + 'Hedgely Ford SB T351 Billet Rod', + NULL, + 3 + ), + ( + 190109, + 190001, + 'Hedgely Ford SB Power I Rod', + NULL, + 2 + ), + ( + 190110, + 190001, + 'Percy Chrysler SB Replica Rod', + NULL, + 1 + ), + ( + 190111, + 190001, + 'Percy Chrysler SB Replica Street Racer Rod', + NULL, + 2 + ), + ( + 190112, + 190001, + 'Percy Chrysler SB Factory Lightweight Rod', + NULL, + 3 + ), + ( + 190113, + 190001, + 'Duro Rod Chrysler SB Marathon Rod', + NULL, + 2 + ), + ( + 190114, + 190001, + 'Duro Rod Chrysler SB Lightweight Rod', + NULL, + 2 + ), + ( + 190115, + 190001, + 'Newcomb Chrysler SB Street Max Rod', + NULL, + 2 + ), + ( + 190116, + 190001, + 'Duro Rod Pontiac Champion Rod', + NULL, + 2 + ), + ( + 190117, + 190001, + 'Duro Rod Pontiac Lightweight Rod', + NULL, + 2 + ), + ( + 190118, + 190001, + 'Duro Rod Pontiac Marathon Rod', + NULL, + 2 + ), + ( + 190119, + 190001, + 'Newcomb Cleveland Stump Puller Rod', + NULL, + 1 + ), + ( + 190120, + 190001, + 'Newcomb Cleveland Street Max Rod', + NULL, + 2 + ), + ( + 190121, + 190001, + 'Newcomb Cleveland Super Max Rod', + NULL, + 3 + ), + ( + 190122, + 190001, + 'Duro Rod Cleveland Lightweight Rod', + NULL, + 3 + ), + ( + 190123, + 190001, + 'Duro Rod Cleveland Marathon Rod', + NULL, + 3 + ), + ( + 190124, + 190001, + 'Duro Rod Cleveland Legend Rod', + NULL, + 4 + ), + ( + 190125, + 190001, + 'Newcomb Ford 385 Stump Puller Rod', + NULL, + 1 + ), + ( + 190126, + 190001, + 'Newcomb Ford 385 Street Max Rod', + NULL, + 2 + ), + ( + 190127, + 190001, + 'Newcomb Ford 385 Super Max Rod', + NULL, + 3 + ), + ( + 190128, + 190001, + 'Duro Rod Ford 385 Lightweight Rod', + NULL, + 3 + ), + ( + 190129, + 190001, + 'Duro Rod Ford 385 Marathon Rod', + NULL, + 3 + ), + ( + 190130, + 190001, + 'Duro Rod Ford 385 Legend Rod', + NULL, + 4 + ), + ( + 190131, + 190001, + 'Duro Rod Hemi Champion Rod', + NULL, + 2 + ), + ( + 190132, + 190001, + 'Duro Rod Hemi Lightweight Rod', + NULL, + 3 + ), + ( + 190133, + 190001, + 'Duro Rod Hemi Marathon Rod', + NULL, + 3 + ), + ( + 190134, + 190001, + 'Duro Rod Hemi Legend Rod', + NULL, + 4 + ), + ( + 190135, + 190001, + 'Duro Rod Cadillac BB Champion Rod', + NULL, + 2 + ), + ( + 190136, + 190001, + 'Duro Rod Cadillac BB Lightweight Rod', + NULL, + 3 + ), + ( + 190137, + 190001, + 'Duro Rod Cadillac BB Marathon Rod', + NULL, + 3 + ), + ( + 190138, + 190001, + 'Duro Rod Cadillac BB Legend Rod', + NULL, + 4 + ), + ( + 190139, + 190001, + 'Newcomb Cadillac BB Stump Puller Rod', + NULL, + 1 + ), + ( + 190140, + 190001, + 'Newcomb Cadillac BB Street Max Rod', + NULL, + 2 + ), + ( + 190141, + 190001, + 'Newcomb Cadillac BB Super Max Rod', + NULL, + 3 + ), + ( + 190142, + 190001, + 'Newcomb Chevy W Stump Puller Rod', + NULL, + 1 + ), + ( + 190143, + 190001, + 'Newcomb Chevy W Street Max Rod', + NULL, + 2 + ), + ( + 190144, + 190001, + 'Newcomb Chevy W Super Max Rod', + NULL, + 3 + ), + ( + 190145, + 190001, + 'Duro Rod Chevy W Contender Rod', + NULL, + 1 + ), + ( + 190146, + 190001, + 'Duro Rod Chevy W Champion Rod', + NULL, + 2 + ), + ( + 190147, + 190001, + 'Duro Rod Chevy W Lightweight Rod', + NULL, + 3 + ), + ( + 190148, + 190001, + 'Duro Rod Chevy W Marathon Rod', + NULL, + 3 + ), + ( + 190149, + 190001, + 'Duro Rod Chevy W Legend Rod', + NULL, + 4 + ), + ( + 190150, + 190001, + 'Newcomb AMC Stump Puller Rod', + NULL, + 1 + ), + ( + 190151, + 190001, + 'Newcomb AMC Street Max Rod', + NULL, + 2 + ), + ( + 190152, + 190001, + 'Newcomb AMC Super Max Rod', + NULL, + 3 + ), + ( + 190153, + 190001, + 'Duro Rod AMC Contender Rod', + NULL, + 1 + ), + ( + 190154, + 190001, + 'Duro Rod AMC Champion Rod', + NULL, + 2 + ), + ( + 190155, + 190001, + 'Duro Rod AMC Lightweight Rod', + NULL, + 3 + ), + ( + 190156, + 190001, + 'Duro Rod AMC Marathon Rod', + NULL, + 3 + ), + ( + 190157, + 190001, + 'Duro Rod AMC Legend Rod', + NULL, + 4 + ), + ( + 190158, + 190001, + 'Duro Rod Olds BB Contender Rod', + NULL, + 1 + ), + ( + 190159, + 190001, + 'Duro Rod Olds BB Champion Rod', + NULL, + 2 + ), + ( + 190160, + 190001, + 'Duro Rod Olds BB Lightweight Rod', + NULL, + 3 + ), + ( + 190161, + 190001, + 'Duro Rod Olds BB Marathon Rod', + NULL, + 3 + ), + ( + 190162, + 190001, + 'Duro Rod Olds BB Legend Rod', + NULL, + 4 + ), + ( + 190163, + 190001, + 'Newcomb Chrysler BB Stump Puller Rod', + NULL, + 1 + ), + ( + 190164, + 190001, + 'Newcomb Chrysler BB Street Max Rod', + NULL, + 2 + ), + ( + 190165, + 190001, + 'Newcomb Chrylser BB Super Max Rod', + NULL, + 3 + ), + ( + 190166, + 190001, + 'Duro Rod Chrysler BB Contender Rod', + NULL, + 1 + ), + ( + 190167, + 190001, + 'Duro Rod Chrysler BB Champion Rod', + NULL, + 2 + ), + ( + 190168, + 190001, + 'Duro Rod Chrysler BB Lightweight Rod', + NULL, + 3 + ), + ( + 190169, + 190001, + 'Duro Rod Chrysler BB Marathon Rod', + NULL, + 3 + ), + ( + 190170, + 190001, + 'Duro Rod Chrysler BB Legend Rod', + NULL, + 4 + ), + ( + 190171, + 190001, + 'Duro Rod Ford BB Contender Rod', + NULL, + 1 + ), + ( + 190172, + 190001, + 'Duro Rod Ford BB Champion Rod', + NULL, + 2 + ), + ( + 190173, + 190001, + 'Duro Rod Ford BB Lightweight Rod', + NULL, + 3 + ), + ( + 190174, + 190001, + 'Duro Rod Ford BB Marathon Rod', + NULL, + 3 + ), + ( + 190175, + 190001, + 'Duro Rod Ford BB Legend Rod', + NULL, + 4 + ), + ( + 200001, + 200001, + 'Ford BB Flat Top Piston', + NULL, + 1 + ), + ( + 200002, + 200001, + 'Ford SB Flat Top Piston', + NULL, + 1 + ), + ( + 200003, + 200001, + 'Chevrolet BB Flat Top Piston', + NULL, + 1 + ), + ( + 200004, + 200001, + 'JE Pistons Domed Top Ford BB Piston', + NULL, + 2 + ), + ( + 200005, + 200001, + 'Ford BB Cammer Pop-up Piston', + NULL, + 4 + ), + ( + 200006, + 200001, + 'Chevrolet SB Flat Top Piston', + NULL, + 1 + ), + ( + 200007, + 200001, + 'JE Pistons Wedge Top Ford Y Piston', + NULL, + 2 + ), + ( + 200008, + 200001, + 'Ford BB Recessed Top Piston', + NULL, + 1 + ), + ( + 200009, + 200001, + 'Chrysler SB Flat Top Piston', + NULL, + 1 + ), + (200010, 200001, 'AMC Group 19 Piston', NULL, 2), + ( + 200011, + 200001, + 'Chevrolet W Z11 Domed Top (3.25) Piston', + NULL, + 4 + ), + ( + 200012, + 200001, + 'Pontiac Ram Air IV Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200013, + 200001, + 'JE Pistons Domed Top Ford SB Piston', + NULL, + 2 + ), + (200014, 200001, 'Ford 385 Boss Piston', NULL, 2), + ( + 200015, + 200001, + 'Chrysler BB Flat Top Piston', + NULL, + 1 + ), + ( + 200016, + 200001, + 'Buick BB Flat Top Piston', + NULL, + 1 + ), + ( + 200017, + 200001, + 'Buick SB Flat Top Piston', + NULL, + 1 + ), + ( + 200018, + 200001, + 'Cadillac BB Flat Top Piston', + NULL, + 1 + ), + ( + 200019, + 200001, + 'Ford Flathead Flat Top Piston', + NULL, + 1 + ), + ( + 200020, + 200001, + 'Olds BB Flat Top Piston', + NULL, + 1 + ), + ( + 200021, + 200001, + 'Olds SB Flat Top Piston', + NULL, + 1 + ), + (200022, 200001, 'AMC Flat Top Piston', NULL, 1), + ( + 200023, + 200001, + 'Pontiac Flat Top Piston', + NULL, + 1 + ), + ( + 200024, + 200001, + 'Chevrolet SB Flat Top Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200025, + 200001, + 'Buick BB Stage I Piston', + NULL, + 2 + ), + ( + 200026, + 200001, + 'Buick BB Stage II Piston', + NULL, + 2 + ), + ( + 200027, + 200001, + 'Pontiac Flat Top Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200028, + 200001, + 'Ford BB Flat Top Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200029, + 200001, + 'Chrysler BB Flat Top Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200030, + 200001, + 'Chevrolet W Domed Top (0.75) Piston', + NULL, + 2 + ), + ( + 200031, + 200001, + 'JE Pistons Wedge Top Ford SB Piston', + NULL, + 2 + ), + ( + 200032, + 200001, + 'JE Pistons Wedge Top Chevrolet SB Piston', + NULL, + 2 + ), + ( + 200033, + 200001, + 'JE Pistons Wedge Top Chevrolet BB Piston', + NULL, + 2 + ), + ( + 200034, + 200001, + 'JE Pistons Wedge Top Buick BB Piston', + NULL, + 2 + ), + ( + 200035, + 200001, + 'JE Pistons Wedge Top Olds BB Piston', + NULL, + 2 + ), + ( + 200036, + 200001, + 'JE Pistons Domed Top Chevrolet SB Piston', + NULL, + 2 + ), + ( + 200037, + 200001, + 'JE Pistons Domed Top Chevrolet BB Piston', + NULL, + 2 + ), + ( + 200038, + 200001, + 'JE Pistons Wedge Top Chrysler BB Piston', + NULL, + 2 + ), + ( + 200039, + 200001, + 'JE Pistons Domed Top Chrysler BB Piston', + NULL, + 2 + ), + ( + 200040, + 200001, + 'JE Pistons Domed Top Buick BB Piston', + NULL, + 2 + ), + ( + 200041, + 200001, + 'JE Pistons Domed Top Olds BB Piston', + NULL, + 2 + ), + ( + 200042, + 200001, + 'Ford Y Domed Top Piston', + NULL, + 2 + ), + ( + 200043, + 200001, + 'Ford BB LR Domed (0.4) Piston', + NULL, + 3 + ), + ( + 200044, + 200001, + 'Ford BB Recessed (-0.1) Piston', + NULL, + 1 + ), + ( + 200045, + 200001, + 'Chrysler BB Wedge (0.1) Piston', + NULL, + 2 + ), + ( + 200046, + 200001, + 'Chevrolet BB Flat Top Forged Aluminum Piston', + NULL, + 2 + ), + ( + 200047, + 200001, + 'Chevrolet SB Z28 Recessed Top Piston', + NULL, + 2 + ), + ( + 200048, + 200001, + 'Chevrolet W Recessed (-0.75) Cast Al. Piston', + NULL, + 1 + ), + ( + 200049, + 200001, + 'Chevrolet W Domed Top (1.0) Piston', + NULL, + 2 + ), + ( + 200050, + 200001, + 'Chevrolet W Recessed (-0.25) FA Piston', + NULL, + 1 + ), + ( + 200051, + 200001, + 'Chevrolet BB Wedge Top FA Piston', + NULL, + 3 + ), + ( + 200052, + 200001, + 'Olds BB Wedge Top Piston', + NULL, + 2 + ), + ( + 200053, + 200001, + 'Chrysler Hemi Flat Top FA Piston', + NULL, + 2 + ), + ( + 200054, + 200001, + 'Ford SB Boss 302 FA Piston', + NULL, + 2 + ), + (200055, 200001, 'Cadillac L-Head Piston', NULL, 1), + ( + 200056, + 200001, + 'Buick Nailhead Recessed (-0.5) Piston', + NULL, + 1 + ), + ( + 200057, + 200001, + 'Buick Nailhead Flat Top (0.0) Piston', + NULL, + 1 + ), + ( + 200058, + 200001, + 'Buick Nailhead Wedge Top (0.5) Piston', + NULL, + 1 + ), + ( + 200059, + 200001, + 'Buick Nailhead Domed Top (1.0) Piston', + NULL, + 1 + ), + ( + 200060, + 200001, + 'JE Pistons Chrysler SB FT FA Piston', + NULL, + 1 + ), + ( + 200061, + 200001, + 'Ford Cleveland Block Stock Piston', + NULL, + 1 + ), + ( + 200062, + 200001, + 'Ford Cleveland Block FT FA Piston', + NULL, + 1 + ), + ( + 200063, + 200001, + 'Ford 385 Block Stock Piston', + NULL, + 1 + ), + ( + 200064, + 200001, + 'Ford 385 Block CJ Piston', + NULL, + 2 + ), + (200065, 200001, 'Ford Y Stock CA Piston', NULL, 1), + ( + 200066, + 200001, + 'Buick SB Wedge Top Piston', + NULL, + 2 + ), + ( + 200067, + 200001, + 'Cadillac L-Head FA Piston', + NULL, + 1 + ), + ( + 200068, + 200001, + 'Cadillac L-Head Wedge Top Piston', + NULL, + 2 + ), + ( + 200069, + 200001, + 'Cadillac BB Wedge Top Piston', + NULL, + 2 + ), + ( + 200070, + 200001, + 'Chrysler Hemi Wedge Top FA Piston', + NULL, + 3 + ), + ( + 200071, + 200001, + 'Chrysler Hemi Recessed Top FA Piston', + NULL, + 3 + ), + ( + 200072, + 200001, + 'Ford Flathead Wedge Top Piston', + NULL, + 2 + ), + ( + 200073, + 200001, + 'Ford Flathead Domed Top Piston', + NULL, + 2 + ), + ( + 200074, + 200001, + 'Oldsmobile SB Wedge Top Piston', + NULL, + 2 + ), + ( + 200075, + 200001, + 'Blinsky HiPo Adept Piston', + NULL, + 4 + ), + ( + 200076, + 200001, + 'Newcomb Y Block Wedge (.15)', + NULL, + 1 + ), + ( + 200077, + 200001, + 'Newcomb Y Block Wedge (.35)', + NULL, + 2 + ), + ( + 200078, + 200001, + 'Newcomb Y Block Wedge (.4)', + NULL, + 2 + ), + ( + 200079, + 200001, + 'Newcomb Y Block Wedge (.2)', + NULL, + 1 + ), + ( + 200080, + 200001, + 'Newcomb Y Block Wedge (.3)', + NULL, + 2 + ), + ( + 200081, + 200001, + 'Duro Rod Y Block Domed (.1)', + NULL, + 1 + ), + ( + 200082, + 200001, + 'Duro Rod Y Block Domed (.45)', + NULL, + 2 + ), + ( + 200083, + 200001, + 'Duro Rod Y Block Domed (.2)', + NULL, + 1 + ), + ( + 200084, + 200001, + 'Duro Rod Y Block Domed (.35)', + NULL, + 2 + ), + ( + 200085, + 200001, + 'Duro Rod Y Block Domed (.5)', + NULL, + 2 + ), + ( + 200086, + 200001, + 'C&B Chevy SB Domed (.1)', + NULL, + 1 + ), + ( + 200087, + 200001, + 'C&B Chevy SB Domed (.2)', + NULL, + 1 + ), + ( + 200088, + 200001, + 'C&B Chevy SB Domed (.3)', + NULL, + 1 + ), + ( + 200089, + 200001, + 'C&B Chevy SB Domed (.4)', + NULL, + 2 + ), + ( + 200090, + 200001, + 'C&B Chevy SB Domed (.5)', + NULL, + 2 + ), + ( + 200091, + 200001, + 'C&B Chevy SB Domed (.6)', + NULL, + 2 + ), + ( + 200092, + 200001, + 'C&B Chevy SB Domed (.75)', + NULL, + 3 + ), + (200093, 200001, 'JE Chevy SB Domed (.3)', NULL, 2), + (200094, 200001, 'JE Chevy SB Domed (.2)', NULL, 2), + ( + 200095, + 200001, + 'JE Chevy SB Wedge (.15)', + NULL, + 2 + ), + ( + 200096, + 200001, + 'JE Chevy SB Wedge (.35)', + NULL, + 2 + ), + (200097, 200001, 'JE Ford SB Domed (.3)', NULL, 2), + (200098, 200001, 'JE Ford SB Domed (.75)', NULL, 2), + (200099, 200001, 'JE Ford SB Wedge (.5)', NULL, 2), + (200100, 200001, 'JE Ford SB Wedge (.15)', NULL, 1), + ( + 200101, + 200001, + 'Duro Rod Ford SB Domed (.2)', + NULL, + 1 + ), + ( + 200102, + 200001, + 'Duro Rod Ford SB Domed (.35)', + NULL, + 2 + ), + ( + 200103, + 200001, + 'Duro Rod Ford SB Domed (.65)', + NULL, + 2 + ), + ( + 200104, + 200001, + 'Newcomb Ford SB Wedge (.3)', + NULL, + 2 + ), + ( + 200105, + 200001, + 'Newcomb Ford SB Wedge (.6)', + NULL, + 2 + ), + ( + 200106, + 200001, + 'Newcomb Ford SB Recessed (-.45)', + NULL, + 2 + ), + ( + 200107, + 200001, + 'Duro Rod Ford SB Recessed (-.15)', + NULL, + 1 + ), + ( + 200108, + 200001, + 'Newcomb Ford SB Recessed (-.25)', + NULL, + 1 + ), + (200109, 200001, 'JE Ford SB Wedge (.4)', NULL, 2), + ( + 200110, + 200001, + 'Duro Rod Buick Nailhead Domed (.3)', + NULL, + 2 + ), + ( + 200111, + 200001, + 'Duro Rod Buick Nailhead Domed (.5)', + NULL, + 2 + ), + ( + 200112, + 200001, + 'Newcomb Buick Nailhead Domed (.25)', + NULL, + 1 + ), + ( + 200113, + 200001, + 'Duro Rod Buick Nailhead Wedge (.25)', + NULL, + 1 + ), + ( + 200114, + 200001, + 'Newcomb Buick Nailhead Wedge (.35)', + NULL, + 2 + ), + ( + 200115, + 200001, + 'Duro Rod Buick Nailhead Wedge (.15)', + NULL, + 1 + ), + ( + 200116, + 200001, + 'Newcomb Buick Nailhead Recessed (-.2)', + NULL, + 1 + ), + ( + 200117, + 200001, + 'Duro Rod Buick Nailhead Recessed (-.1)', + NULL, + 1 + ), + ( + 200118, + 200001, + 'Newcomb Buick Nailhead Recessed (-.25)', + NULL, + 2 + ), + ( + 200119, + 200001, + 'Duro Rod Buick Nailhead Recessed (-.35)', + NULL, + 2 + ), + ( + 200120, + 200001, + 'Duro Rod Buick Nailhead Flat Top', + NULL, + 1 + ), + ( + 200121, + 200001, + 'Newcomb Buick Nailhead Flat Top', + NULL, + 2 + ), + ( + 200122, + 200001, + 'Newcomb Chrysler SB Recessed (-.75)', + NULL, + 2 + ), + ( + 200123, + 200001, + 'Newcomb Chrysler SB Recessed (-.5)', + NULL, + 2 + ), + ( + 200124, + 200001, + 'Newcomb Chrysler SB Recessed (-.25)', + NULL, + 1 + ), + ( + 200125, + 200001, + 'Duro Rod Chrysler SB Recessed (-.6)', + NULL, + 2 + ), + ( + 200126, + 200001, + 'Duro Rod Chrysler SB Recessed (-.3)', + NULL, + 1 + ), + ( + 200127, + 200001, + 'Duro Rod Chrysler SB Wedge (.3)', + NULL, + 1 + ), + ( + 200128, + 200001, + 'Duro Rod Chrysler SB Wedge (.5)', + NULL, + 2 + ), + ( + 200129, + 200001, + 'Duro Rod Chrysler SB Wedge (.75)', + NULL, + 2 + ), + ( + 200130, + 200001, + 'Newcomb Chrysler SB Wedge (.25)', + NULL, + 1 + ), + ( + 200131, + 200001, + 'Newcomb Chrysler SB Wedge (1.0)', + NULL, + 2 + ), + ( + 200132, + 200001, + 'Newcomb Chrysler SB Flat Top Lightweight', + NULL, + 2 + ), + ( + 200133, + 200001, + 'JE Pistons Chrysler SB Domed (.25)', + NULL, + 1 + ), + ( + 200134, + 200001, + 'JE Pistons Chrysler SB Domed (.75)', + NULL, + 2 + ), + ( + 200135, + 200001, + 'JE Pistons Chrysler SB Domed (1.0)', + NULL, + 3 + ), + ( + 200136, + 200001, + 'JE Pistons Chrysler SB Domed (1.25)', + NULL, + 4 + ), + ( + 200137, + 200001, + 'Newcomb Pontiac Recessed (-.25)', + NULL, + 1 + ), + ( + 200138, + 200001, + 'Newcomb Pontiac Recessed (-.5)', + NULL, + 2 + ), + ( + 200139, + 200001, + 'Newcomb Pontiac Recessed (-.75)', + NULL, + 2 + ), + ( + 200140, + 200001, + 'Duro Rod Pontiac Recessed (-.3)', + NULL, + 1 + ), + ( + 200141, + 200001, + 'Duro Rod Pontiac Recessed (-.6)', + NULL, + 2 + ), + ( + 200142, + 200001, + 'Duro Rod Pontiac Wedge (.2)', + NULL, + 1 + ), + ( + 200143, + 200001, + 'Duro Rod Pontiac Wedge (.6)', + NULL, + 2 + ), + ( + 200144, + 200001, + 'Duro Rod Pontiac Wedge (.8)', + NULL, + 3 + ), + ( + 200145, + 200001, + 'Newcomb Pontiac Wedge (.4)', + NULL, + 2 + ), + ( + 200146, + 200001, + 'Newcomb Pontiac Wedge (1.0)', + NULL, + 3 + ), + ( + 200147, + 200001, + 'JE Pistons Pontiac Domed (.25)', + NULL, + 1 + ), + ( + 200148, + 200001, + 'JE Pistons Pontiac Domed (.5)', + NULL, + 2 + ), + ( + 200149, + 200001, + 'JE Pistons Pontiac Domed (.75)', + NULL, + 2 + ), + ( + 200150, + 200001, + 'JE Pistons Pontiac Domed (1.0)', + NULL, + 3 + ), + ( + 200151, + 200001, + 'JE Pistons Pontiac Domed (1.25)', + NULL, + 4 + ), + ( + 200152, + 200001, + 'JE Chevy BB Recessed (-.15)', + NULL, + 1 + ), + ( + 200153, + 200001, + 'JE Chevy BB Recessed (-.25)', + NULL, + 1 + ), + ( + 200154, + 200001, + 'JE Chevy BB Recessed (-.35)', + NULL, + 2 + ), + ( + 200155, + 200001, + 'JE Chevy BB Recessed (-.5)', + NULL, + 2 + ), + ( + 200156, + 200001, + 'JE Chevy BB Recessed (-.75)', + NULL, + 3 + ), + ( + 200157, + 200001, + 'JE Chevy BB Wedge (.35)', + NULL, + 2 + ), + (200158, 200001, 'JE Chevy BB Wedge (.5)', NULL, 2), + ( + 200159, + 200001, + 'JE Chevy BB Wedge (.75)', + NULL, + 2 + ), + ( + 200160, + 200001, + 'JE Chevy BB Wedge (1.0)', + NULL, + 3 + ), + ( + 200161, + 200001, + 'JE Chevy BB Domed (.25)', + NULL, + 1 + ), + ( + 200162, + 200001, + 'JE Chevy BB Domed (.75)', + NULL, + 2 + ), + ( + 200163, + 200001, + 'JE Chevy BB Domed (1.0)', + NULL, + 3 + ), + ( + 200164, + 200001, + 'JE Chevy BB Domed (1.25)', + NULL, + 4 + ), + ( + 200165, + 200001, + 'Duro Rod Ford BB Recessed (-.3)', + NULL, + 2 + ), + ( + 200166, + 200001, + 'Duro Rod Ford BB Recessed (-.6)', + NULL, + 2 + ), + ( + 200167, + 200001, + 'Newcomb Ford BB Recessed (-.25)', + NULL, + 1 + ), + ( + 200168, + 200001, + 'Newcomb Ford BB Recessed (-.5)', + NULL, + 2 + ), + ( + 200169, + 200001, + 'Newcomb Ford BB Recessed (-.75)', + NULL, + 2 + ), + (200170, 200001, 'JE Ford BB Wedge (.15)', NULL, 1), + (200171, 200001, 'JE Ford BB Wedge (.25)', NULL, 2), + (200172, 200001, 'JE Ford BB Wedge (.5)', NULL, 2), + (200173, 200001, 'JE Ford BB Wedge (.75)', NULL, 2), + (200174, 200001, 'JE Ford BB Wedge (1.0)', NULL, 3), + (200175, 200001, 'JE Ford BB Domed (.25)', NULL, 2), + (200176, 200001, 'JE Ford BB Domed (.75)', NULL, 2), + (200177, 200001, 'JE Ford BB Domed (1.0)', NULL, 3), + ( + 200178, + 200001, + 'JE Ford BB Domed (1.25)', + NULL, + 4 + ), + ( + 200179, + 200001, + 'JE Chrysler BB Wedge (.15)', + NULL, + 1 + ), + ( + 200180, + 200001, + 'JE Chrysler BB Wedge (.5)', + NULL, + 2 + ), + ( + 200181, + 200001, + 'JE Chrysler BB Wedge (.75)', + NULL, + 2 + ), + ( + 200182, + 200001, + 'JE Chrysler BB Wedge (1.0)', + NULL, + 3 + ), + ( + 200183, + 200001, + 'JE Chrysler BB Domed (.25)', + NULL, + 2 + ), + ( + 200184, + 200001, + 'JE Chrysler BB Domed (.75)', + NULL, + 2 + ), + ( + 200185, + 200001, + 'JE Chrysler BB Domed (1.0)', + NULL, + 3 + ), + ( + 200186, + 200001, + 'JE Chrysler BB Domed (1.25)', + NULL, + 4 + ), + ( + 200187, + 200001, + 'Duro Rod Chrysler BB Recessed (-.3)', + NULL, + 2 + ), + ( + 200188, + 200001, + 'Duro Rod Chrysler BB Recessed (-.6)', + NULL, + 2 + ), + ( + 200189, + 200001, + 'Newcomb Chrysler BB Recessed (-.25)', + NULL, + 2 + ), + ( + 200190, + 200001, + 'Newcomb Chrysler BB Recessed (-.5)', + NULL, + 2 + ), + ( + 200191, + 200001, + 'Newcomb Chrysler BB Recessed (-.75)', + NULL, + 2 + ), + ( + 200192, + 200001, + 'Duro Rod Olds BB Recessed (-.3)', + NULL, + 2 + ), + ( + 200193, + 200001, + 'Duro Rod Olds BB Recessed (-.6)', + NULL, + 2 + ), + ( + 200194, + 200001, + 'Newcomb Olds BB Recessed (-.25)', + NULL, + 2 + ), + ( + 200195, + 200001, + 'Newcomb Olds BB Recessed (-.5)', + NULL, + 2 + ), + ( + 200196, + 200001, + 'Newcomb Olds BB Recessed (-.75)', + NULL, + 2 + ), + (200197, 200001, 'JE Olds BB Wedge (.15)', NULL, 1), + (200198, 200001, 'JE Olds BB Wedge (.5)', NULL, 2), + (200199, 200001, 'JE Olds BB Wedge (.75)', NULL, 2), + (200200, 200001, 'JE Olds BB Wedge (1.0)', NULL, 3), + (200201, 200001, 'JE Olds BB Domed (.25)', NULL, 2), + (200202, 200001, 'JE Olds BB Domed (.75)', NULL, 2), + (200203, 200001, 'JE Olds BB Domed (1.0)', NULL, 3), + ( + 200204, + 200001, + 'JE Olds BB Domed (1.25)', + NULL, + 4 + ), + ( + 200205, + 200001, + 'Duro Rod AMC Recessed (-.3)', + NULL, + 2 + ), + ( + 200206, + 200001, + 'Duro Rod AMC Recessed (-.6)', + NULL, + 2 + ), + ( + 200207, + 200001, + 'Newcomb AMC Recessed (-.25)', + NULL, + 2 + ), + ( + 200208, + 200001, + 'Newcomb AMC Recessed (-.5)', + NULL, + 2 + ), + ( + 200209, + 200001, + 'Newcomb AMC Recessed (-.75)', + NULL, + 2 + ), + (200210, 200001, 'JE AMC Wedge (.15)', NULL, 1), + (200211, 200001, 'JE AMC Wedge (.25)', NULL, 2), + (200212, 200001, 'JE AMC Wedge (.5)', NULL, 2), + (200213, 200001, 'JE AMC Wedge (.75)', NULL, 2), + (200214, 200001, 'JE AMC Wedge (1.0)', NULL, 3), + (200215, 200001, 'JE AMC Domed (.25)', NULL, 2), + (200216, 200001, 'JE AMC Domed (.5)', NULL, 2), + (200217, 200001, 'JE AMC Domed (.75)', NULL, 2), + (200218, 200001, 'JE AMC Domed (1.0)', NULL, 3), + (200219, 200001, 'JE AMC Domed (1.25)', NULL, 4), + ( + 200220, + 200001, + 'Newcomb Chevy W Recessed (-.5)', + NULL, + 2 + ), + ( + 200221, + 200001, + 'Duro Rod Chevy W Recessed (-.3)', + NULL, + 2 + ), + ( + 200222, + 200001, + 'Duro Rod Chevy W Recessed (-.6)', + NULL, + 2 + ), + (200223, 200001, 'JE Chevy W Wedge (.15)', NULL, 1), + (200224, 200001, 'JE Chevy W Wedge (.25)', NULL, 2), + (200225, 200001, 'JE Chevy W Wedge (.5)', NULL, 2), + (200226, 200001, 'JE Chevy W Wedge (.75)', NULL, 2), + (200227, 200001, 'JE Chevy W Wedge (1.0)', NULL, 3), + (200228, 200001, 'JE Chevy W Domed (.25)', NULL, 2), + (200229, 200001, 'JE Chevy W Domed (.5)', NULL, 2), + ( + 200230, + 200001, + 'JE Chevy W Domed (1.25)', + NULL, + 4 + ), + ( + 200231, + 200001, + 'Newcomb Cadillac BB Recessed (-.25)', + NULL, + 2 + ), + ( + 200232, + 200001, + 'Newcomb Cadillac BB Recessed (-.5)', + NULL, + 2 + ), + ( + 200233, + 200001, + 'Newcomb Cadillac BB Recessed (-.75)', + NULL, + 2 + ), + ( + 200234, + 200001, + 'Duro Rod Cadillac BB Recessed (-.3)', + NULL, + 2 + ), + ( + 200235, + 200001, + 'Duro Rod Cadillac BB Recessed (-.6)', + NULL, + 2 + ), + ( + 200236, + 200001, + 'JE Cadillac BB Domed (.25)', + NULL, + 2 + ), + ( + 200237, + 200001, + 'JE Cadillac BB Domed (.5)', + NULL, + 2 + ), + ( + 200238, + 200001, + 'JE Cadillac BB Domed (.75)', + NULL, + 2 + ), + ( + 200239, + 200001, + 'JE Cadillac BB Domed (1.0)', + NULL, + 3 + ), + ( + 200240, + 200001, + 'JE Cadillac BB Domed (1.25)', + NULL, + 4 + ), + ( + 200241, + 200001, + 'JE Cadillac BB Wedge (.15)', + NULL, + 1 + ), + ( + 200242, + 200001, + 'JE Cadillac BB Wedge (.25)', + NULL, + 2 + ), + ( + 200243, + 200001, + 'JE Cadillac BB Wedge (.5)', + NULL, + 2 + ), + ( + 200244, + 200001, + 'JE Cadillac BB Wedge (.75)', + NULL, + 2 + ), + ( + 200245, + 200001, + 'JE Cadillac BB Wedge (1.0)', + NULL, + 3 + ), + ( + 200246, + 200001, + 'Newcomb Hemi Recessed (-.25)', + NULL, + 2 + ), + ( + 200247, + 200001, + 'Newcomb Hemi Recessed (-.5)', + NULL, + 2 + ), + ( + 200248, + 200001, + 'Newcomb Hemi Recessed (-.75)', + NULL, + 2 + ), + ( + 200249, + 200001, + 'Duro Rod Hemi Recessed (-.3)', + NULL, + 2 + ), + ( + 200250, + 200001, + 'Duro Rod Hemi Recessed (-.6)', + NULL, + 2 + ), + (200251, 200001, 'JE Hemi Domed (.25)', NULL, 2), + (200252, 200001, 'JE Hemi Domed (.5)', NULL, 2), + (200253, 200001, 'JE Hemi Domed (.75)', NULL, 2), + (200254, 200001, 'JE Hemi Domed (1.0)', NULL, 3), + (200255, 200001, 'JE Hemi Domed (1.25)', NULL, 4), + (200256, 200001, 'JE Hemi Wedge (.15)', NULL, 1), + (200257, 200001, 'JE Hemi Wedge (.25)', NULL, 2), + (200258, 200001, 'JE Hemi Wedge (.5)', NULL, 2), + (200259, 200001, 'JE Hemi Wedge (.75)', NULL, 2), + (200260, 200001, 'JE Hemi Wedge (1.0)', NULL, 3), + ( + 200261, + 200001, + 'Newcomb Ford 385 Recessed (-.25)', + NULL, + 2 + ), + ( + 200262, + 200001, + 'Newcomb Ford 385 Recessed (-.5)', + NULL, + 2 + ), + ( + 200263, + 200001, + 'Newcomb Ford 385 Recessed (-.75)', + NULL, + 2 + ), + ( + 200264, + 200001, + 'Duro Rod Ford 385 Recessed (-.3)', + NULL, + 2 + ), + ( + 200265, + 200001, + 'Duro Rod Ford 385 Recessed (-.6)', + NULL, + 2 + ), + ( + 200266, + 200001, + 'JE Ford 385 Domed (.25)', + NULL, + 2 + ), + (200267, 200001, 'JE Ford 385 Domed (.5)', NULL, 2), + ( + 200268, + 200001, + 'JE Ford 385 Domed (.75)', + NULL, + 2 + ), + ( + 200269, + 200001, + 'JE Ford 385 Domed (1.0)', + NULL, + 3 + ), + ( + 200270, + 200001, + 'JE Ford 385 Domed (1.25)', + NULL, + 4 + ), + ( + 200271, + 200001, + 'JE Ford 385 Wedge (.15)', + NULL, + 1 + ), + ( + 200272, + 200001, + 'JE Ford 385 Wedge (.25)', + NULL, + 2 + ), + (200273, 200001, 'JE Ford 385 Wedge (.5)', NULL, 2), + ( + 200274, + 200001, + 'JE Ford 385 Wedge (.75)', + NULL, + 2 + ), + ( + 200275, + 200001, + 'JE Ford 385 Wedge (1.0)', + NULL, + 3 + ), + ( + 200276, + 200001, + 'Newcomb Cleveland Recessed (-.25)', + NULL, + 2 + ), + ( + 200277, + 200001, + 'Newcomb Cleveland Recessed (-.5)', + NULL, + 2 + ), + ( + 200278, + 200001, + 'Newcomb Cleveland Recessed (-.75)', + NULL, + 2 + ), + ( + 200279, + 200001, + 'Duro Rod Cleveland Recessed (-.3)', + NULL, + 2 + ), + ( + 200280, + 200001, + 'Duro Rod Cleveland Recessed (-.6)', + NULL, + 2 + ), + ( + 200281, + 200001, + 'JE Cleveland Domed (.25)', + NULL, + 2 + ), + ( + 200282, + 200001, + 'JE Cleveland Domed (.5)', + NULL, + 2 + ), + ( + 200283, + 200001, + 'JE Cleveland Domed (.75)', + NULL, + 2 + ), + ( + 200284, + 200001, + 'JE Cleveland Domed (1.0)', + NULL, + 3 + ), + ( + 200285, + 200001, + 'JE Cleveland Domed (1.25)', + NULL, + 4 + ), + ( + 200286, + 200001, + 'JE Cleveland Wedge (.15)', + NULL, + 1 + ), + ( + 200287, + 200001, + 'JE Cleveland Wedge (.25)', + NULL, + 2 + ), + ( + 200288, + 200001, + 'JE Cleveland Wedge (.5)', + NULL, + 2 + ), + ( + 200289, + 200001, + 'JE Cleveland Wedge (.75)', + NULL, + 2 + ), + ( + 200290, + 200001, + 'JE Cleveland Wedge (1.0)', + NULL, + 3 + ), + ( + 230001, + 230001, + 'Normal Duty Cooling System', + NULL, + 1 + ), + ( + 230002, + 230001, + 'Light Duty Cooling System', + NULL, + 1 + ), + ( + 230003, + 230001, + 'Heavy Duty Cooling System', + NULL, + 3 + ), + ( + 230004, + 230001, + 'Extra Heavy Duty Cooling System', + NULL, + 4 + ), + ( + 230005, + 230001, + 'Ford BB Boss XHD Cooling System', + NULL, + 4 + ), + ( + 230006, + 230001, + 'Edelbrock Victor Series Cooling System', + NULL, + 2 + ), + (230007, 230001, 'Chevy SB Standard', NULL, 1), + (230008, 230001, 'Chevy SB Heavy Duty', NULL, 2), + (230009, 230001, 'Chevy W Standard', NULL, 1), + (230010, 230001, 'Chevy W Heavy Duty', NULL, 2), + (230011, 230001, 'Chevy BB Standard', NULL, 1), + (230012, 230001, 'Chevy BB Heavy Duty', NULL, 2), + (230013, 230001, 'Chrysler SB Standard', NULL, 1), + (230014, 230001, 'Chrysler SB Heavy Duty', NULL, 2), + ( + 230015, + 230001, + 'Chrysler SB Performance', + NULL, + 3 + ), + (230016, 230001, 'Chrysler BB Standard', NULL, 1), + (230017, 230001, 'Chrysler BB Heavy Duty', NULL, 2), + ( + 230018, + 230001, + 'Chrysler BB Performance', + NULL, + 3 + ), + ( + 230019, + 230001, + 'Cadillac L-Head Standard', + NULL, + 1 + ), + (230020, 230001, 'AMC Standard', NULL, 1), + (230021, 230001, 'AMC Heavy Duty', NULL, 2), + (230022, 230001, 'Cadillac BB Standard', NULL, 1), + (230023, 230001, 'Cadillac BB Heavy Duty', NULL, 2), + (230024, 230001, 'Pontiac Standard', NULL, 1), + (230025, 230001, 'Pontiac Performance', NULL, 2), + (230026, 230001, 'Olds BB Standard', NULL, 1), + (230027, 230001, 'Olds BB Heavy Duty', NULL, 2), + ( + 230028, + 230001, + 'Buick Nailhead Standard', + NULL, + 1 + ), + ( + 230029, + 230001, + 'Buick Nailhead Heavy Duty', + NULL, + 2 + ), + (230030, 230001, 'Ford Flathead Standard', NULL, 1), + (230031, 230001, 'Ford Y Block Standard', NULL, 1), + ( + 230032, + 230001, + 'Ford Y Block Heavy Duty', + NULL, + 2 + ), + (230033, 230001, 'Ford SB Standard', NULL, 1), + (230034, 230001, 'Ford SB Heavy Duty', NULL, 2), + (230035, 230001, 'Ford SB Boss', NULL, 3), + (230036, 230001, 'Ford BB Standard', NULL, 1), + (230037, 230001, 'Ford BB Heavy Duty', NULL, 2), + ( + 240001, + 240001, + 'Marinn Normal Duty Electrical System', + NULL, + 1 + ), + ( + 240002, + 240001, + 'Ford Boss Electronic Ignition', + NULL, + 3 + ), + ( + 240003, + 240001, + 'Mallory Light Duty Electrical System', + NULL, + 1 + ), + ( + 240004, + 240001, + 'AMC Group 19 Electrical System', + NULL, + 2 + ), + ( + 240005, + 240001, + 'Accel Billetproof Breakerless', + NULL, + 2 + ), + ( + 240006, + 240001, + 'Accel Blueprint Electronic Ignition', + NULL, + 2 + ), + ( + 240007, + 240001, + 'Crane Fireball XR700 Ignition System', + NULL, + 3 + ), + ( + 240008, + 240001, + 'Crane Fireball XR3000 Ignition System', + NULL, + 4 + ), + ( + 240009, + 240001, + 'Holley Avenger Ignition', + NULL, + 3 + ), + ( + 240010, + 240001, + 'Holley Dominator Ignition', + NULL, + 3 + ), + ( + 240011, + 240001, + 'Holley Excelerator Ignition', + NULL, + 3 + ), + ( + 240012, + 240001, + 'GM Standard Single Point', + NULL, + 1 + ), + ( + 240013, + 240001, + 'GM Performance Single Point', + NULL, + 2 + ), + (240014, 240001, 'GM Standard Dual Point', NULL, 1), + ( + 240015, + 240001, + 'GM Performance Dual Point', + NULL, + 2 + ), + (240016, 240001, 'GM Standard Electronic', NULL, 2), + ( + 240017, + 240001, + 'GM Performance Electronic', + NULL, + 2 + ), + ( + 240018, + 240001, + 'Chrysler Standard Single Point', + NULL, + 1 + ), + ( + 240019, + 240001, + 'Chrysler Performance Single Point', + NULL, + 2 + ), + ( + 240020, + 240001, + 'Chrysler Standard Dual Point', + NULL, + 1 + ), + ( + 240021, + 240001, + 'Chrysler Performance Dual Point', + NULL, + 2 + ), + ( + 240022, + 240001, + 'Chrysler Standard Electronic', + NULL, + 2 + ), + ( + 240023, + 240001, + 'Chrysler Performance Electronic', + NULL, + 2 + ), + ( + 240024, + 240001, + 'Ford Standard Single Point', + NULL, + 1 + ), + ( + 240025, + 240001, + 'Ford Performance Single Point', + NULL, + 2 + ), + ( + 240026, + 240001, + 'Ford Standard Dual Point', + NULL, + 1 + ), + ( + 240027, + 240001, + 'Ford Performance Dual Point', + NULL, + 2 + ), + ( + 240028, + 240001, + 'Ford Standard Electronic', + NULL, + 2 + ), + ( + 240029, + 240001, + 'Ford Performance Electronic', + NULL, + 2 + ), + ( + 240030, + 240001, + 'AMC Standard Single Point', + NULL, + 1 + ), + ( + 240031, + 240001, + 'AMC Performance Single Point', + NULL, + 2 + ), + ( + 240032, + 240001, + 'AMC Standard Dual Point', + NULL, + 1 + ), + ( + 240033, + 240001, + 'AMC Performance Dual Point', + NULL, + 2 + ), + ( + 250001, + 250001, + 'Ford SB Stock Lubrication System', + NULL, + 1 + ), + ( + 250002, + 250001, + 'Chevy BB Stock Lubrication System', + NULL, + 1 + ), + ( + 250003, + 250001, + 'AMC Stock Lubrication System', + NULL, + 1 + ), + ( + 250004, + 250001, + 'GM Z11 Lubrication System', + NULL, + 3 + ), + ( + 250005, + 250001, + 'Ford BB Boss Lubrication System', + NULL, + 3 + ), + ( + 250006, + 250001, + 'Bully HD Lubrication System', + NULL, + 2 + ), + ( + 250007, + 250001, + 'Bully XHD Lubrication System', + NULL, + 3 + ), + ( + 250008, + 250001, + 'Ford Cobra Lubrication System', + NULL, + 3 + ), + ( + 250009, + 250001, + 'Chevy SB Stock Lubrication System', + NULL, + 1 + ), + ( + 250010, + 250001, + 'Chevy SB Performance Lubrication System', + NULL, + 2 + ), + ( + 250011, + 250001, + 'Chevy BB Performance Lubrication System', + NULL, + 2 + ), + ( + 250012, + 250001, + 'Chrysler SB Stock Lubrication System', + NULL, + 1 + ), + ( + 250013, + 250001, + 'Chrysler BB Stock Lubrication System', + NULL, + 1 + ), + ( + 250014, + 250001, + 'Chrysler BB Performance Lubrication System', + NULL, + 2 + ), + ( + 250015, + 250001, + 'Cadillac BB Stock Lubrication System', + NULL, + 1 + ), + ( + 250016, + 250001, + 'Cadillac L-Head Stock Lubrication System', + NULL, + 1 + ), + ( + 250017, + 250001, + 'Pontiac Stock Lubrication System', + NULL, + 1 + ), + ( + 250018, + 250001, + 'Pontiac Performance Lubrication System', + NULL, + 2 + ), + ( + 250019, + 250001, + 'Olds BB Stock Lubrication System', + NULL, + 1 + ), + ( + 250020, + 250001, + 'Olds BB Performance Lubrication System', + NULL, + 2 + ), + ( + 250021, + 250001, + 'Buick Nailhead Stock Lubrication System', + NULL, + 1 + ), + ( + 250022, + 250001, + 'Ford Flathead Stock Lubrication System', + NULL, + 1 + ), + ( + 250023, + 250001, + 'Ford Y Block Stock Lubrication System', + NULL, + 1 + ), + ( + 250024, + 250001, + 'Ford SB Boss Lubrication System', + NULL, + 3 + ), + ( + 250025, + 250001, + 'Ford SB Windsor Stock Lubrication System', + NULL, + 1 + ), + ( + 250026, + 250001, + 'Ford Cleveland Stock Lubrication System', + NULL, + 1 + ), + ( + 250027, + 250001, + 'Ford BB Stock Lubrication System', + NULL, + 1 + ), + ( + 250028, + 250001, + 'Ford BB Performance Lubrication System', + NULL, + 2 + ), + ( + 250029, + 250001, + 'Ford 385 Stock Lubrication System', + NULL, + 1 + ), + ( + 250030, + 250001, + 'Ford 385 Performance Lubrication System', + NULL, + 2 + ), + ( + 280001, + 280001, + 'Ford BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280002, + 280001, + 'Chevrolet BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280003, + 280001, + 'Chrysler SB Stock Exhaust Manifold', + NULL, + 1 + ), + (280004, 280001, 'Ford 385 Boss Dual EM', NULL, 2), + (280005, 280001, 'Chevrolet BB HP EM', NULL, 2), + (280006, 280001, 'Chevrolet W Z11 HP EM', NULL, 2), + ( + 280007, + 280001, + 'Hooker Street Rodder Chevrolet SB Headers', + NULL, + 3 + ), + ( + 280008, + 280001, + 'Ford BB Cobrajet Dual EM', + NULL, + 2 + ), + ( + 280009, + 280001, + 'Ford BB Tri-Y Steel Tube Headers', + NULL, + 3 + ), + ( + 280010, + 280001, + 'Chrysler BB Max Wedge Exhaust Manifold', + NULL, + 2 + ), + ( + 280011, + 280001, + 'AMC Rebel Machine Dual EM', + NULL, + 2 + ), + ( + 280012, + 280001, + 'Edelbrock TES Chevrolet BB Exhaust Headers', + NULL, + 3 + ), + ( + 280013, + 280001, + 'Buick BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280014, + 280001, + 'Buick SB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280015, + 280001, + 'Cadillac BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280016, + 280001, + 'Chevrolet SB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280017, + 280001, + 'Chrysler BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280018, + 280001, + 'Ford SB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280019, + 280001, + 'Ford Flathead Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280020, + 280001, + 'Olds BB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280021, + 280001, + 'Olds SB Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280022, + 280001, + 'AMC Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280023, + 280001, + 'Pontiac Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280024, + 280001, + 'Chevrolet SB Ram''s Horn EM', + NULL, + 1 + ), + (280025, 280001, 'Buick BB Stage I EM', NULL, 2), + ( + 280026, + 280001, + 'Buick BB Mickey Thompson Headers', + NULL, + 3 + ), + (280027, 280001, 'Olds BB Divider EM', NULL, 1), + (280028, 280001, 'Pontiac Ram Air I EM', NULL, 2), + (280029, 280001, 'Pontiac HP EM', NULL, 2), + (280030, 280001, 'Ford Y 1957 Manifold', NULL, 1), + (280031, 280001, 'Ford BB CJ/SCJ HP EM', NULL, 2), + (280032, 280001, 'Ford 385 NASCAR EM', NULL, 3), + ( + 280033, + 280001, + 'Chrysler BB Max Wedge I Headers', + NULL, + 3 + ), + ( + 280034, + 280001, + 'Chrysler BB 440 Stock EM', + NULL, + 1 + ), + ( + 280035, + 280001, + 'Chrysler BB Tri-Y Max Wedge EM', + NULL, + 2 + ), + (280036, 280001, 'Chrysler BB HP EM', NULL, 2), + ( + 280037, + 280001, + 'Chrysler SB Improved Flow EM', + NULL, + 2 + ), + ( + 280038, + 280001, + 'Chevrolet SB HP Exhaust Manifold', + NULL, + 2 + ), + (280039, 280001, 'Pontiac Trophy EM', NULL, 2), + (280040, 280001, 'Ford SB Boss 302 EM', NULL, 2), + ( + 280041, + 280001, + 'Chrysler Hemi Exhaust Manifold', + NULL, + 2 + ), + ( + 280042, + 280001, + 'Shade Tree Chrysler Hemi Exhaust Manifold', + NULL, + 1 + ), + ( + 280043, + 280001, + 'Cadillac L-Head Exhaust Manifold', + NULL, + 1 + ), + ( + 280044, + 280001, + 'Buick Nailhead Stock Exhaust Manifold', + NULL, + 1 + ), + ( + 280045, + 280001, + 'Ford Cleveland Block Stock EM', + NULL, + 1 + ), + ( + 280046, + 280001, + 'Ford 385 Block Stock EM', + NULL, + 1 + ), + ( + 280047, + 280001, + 'Ford 385 Block CJ/SCJ EM', + NULL, + 2 + ), + (280048, 280001, 'Ford SB HP EM', NULL, 2), + (280049, 280001, 'Ford Y Stock EM', NULL, 1), + (280050, 280001, 'Chevrolet W Stock EM', NULL, 1), + (280051, 280001, 'Chevrolet W HP EM', NULL, 2), + ( + 280052, + 280001, + 'Ford Cleveland Block HP EM', + NULL, + 2 + ), + ( + 280053, + 280001, + 'Buick Nailhead Performance EM', + NULL, + 2 + ), + ( + 280054, + 280001, + 'Cadillac L-Head Performance EM', + NULL, + 2 + ), + ( + 280055, + 280001, + 'Buick SB Performance EM', + NULL, + 2 + ), + (280056, 280001, 'Buick SB Headers', NULL, 2), + ( + 280057, + 280001, + 'Cadillac Performance EM', + NULL, + 2 + ), + ( + 280058, + 280001, + 'Ford Flathead Performance EM', + NULL, + 2 + ), + (280059, 280001, 'Olds SB Performance EM', NULL, 2), + ( + 280060, + 280001, + 'Edelbrock TES Pontiac Exhaust Headers', + NULL, + 3 + ), + ( + 280061, + 280001, + 'Edelbrock TES Chevrolet W Exhaust Headers', + NULL, + 3 + ), + ( + 280062, + 280001, + 'Edelbrock TES Ford 385 Exhaust Headers', + NULL, + 3 + ), + (280063, 280001, 'AMC Small Tube Headers', NULL, 3), + ( + 280064, + 280001, + 'Buick Nailhead Small Tube Headers', + NULL, + 3 + ), + ( + 280065, + 280001, + 'Cadillac L-Head Small Tube Headers', + NULL, + 3 + ), + ( + 280066, + 280001, + 'Cadillac Small Tube Headers', + NULL, + 3 + ), + ( + 280067, + 280001, + 'Chevy SB Small Tube Headers', + NULL, + 3 + ), + ( + 280068, + 280001, + 'Chrysler SB Small Tube Headers', + NULL, + 3 + ), + ( + 280069, + 280001, + 'Ford Flathead Small Tube Headers', + NULL, + 3 + ), + ( + 280070, + 280001, + 'Ford SB Small Tube Headers', + NULL, + 3 + ), + ( + 280071, + 280001, + 'Ford Y Block Small Tube Headers', + NULL, + 3 + ), + ( + 280072, + 280001, + 'Ford Cleveland Block Small Tube Headers', + NULL, + 3 + ), + ( + 280073, + 280001, + 'Oldsmobile SB Small Tube Headers', + NULL, + 3 + ), + ( + 280074, + 280001, + 'Oldsmobile BB Small Tube Headers', + NULL, + 3 + ), + ( + 280075, + 280001, + 'Chrysler Hemi Small Tube Headers', + NULL, + 3 + ), + ( + 280076, + 280001, + 'Ford Y Block Factory Headers', + NULL, + 2 + ), + ( + 280077, + 280001, + 'Oldfield Y Block Free Flow EM', + NULL, + 1 + ), + ( + 280078, + 280001, + 'Oldfield Y Block Free Flow Aluminum EM', + NULL, + 1 + ), + ( + 280079, + 280001, + 'Oldfield Y Block Street King Headers', + NULL, + 3 + ), + ( + 280080, + 280001, + 'Oldfield Y Block Strip King Headers', + NULL, + 3 + ), + ( + 280081, + 280001, + 'Oldfield Y Block Track King Headers', + NULL, + 3 + ), + ( + 280082, + 280001, + 'Quaker Y Block Air Stream EM', + NULL, + 1 + ), + ( + 280083, + 280001, + 'Quaker Y Block Air Stream Aluminum EM', + NULL, + 1 + ), + ( + 280084, + 280001, + 'Quaker Y Block Super Stream Headers', + NULL, + 3 + ), + ( + 280085, + 280001, + 'Rad Rat Chevy SB Window Rattler Headers', + NULL, + 3 + ), + ( + 280086, + 280001, + 'Rad Rat Chevy SB Street Lion Headers', + NULL, + 3 + ), + ( + 280087, + 280001, + 'Rad Rat Chevy SB Rumble Pipe Headers', + NULL, + 3 + ), + ( + 280088, + 280001, + 'C&B Chevy SB Masterpiece EM', + NULL, + 2 + ), + ( + 280089, + 280001, + 'C&B Chevy SB Blueprint EM', + NULL, + 1 + ), + ( + 280090, + 280001, + 'C&B Chevy SB Beach Racer Headers', + NULL, + 3 + ), + ( + 280091, + 280001, + 'Rad Rat Chevy SB Street Mod EM', + NULL, + 1 + ), + ( + 280092, + 280001, + 'Quaker Ford SB Interceptor EM', + NULL, + 2 + ), + ( + 280093, + 280001, + 'Quaker Ford SB Super Stream Headers', + NULL, + 3 + ), + ( + 280094, + 280001, + 'Oldfield Ford SB Police Special EM', + NULL, + 2 + ), + ( + 280095, + 280001, + 'Dunbar Buick Nailhead Performance EM', + NULL, + 2 + ), + ( + 280096, + 280001, + 'Dunbar Buick Nailhead Lightweight EM', + NULL, + 1 + ), + ( + 280097, + 280001, + 'Dunbar Buick Nailhead Performance Headers', + NULL, + 2 + ), + ( + 280098, + 280001, + 'Dunbar Buick Nailhead Street Headers', + NULL, + 2 + ), + ( + 280099, + 280001, + 'Quaker Chrysler SB Airstream EM', + NULL, + 1 + ), + ( + 280100, + 280001, + 'Quaker Chrysler SB Double Demon HP EM', + NULL, + 2 + ), + ( + 280101, + 280001, + 'Quaker Chrysler SB Super Stream Headers', + NULL, + 4 + ), + ( + 280102, + 280001, + 'Walter Chrysler SB LA Street EM', + NULL, + 2 + ), + ( + 280103, + 280001, + 'Walter Chrysler SB Performance LA HP EM', + NULL, + 2 + ), + ( + 280104, + 280001, + 'Walter Chrysler SB LA Sm. Headers', + NULL, + 3 + ), + ( + 280105, + 280001, + 'Walter Chrysler SB Super LA Lg. Headers', + NULL, + 4 + ), + ( + 280106, + 280001, + 'Quaker Pontiac Airstream EM', + NULL, + 1 + ), + ( + 280107, + 280001, + 'Quaker Pontiac Aluminum Airstream EM', + NULL, + 1 + ), + ( + 280108, + 280001, + 'Quaker Pontiac Jet Stream Headers', + NULL, + 3 + ), + ( + 280109, + 280001, + 'Quaker Pontiac Super Stream Headers', + NULL, + 4 + ), + ( + 280110, + 280001, + 'Quaker Cleveland Air Stream EM', + NULL, + 1 + ), + ( + 280111, + 280001, + 'Quaker Cleveland Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280112, + 280001, + 'Quaker Cleveland Interceptor EM', + NULL, + 2 + ), + ( + 280113, + 280001, + 'Oldfield Cleveland Street King EM', + NULL, + 2 + ), + ( + 280114, + 280001, + 'Quaker Cleveland Super Stream Headers', + NULL, + 4 + ), + ( + 280115, + 280001, + 'Oldfield Cleveland Track King Headers', + NULL, + 4 + ), + ( + 280116, + 280001, + 'Oldfield Cleveland Strip King Headers', + NULL, + 3 + ), + ( + 280117, + 280001, + 'Oldfield Ford 385 Strip King Headers', + NULL, + 3 + ), + ( + 280118, + 280001, + 'Oldfield Ford 385 Track King Headers', + NULL, + 4 + ), + ( + 280119, + 280001, + 'Oldfield Ford 385 Street King EM', + NULL, + 2 + ), + ( + 280120, + 280001, + 'Quaker Ford 385 Air Stream EM', + NULL, + 1 + ), + ( + 280121, + 280001, + 'Quaker Ford 385 Interceptor EM', + NULL, + 2 + ), + ( + 280122, + 280001, + 'Quaker Ford 385 Jet Stream Headers', + NULL, + 3 + ), + ( + 280123, + 280001, + 'Quaker Ford 385 Super Stream Headers', + NULL, + 4 + ), + ( + 280124, + 280001, + 'Quaker Hemi Air Stream EM', + NULL, + 1 + ), + ( + 280125, + 280001, + 'Quaker Hemi Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280126, + 280001, + 'Quaker Hemi Super Stream Headers', + NULL, + 4 + ), + (280127, 280001, 'Walter Hemi Street EM', NULL, 1), + ( + 280128, + 280001, + 'Walter Hemi Performance EM', + NULL, + 2 + ), + ( + 280129, + 280001, + 'Walter Hemi Hemi Headers', + NULL, + 3 + ), + ( + 280130, + 280001, + 'Walter Hemi Super Hemi Headers', + NULL, + 4 + ), + ( + 280131, + 280001, + 'Quaker Cadillac BB Air Stream EM', + NULL, + 1 + ), + ( + 280132, + 280001, + 'Quaker Cadillac BB Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280133, + 280001, + 'Quaker Cadillac BB Interceptor EM', + NULL, + 2 + ), + ( + 280134, + 280001, + 'Quaker Cadillac BB Super Stream Headers', + NULL, + 4 + ), + ( + 280135, + 280001, + 'Leland Cadillac BB Street Headers', + NULL, + 3 + ), + ( + 280136, + 280001, + 'Leland Cadillac BB Rad Cad Headers', + NULL, + 4 + ), + ( + 280137, + 280001, + 'Leland Cadillac BB HP EM', + NULL, + 3 + ), + ( + 280138, + 280001, + 'Rad Rat Chevy W Street Mod EM', + NULL, + 2 + ), + ( + 280139, + 280001, + 'Rad Rat Chevy W Rumble Pipe Headers', + NULL, + 2 + ), + ( + 280140, + 280001, + 'Rad Rat Chevy W Street Lion Headers', + NULL, + 3 + ), + ( + 280141, + 280001, + 'Rad Rat Chevy W Window Rattler Headers', + NULL, + 4 + ), + ( + 280142, + 280001, + 'Quaker Chevy W Air Stream EM', + NULL, + 1 + ), + ( + 280143, + 280001, + 'Quaker Chevy W Interceptor EM', + NULL, + 2 + ), + ( + 280144, + 280001, + 'Quaker Chevy W Jet Stream Headers', + NULL, + 3 + ), + ( + 280145, + 280001, + 'Quaker Chevy W Super Stream Headers', + NULL, + 4 + ), + ( + 280146, + 280001, + 'Quaker AMC Air Stream EM', + NULL, + 1 + ), + ( + 280147, + 280001, + 'Quaker AMC Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280148, + 280001, + 'Quaker AMC Interceptor EM', + NULL, + 2 + ), + ( + 280149, + 280001, + 'Quaker AMC Super Stream Headers', + NULL, + 4 + ), + ( + 280150, + 280001, + 'Street Shark AMC Stalker EM', + NULL, + 2 + ), + ( + 280151, + 280001, + 'Street Shark AMC Hunter Headers', + NULL, + 3 + ), + ( + 280152, + 280001, + 'Street Shark AMC Predator Headers', + NULL, + 4 + ), + ( + 280153, + 280001, + 'Quaker Olds BB Air Stream EM', + NULL, + 1 + ), + ( + 280154, + 280001, + 'Quaker Olds BB Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280155, + 280001, + 'Quaker Olds BB Interceptor EM', + NULL, + 2 + ), + ( + 280156, + 280001, + 'Quaker Olds BB Super Stream Headers', + NULL, + 4 + ), + ( + 280157, + 280001, + 'Street Shark Olds BB Stalker EM', + NULL, + 2 + ), + ( + 280158, + 280001, + 'Street Shark Olds BB Hunter Headers', + NULL, + 3 + ), + ( + 280159, + 280001, + 'Street Shark Olds BB Predator Headers', + NULL, + 4 + ), + ( + 280160, + 280001, + 'Quaker Chrysler BB Air Stream EM', + NULL, + 1 + ), + ( + 280161, + 280001, + 'Quaker Chrysler BB Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280162, + 280001, + 'Quaker Chrysler BB Interceptor EM', + NULL, + 2 + ), + ( + 280163, + 280001, + 'Quaker Chrysler BB Jet Stream Headers', + NULL, + 3 + ), + ( + 280164, + 280001, + 'Quaker Chrysler BB Super Stream Headers', + NULL, + 4 + ), + ( + 280165, + 280001, + 'Street Shark Chrysler BB Stalker EM', + NULL, + 2 + ), + ( + 280166, + 280001, + 'Street Shark Chrylser BB Hunter Headers', + NULL, + 3 + ), + ( + 280167, + 280001, + 'Street Shark Chrysler BB Predator Headers', + NULL, + 4 + ), + ( + 280168, + 280001, + 'Quaker Ford BB Air Stream EM', + NULL, + 1 + ), + ( + 280169, + 280001, + 'Quaker Ford BB Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280170, + 280001, + 'Quaker Ford BB Interceptor EM', + NULL, + 2 + ), + ( + 280171, + 280001, + 'Quaker Ford BB Jet Stream Headers', + NULL, + 3 + ), + ( + 280172, + 280001, + 'Quaker Ford BB Super Stream Headers', + NULL, + 4 + ), + ( + 280173, + 280001, + 'Oldfield Ford BB Street King EM', + NULL, + 2 + ), + ( + 280174, + 280001, + 'Oldfield Ford BB Strip King Headers', + NULL, + 3 + ), + ( + 280175, + 280001, + 'Oldfield Ford BB Track King Headers', + NULL, + 4 + ), + ( + 280176, + 280001, + 'Quaker Chevy BB Air Stream EM', + NULL, + 1 + ), + ( + 280177, + 280001, + 'Quaker Chevy BB Air Stream Alum. EM', + NULL, + 1 + ), + ( + 280178, + 280001, + 'Quaker Chevy BB Interceptor EM', + NULL, + 2 + ), + ( + 280179, + 280001, + 'Quaker Chevy BB Jet Stream Headers', + NULL, + 3 + ), + ( + 280180, + 280001, + 'Quaker Chevy BB Super Stream Headers', + NULL, + 4 + ), + ( + 280181, + 280001, + 'Rad Rat Chevy BB Street Mod EM', + NULL, + 2 + ), + ( + 280182, + 280001, + 'Rad Rat Chevy BB Rumble Pipe Headers', + NULL, + 3 + ), + ( + 280183, + 280001, + 'Rad Rat Chevy BB Street Lion Headers', + NULL, + 3 + ), + ( + 280184, + 280001, + 'Rad Rat Chevy BB Window Rattler Headers', + NULL, + 4 + ), + ( + 290001, + 290001, + '1.625" Treated Iron Single Exhaust Pipe', + NULL, + 1 + ), + ( + 290002, + 290001, + '1.625" Treated Iron Dual Exhaust Pipe', + NULL, + 1 + ), + ( + 290003, + 290001, + '1.625" Cast Iron Single Exhaust Pipe', + NULL, + 1 + ), + ( + 290004, + 290001, + '1.625" Cast Iron Dual Exhaust Pipe', + NULL, + 1 + ), + ( + 290005, + 290001, + 'Hooker Street Racer Crossflow Exhaust Pipe', + NULL, + 3 + ), + ( + 290006, + 290001, + 'Hooker Performance Crossflow Exhaust Pipe', + NULL, + 3 + ), + ( + 290007, + 290001, + 'Hooker Maximum Performance Crossflow Exhaust Pipe', + NULL, + 4 + ), + ( + 290008, + 290001, + 'Edelbrock Cat-Back System', + NULL, + 3 + ), + (290009, 290001, 'Fat Shiny Pipe', NULL, 3), + (290010, 290001, 'Manley 1.75" CI Single', NULL, 1), + ( + 290011, + 290001, + 'Manley 1.875" CI Single', + NULL, + 1 + ), + (290012, 290001, 'Manley 2" CI Single', NULL, 2), + (290013, 290001, 'Manley 2.25" CI Dual', NULL, 4), + (290014, 290001, 'Manley 1.75" TI Single', NULL, 1), + ( + 290015, + 290001, + 'Manley 1.875" TI Single', + NULL, + 1 + ), + (290016, 290001, 'Manley 2" TI Single', NULL, 2), + (290017, 290001, 'Manley 2.25" TI Dual', NULL, 4), + (290018, 290001, 'Manley 1.75" CI Dual', NULL, 2), + (290019, 290001, 'Manley 1.875" CI Dual', NULL, 2), + (290020, 290001, 'Manley 2" CI Dual', NULL, 3), + (290021, 290001, 'Manley 1.75" TI Dual', NULL, 2), + (290022, 290001, 'Manley 1.875" TI Dual', NULL, 2), + (290023, 290001, 'Manley 2" TI Dual', NULL, 3), + (290024, 290001, 'Manley 1.625" FS Dual', NULL, 2), + (290025, 290001, 'Manley 1.75" FS Dual', NULL, 2), + (290026, 290001, 'Manley 1.875" FS Dual', NULL, 2), + (290027, 290001, 'Manley 2" FS Dual', NULL, 3), + (290028, 290001, 'Manley 2.25" FS Dual', NULL, 4), + ( + 290029, + 290001, + 'Manley 1.625" Alloy Steel Dual', + NULL, + 2 + ), + ( + 290030, + 290001, + 'Manley 1.75" Alloy Steel Dual', + NULL, + 2 + ), + ( + 290031, + 290001, + 'Manley 1.875" Alloy Steel Dual', + NULL, + 2 + ), + ( + 290032, + 290001, + 'Manley 2" Alloy Steel Dual', + NULL, + 3 + ), + ( + 290033, + 290001, + 'Manley 2.25" Alloy Steel Dual', + NULL, + 4 + ), + ( + 290034, + 290001, + 'Manley 1.625" Aluminum Alloy Dual', + NULL, + 2 + ), + ( + 290035, + 290001, + 'Manley 1.75" Aluminum Alloy Dual', + NULL, + 2 + ), + ( + 290036, + 290001, + 'Manley 1.875" Aluminum Alloy Dual', + NULL, + 2 + ), + ( + 290037, + 290001, + 'Manley 2" Aluminum Alloy Dual', + NULL, + 3 + ), + ( + 290038, + 290001, + 'Manley 2.25" Aluminum Alloy Dual', + NULL, + 4 + ), + (300001, 300001, 'Midas Stock Muffler', NULL, 1), + ( + 300002, + 300001, + 'Midas Aluminum Stock Muffler', + NULL, + 1 + ), + (300003, 300001, 'GM Side Pipes', 'PIPESIDE', 2), + (300004, 300001, 'GM Dual Resonators', NULL, 2), + (300005, 300001, 'Edelbrock RPM Muffler', NULL, 3), + ( + 300006, + 300001, + 'Edelbrock Victor Muffler', + NULL, + 3 + ), + (300007, 300001, 'Edelbrock 304 Muffler', NULL, 3), + (300008, 300001, 'Hooker Maximum Flow', NULL, 4), + ( + 300009, + 300001, + 'Hooker Super Competition', + NULL, + 4 + ), + ( + 300010, + 300001, + 'Hooker Elite Glasspack', + 'PIPELAKE', + 4 + ), + (300011, 300001, 'Hooker Street Shaker', NULL, 3), + (310001, 310001, 'Dual Tail Pipe Tip 001', NULL, 1), + (310002, 310001, 'Dual Tail Pipe Tip 002', NULL, 1), + (310003, 310001, 'Stock Tip', 'TIPCYL', 1), + ( + 310004, + 310001, + 'Single Tail Pipe Tip (Flaming)', + NULL, + 1 + ), + ( + 310005, + 310001, + '1969 Dodge Charger RT Tip', + 'TIPCIRC', + 1 + ), + ( + 310006, + 310001, + '1969 Olds 4-4-2 Trumpet Tip', + NULL, + 1 + ), + ( + 310007, + 310001, + '1970 Ford Mustang Oval Trumpet Tip', + NULL, + 1 + ), + ( + 310008, + 310001, + '1970 Plymouth ''Cuda Chrome Tip', + 'TIPCONE', + 1 + ), + ( + 310009, + 310001, + '1973 Pontiac Trans-Am Chrome Extension', + NULL, + 1 + ), + ( + 310010, + 310001, + '1973 Pontiac Firebird Chrome Extension', + NULL, + 1 + ), + ( + 310011, + 310001, + 'Marinn Large Bore Tip', + 'tipcirc', + 1 + ), + ( + 310012, + 310001, + 'Marinn Large Bore (Dual) Tip', + 'tipcirc', + 1 + ), + ( + 310013, + 310001, + 'Marinn Large Bore Tip w/resonator', + 'tipcirc', + 1 + ), + ( + 310014, + 310001, + 'Marinn Large Bore Tip w/resonator (Dual)', + 'tipcirc', + 1 + ), + ( + 310015, + 310001, + 'Marinn MegaCone Tip', + 'tipcone', + 1 + ), + ( + 310016, + 310001, + 'Marinn MegaCone (Dual) Tip', + 'tipcone', + 1 + ), + ( + 310017, + 310001, + 'Marinn Slanted Cut Tip', + 'tiprect', + 1 + ), + ( + 310018, + 310001, + 'Marinn Slanted Cut (Dual) Tip', + 'tiprect', + 1 + ), + ( + 310019, + 310001, + 'Marinn Slanted Cut Tip w/resonator', + 'tiprect', + 1 + ), + ( + 310020, + 310001, + 'Marinn Slanted Cut Tip w/resonator (Dual)', + 'tiprect', + 1 + ), + ( + 310021, + 310001, + 'Edelbrock Angle Cut Tip', + NULL, + 1 + ), + ( + 310022, + 310001, + 'Edelbrock Angle Cut (Dual) Tip', + NULL, + 1 + ), + ( + 310023, + 310001, + 'Edelbrock Flat Oval Tip', + NULL, + 1 + ), + ( + 310024, + 310001, + 'Edelbrock Flat Oval (Dual) Tip', + NULL, + 1 + ), + ( + 310025, + 310001, + 'Edelbrock Round Double Wall Tip', + NULL, + 1 + ), + ( + 310026, + 310001, + 'Edelbrock Round Double Wall (Dual) Tip', + NULL, + 1 + ), + ( + 310027, + 310001, + 'Edelbrock Round Turn-Down Tip', + NULL, + 1 + ), + ( + 310028, + 310001, + 'Edelbrock Round Turn-Down (Dual) Tip', + NULL, + 1 + ), + ( + 310029, + 310001, + 'Stock Round Chrome', + 'TIPCIRC', + 1 + ), + ( + 320001, + 320001, + 'Ford BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320002, + 320001, + 'Chevrolet BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320003, + 320001, + 'Chrysler SB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320004, + 320001, + 'Chrysler BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320005, + 320001, + 'Chevrolet BB Single Plane IM', + 'MANISING', + 1 + ), + ( + 320006, + 320001, + 'Ford BB Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320007, + 320001, + 'Buick BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320008, + 320001, + 'Buick SB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320009, + 320001, + 'Chevrolet SB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320010, + 320001, + 'Cadillac BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320011, + 320001, + 'Ford SB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320012, + 320001, + 'Ford Flathead Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320013, + 320001, + 'Olds BB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320014, + 320001, + 'Olds SB Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320015, + 320001, + 'AMC Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320016, + 320001, + 'Pontiac Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320017, + 320001, + 'Chevrolet SB RPO411 Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320018, + 320001, + 'Chevrolet SB High Rise Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320019, + 320001, + 'Chevrolet SB Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320020, + 320001, + 'Chevrolet BB High Rise Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320021, + 320001, + 'Chevrolet BB LS6 Low Rise Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320022, + 320001, + 'Buick Nailhead Stock 322 DP IM', + 'MANIDUAL', + 1 + ), + ( + 320023, + 320001, + 'Edelbrock Stage II Buick BB Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320024, + 320001, + 'Olds SB Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320025, + 320001, + 'Olds SB W-31 HP Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320026, + 320001, + 'Olds BB W-30 HP Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320027, + 320001, + 'Pontiac Ram Air IV HP Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320028, + 320001, + 'Pontiac Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320029, + 320001, + 'Ford Y 1957 Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320030, + 320001, + 'Edelbrock Aluminum Dual Plane Ford SB IM', + 'MANIDUAL', + 2 + ), + ( + 320031, + 320001, + 'Ford BB HR Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320032, + 320001, + 'Ford BB Cammer IM', + 'MANISING', + 3 + ), + ( + 320033, + 320001, + 'Ford BB Sidewinder Single Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320034, + 320001, + 'Ford BB Single Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320035, + 320001, + 'Offenhauser Ford 385 Single Plane IM', + 'MANIDUAL', + 3 + ), + ( + 320036, + 320001, + 'Chrysler BB High Rise IM', + 'MANIDUAL', + 2 + ), + ( + 320037, + 320001, + 'Chrysler BB Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320038, + 320001, + 'Chrysler BB Long Ram IM', + 'MANIDUAL', + 2 + ), + ( + 320039, + 320001, + 'Chrysler BB Short Ram IM', + 'MANIDUAL', + 2 + ), + ( + 320040, + 320001, + 'Edelbrock Chrysler BB Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320041, + 320001, + 'Chrysler SB Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320042, + 320001, + 'AMC Rebel Machine IM', + 'MANIDUAL', + 2 + ), + ( + 320043, + 320001, + 'Ford 385 Boss Dual Plane Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320044, + 320001, + 'Edelbrock R4B AMC Block IM', + 'MANIDUAL', + 2 + ), + ( + 320045, + 320001, + 'Edelbrock Super Dual Ford Flathead IM', + 'MANIDUAL', + 2 + ), + ( + 320046, + 320001, + 'Edelbrock Performer RPM Cadillac BB IM', + 'MANIDUAL', + 2 + ), + ( + 320047, + 320001, + 'Edelbrock Performer Chevrolet BB IM', + 'MANIDUAL', + 2 + ), + ( + 320048, + 320001, + 'Edelbrock Performer Chevrolet SB IM', + 'MANIDUAL', + 2 + ), + ( + 320049, + 320001, + 'Edelbrock Performer Chrysler BB IM', + 'MANIDUAL', + 2 + ), + ( + 320050, + 320001, + 'Edelbrock Performer Chrysler SB IM', + 'MANIDUAL', + 2 + ), + ( + 320051, + 320001, + 'Edelbrock Performer Ford BB IM', + 'MANIDUAL', + 2 + ), + ( + 320052, + 320001, + 'Edelbrock Performer Ford SB IM', + 'MANIDUAL', + 2 + ), + ( + 320053, + 320001, + 'Edelbrock Performer Olds BB IM', + 'MANIDUAL', + 2 + ), + ( + 320054, + 320001, + 'Edelbrock Performer Olds SB IM', + 'MANIDUAL', + 2 + ), + (320055, 320001, 'Chrysler Hemi IM', 'MANIDUAL', 2), + ( + 320056, + 320001, + 'Edelbrock Performer Pontiac IM', + 'MANIDUAL', + 2 + ), + ( + 320057, + 320001, + 'Edelbrock Performer RPM Chevrolet BB IM', + 'MANIDUAL', + 2 + ), + ( + 320058, + 320001, + 'Edelbrock Performer RPM Chevrolet SB IM', + 'MANIDUAL', + 2 + ), + ( + 320059, + 320001, + 'Edelbrock Performer RPM Chrysler BB IM', + 'MANIDUAL', + 2 + ), + ( + 320060, + 320001, + 'Edelbrock Performer RPM Chrysler SB IM', + 'MANIDUAL', + 2 + ), + ( + 320061, + 320001, + 'Edelbrock Performer RPM Ford BB IM', + 'MANIDUAL', + 2 + ), + ( + 320062, + 320001, + 'Edelbrock Performer RPM Ford SB IM', + 'MANIDUAL', + 2 + ), + ( + 320063, + 320001, + 'Edelbrock Performer RPM Olds BB IM', + 'MANIDUAL', + 2 + ), + ( + 320064, + 320001, + 'Edelbrock Performer RPM Olds SB IM', + 'MANIDUAL', + 2 + ), + ( + 320065, + 320001, + 'Shade Tree Chrysler Hemi IM', + 'MANIDUAL', + 1 + ), + ( + 320066, + 320001, + 'Edelbrock Performer RPM Pontiac IM', + 'MANIDUAL', + 2 + ), + ( + 320067, + 320001, + 'Edelbrock Torker Chevrolet BB IM', + 'MANIDUAL', + 3 + ), + ( + 320068, + 320001, + 'Edelbrock Torker Chevrolet SB IM', + 'MANIDUAL', + 3 + ), + ( + 320069, + 320001, + 'Edelbrock Torker Chrysler BB IM', + 'MANIDUAL', + 3 + ), + ( + 320070, + 320001, + 'Edelbrock Torker Chrysler SB IM', + 'MANIDUAL', + 3 + ), + ( + 320071, + 320001, + 'Edelbrock Torker Ford BB IM', + 'MANIDUAL', + 3 + ), + ( + 320072, + 320001, + 'Edelbrock Torker Ford SB IM', + 'MANIDUAL', + 3 + ), + ( + 320073, + 320001, + 'Edelbrock Torker Olds BB IM', + 'MANIDUAL', + 3 + ), + ( + 320074, + 320001, + 'Edelbrock Torker Olds SB IM', + 'MANIDUAL', + 3 + ), + ( + 320075, + 320001, + 'Edelbrock Torker Pontiac IM', + 'MANIDUAL', + 3 + ), + ( + 320076, + 320001, + 'Edelbrock Torker Pontiac IM', + 'MANIDUAL', + 3 + ), + ( + 320077, + 320001, + 'Chevrolet BB Dual Plane Aluminum IM', + 'MANIDUAL', + 1 + ), + ( + 320078, + 320001, + 'Chrysler SB Tunnel Ram IM', + 'MANIDUAL', + 2 + ), + ( + 320079, + 320001, + 'Chevrolet W Z11 Dual Plane Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320080, + 320001, + 'Ford BB Cobrajet Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320081, + 320001, + 'Offenhauser Magnesium Chrysler Hemi DP IM', + 'MANIDUAL', + 4 + ), + ( + 320082, + 320001, + 'Chrysler BB Max Wedge Aluminum Cross-Ram IM', + 'MANIDUAL', + 2 + ), + ( + 320083, + 320001, + 'Edelbrock Torker Buick BB IM', + 'MANISING', + 3 + ), + ( + 320084, + 320001, + 'Edelbrock Performer RPM Buick BB IM', + 'MANIDUAL', + 3 + ), + ( + 320085, + 320001, + 'Edelbrock Torker II Buick BB IM', + 'MANISING', + 3 + ), + ( + 320086, + 320001, + 'Edelbrock Performer Buick BB IM', + 'MANIDUAL', + 2 + ), + ( + 320087, + 320001, + 'Ford SB Single Plane Aluminum IM', + 'MANISING', + 2 + ), + ( + 320088, + 320001, + 'Ford SB Dual Plane Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320089, + 320001, + 'Pontiac Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320090, + 320001, + 'Pontiac SD Aluminum Single Plane IM', + 'MANISING', + 3 + ), + ( + 320091, + 320001, + 'Cadillac L-Head Intake Manifold', + 'MANIDUAL', + 1 + ), + ( + 320092, + 320001, + 'Ford Cleveland Block Stock IM', + 'MANIDUAL', + 1 + ), + ( + 320093, + 320001, + 'Ford Cleveland Block Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320094, + 320001, + 'Ford 385 Stock IM', + 'MANIDUAL', + 1 + ), + ( + 320095, + 320001, + 'Ford 385 CJ/SCJ IM', + 'MANIDUAL', + 2 + ), + ( + 320096, + 320001, + 'Ford SB Cross Boss IM', + 'MANIDUAL', + 3 + ), + (320097, 320001, 'Ford Y Stock IM', 'MANIDUAL', 1), + ( + 320098, + 320001, + 'Edelbrock Ford Y Tri-Power Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320099, + 320001, + 'Chevrolet W Stock IM', + 'MANIDUAL', + 1 + ), + ( + 320100, + 320001, + 'Chevrolet W Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320101, + 320001, + 'Dunbar Buick Nailhead Breezer DP IM', + 'MANIDUAL', + 2 + ), + ( + 320102, + 320001, + 'Dunbar Buick Nailhead Tornado SP IM', + 'MANISING', + 2 + ), + ( + 320103, + 320001, + 'Buick SB Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320104, + 320001, + 'Cadillac L-Head Aluminum IM', + 'MANIDUAL', + 2 + ), + ( + 320105, + 320001, + 'Edelbrock Performer AMC IM', + 'MANIDUAL', + 2 + ), + ( + 320106, + 320001, + 'Edelbrock Torker AMC IM', + 'MANIDUAL', + 3 + ), + ( + 320107, + 320001, + 'Offenhauser Aluminum AMC IM', + 'MANIDUAL', + 3 + ), + ( + 320108, + 320001, + 'Ford Y Block Dual Quad Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320109, + 320001, + 'Ford Y Block Supercharger Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320110, + 320001, + 'Edelbrock Y Block 3x2 Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320111, + 320001, + 'Offenhauser Y Block 3x2 Dual Planer IM', + 'MANIDUAL', + 2 + ), + ( + 320112, + 320001, + 'Offenhauser Y Block Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320113, + 320001, + 'Edelbrock Y Block Aluminum Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320114, + 320001, + 'Oldfield Y Block Aluminum Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320115, + 320001, + 'Oldfield Y Block Special Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320116, + 320001, + 'Edelbrock Y Block Aluminum Single Plane IM', + 'MANISING', + 2 + ), + ( + 320117, + 320001, + 'Offenhauser Y Block Aluminum Single Plane IM', + 'MANISING', + 2 + ), + ( + 320118, + 320001, + 'Oldfield Y Block Lightning Single Plane IM', + 'MANISING', + 2 + ), + ( + 320119, + 320001, + 'Oldfield Y Block HiBoy Tunnel Ram IM', + 'MANIHIGH', + 2 + ), + ( + 320120, + 320001, + 'Oldfield Y Block Midget Tunnel Ram IM', + 'MANILOW', + 2 + ), + ( + 320121, + 320001, + 'Oldfield Y Block Strip King Tunnel Ram IM', + 'MANIHIGH', + 3 + ), + ( + 320122, + 320001, + 'Rad Rat Chevy SB Vortex Single Plane IM', + 'MANISING', + 2 + ), + ( + 320123, + 320001, + 'Rad Rat Chevy SB Screamer Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320124, + 320001, + 'Rad Rat Chevy SB Scooter Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320125, + 320001, + 'Rad Rat Chevy SB Scooter Alum. Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320126, + 320001, + 'C&B Chevy SB Classic Dual Plane IM', + 'MANIDUAL', + 1 + ), + ( + 320127, + 320001, + 'C&B Chevy SB Street Classic Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320128, + 320001, + 'C&B Chevy SB Classic Single Plane IM', + 'MANISING', + 2 + ), + ( + 320129, + 320001, + 'C&B Chevy SB Super Single Plane IM', + 'MANISING', + 3 + ), + ( + 320130, + 320001, + 'Rad Rat Chevy SB Vortex Ultra Single Plane IM', + 'MANISING', + 2 + ), + ( + 320131, + 320001, + 'Rad Rat Chevy SB Power Tower Tunnel Ram IM', + 'MANIHIGH', + 2 + ), + ( + 320132, + 320001, + 'Rad Rat Chevy SB Ultimate Tunnel Ram IM', + 'MANIHIGH', + 3 + ), + ( + 320133, + 320001, + 'C&B Chevy SB Classic Low Rise Tunnel Ram IM', + 'MANILOW', + 2 + ), + ( + 320134, + 320001, + 'C&B Chevy SB Classic High Rise Tunnel Ram IM', + 'MANIHIGH', + 3 + ), + ( + 320135, + 320001, + 'Rad Rat Chevy SB Screamer Ultra Dual Plane IM', + 'MANIDUAL', + 2 + ), + ( + 320136, + 320001, + 'Buick Nailhead 364 DP IM', + 'MANIDUAL', + 1 + ), + ( + 320137, + 320001, + 'Buick Nailhead 401/425 DP IM', + 'MANIDUAL', + 1 + ), + ( + 320138, + 320001, + 'Dunbar Buick Nailhead Improved DP IM', + 'MANIDUAL', + 1 + ), + ( + 320139, + 320001, + 'Dunbar Buick Nailhead Breezer DP IM', + 'MANIDUAL', + 1 + ), + ( + 320140, + 320001, + 'Per. Port Buick Nailhead Street Port DP IM', + 'MANIDUAL', + 2 + ), + ( + 320141, + 320001, + 'Per. Port Buick Nailhead Street Port Alum. DP IM', + 'MANIDUAL', + 2 + ), + ( + 320142, + 320001, + 'Dunbar Buick Nailhead Tornado SP IM', + 'MANISING', + 2 + ), + ( + 320143, + 320001, + 'Per. Port Buick Nailhead Street Port SP IM', + 'MANISING', + 2 + ), + ( + 320144, + 320001, + 'Dunbar Buick Nailhead Wind Tunnel SP IM', + 'MANISING', + 2 + ), + ( + 320145, + 320001, + 'Dunbar Buick Nailhead Hurricane Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320146, + 320001, + 'Dunbar Buick Nailhead Cyclone Tunnel Ram', + 'MANILOW', + 2 + ), + ( + 320147, + 320001, + 'Dunbar Buick Nailhead Super Cyclone Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320148, + 320001, + 'Oldfield Ford SB Performance DP IM', + 'MANIDUAL', + 2 + ), + ( + 320149, + 320001, + 'Oldfield Ford SB Performance Alum. DP IM', + 'MANIDUAL', + 2 + ), + ( + 320150, + 320001, + 'Per. Port Ford SB Road Squire DP IM', + 'MANIDUAL', + 1 + ), + ( + 320151, + 320001, + 'Per. Port Ford SB Road Squire Alum. DP IM', + 'MANIDUAL', + 1 + ), + ( + 320152, + 320001, + 'Per. Port Ford SB Centurion DP IM', + 'MANIDUAL', + 2 + ), + ( + 320153, + 320001, + 'Per. Port Ford SB Street Knight SP IM', + 'MANISING', + 2 + ), + ( + 320154, + 320001, + 'Oldfield Ford SB Lightning SP IM', + 'MANISING', + 2 + ), + ( + 320155, + 320001, + 'Per. Port Ford SB Commander SP IM', + 'MANISING', + 2 + ), + ( + 320156, + 320001, + 'Per. Port Ford SB Emperor Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320157, + 320001, + 'Oldfield Ford SB Midget Tunnel Ram', + 'MANILOW', + 2 + ), + ( + 320158, + 320001, + 'Oldfield Ford SB Strip King Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320159, + 320001, + 'Per. Port Ford SB Street Lord Tunnel Ram', + 'MANILOW', + 2 + ), + ( + 320160, + 320001, + 'Walter Chrysler SB Street DP IM', + 'MANIDUAL', + 1 + ), + ( + 320161, + 320001, + 'Walter Chrysler SB Stocker DP IM', + 'MANIDUAL', + 2 + ), + ( + 320162, + 320001, + 'Walter Chrysler SB Street SP IM', + 'MANISING', + 2 + ), + ( + 320163, + 320001, + 'Walter Chrysler SB Stocker SP IM', + 'MANISING', + 3 + ), + ( + 320164, + 320001, + 'Walter Chyrsler SB Super Stocker SP IM', + 'MANISING', + 4 + ), + ( + 320165, + 320001, + 'Walter Chrysler SB Intimidator Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320166, + 320001, + 'Walter Chrysler SB Bighorn Tunnel Ram', + 'MANIHIGH', + 2 + ), + ( + 320167, + 320001, + 'Perfect Port Chrysler SB Centurion DP IM', + 'MANIDUAL', + 1 + ), + ( + 320168, + 320001, + 'Perfect Port Chrysler SB Commander SP IM', + 'MANISING', + 2 + ), + ( + 320169, + 320001, + 'Per. Port Pontiac Emperor Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320170, + 320001, + 'Per. Port Pontiac Street Lord Tunnel Ram', + 'MANILOW', + 2 + ), + ( + 320171, + 320001, + 'Per. Port Pontiac Crusader Tunnel Ram', + 'MANIHIGH', + 2 + ), + ( + 320172, + 320001, + 'Per. Port Pontiac Track Assassin SP IM', + 'MANISING', + 3 + ), + ( + 320173, + 320001, + 'Per. Port Pontiac Street Knight SP IM', + 'MANISING', + 2 + ), + ( + 320174, + 320001, + 'Per. Port Pontiac Super Centurion DP IM', + 'MANIDUAL', + 3 + ), + ( + 320175, + 320001, + 'Rad Rat Chevy BB Screamer Ultra Light DP', + 'MANIDUAL', + 3 + ), + ( + 320176, + 320001, + 'Rad Rat Chevy BB Vortex SP IM', + 'MANISING', + 2 + ), + ( + 320177, + 320001, + 'Rad Rat Chevy BB Vortex Ultra Light SP IM', + 'MANISING', + 3 + ), + ( + 320178, + 320001, + 'Rad Rat Chevy BB Power Tower Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320179, + 320001, + 'Rad Rat Chevy BB Ultimate Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320180, + 320001, + 'Oldfield Ford BB Strip King DP IM', + 'MANIDUAL', + 2 + ), + ( + 320181, + 320001, + 'Oldfield Ford BB Street King DP IM', + 'MANIDUAL', + 2 + ), + ( + 320182, + 320001, + 'Oldfield Ford BB Strip King SP IM', + 'MANISING', + 2 + ), + ( + 320183, + 320001, + 'Oldfield Ford BB Midget Tunnel Ram', + 'MANILOW', + 2 + ), + ( + 320184, + 320001, + 'Oldfield Ford BB Hiboy Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320185, + 320001, + 'Oldfield Ford BB Strip King Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320186, + 320001, + 'Walter Chrysler BB Bighorn Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320187, + 320001, + 'Walter Chrysler BB Intimidator Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320188, + 320001, + 'Walter Chrysler BB Super Stocker DP IM', + 'MANIDUAL', + 4 + ), + ( + 320189, + 320001, + 'Walter Chrysler BB Super Stocker SP IM', + 'MANISING', + 4 + ), + ( + 320190, + 320001, + 'Walter Chrysler BB Stocker SP IM', + 'MANISING', + 3 + ), + ( + 320191, + 320001, + 'Walter Chrysler BB Stocker DP IM', + 'MANIDUAL', + 3 + ), + ( + 320192, + 320001, + 'Walter Chrysler BB Street DP IM', + 'MANIDUAL', + 2 + ), + ( + 320193, + 320001, + 'Walter Chrylser BB Street SP IM', + 'MANIDUAL', + 2 + ), + ( + 320194, + 320001, + 'Perf. Port Olds BB Road Squire DP IM', + 'MANIDUAL', + 1 + ), + ( + 320195, + 320001, + 'Perf. Port Olds BB Street Port DP IM', + 'MANIDUAL', + 2 + ), + ( + 320196, + 320001, + 'Perf. Port Olds BB Usurper DP IM', + 'MANIDUAL', + 4 + ), + ( + 320197, + 320001, + 'Perf. Port Olds BB Centurion SP IM', + 'MANISING', + 2 + ), + ( + 320198, + 320001, + 'Perf. Port Olds BB Commander SP IM', + 'MANISING', + 3 + ), + ( + 320199, + 320001, + 'Perf. Port Olds BB Track Assassin SP IM', + 'MANISING', + 4 + ), + ( + 320200, + 320001, + 'Perf. Port Olds BB Street Lord Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320201, + 320001, + 'Perf. Port Olds BB Crusader Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320202, + 320001, + 'Perf. Port Olds BB Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320203, + 320001, + 'Rad Rat Chevy W Screamer DP IM', + 'MANIDUAL', + 2 + ), + ( + 320204, + 320001, + 'Rad Rat Chevy W Vortex SP IM', + 'MANISING', + 3 + ), + ( + 320205, + 320001, + 'Rad Rat Chevy W Banshee DP IM', + 'MANIDUAL', + 4 + ), + ( + 320206, + 320001, + 'Rad Rat Chevy W Banshee SP IM', + 'MANISING', + 4 + ), + ( + 320207, + 320001, + 'Rad Rat Chevy W Power Tower Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320208, + 320001, + 'Rad Rat Chevy W Ultimate Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320209, + 320001, + 'Perf.Port Chevy W Usurper DP IM', + 'MANIDUAL', + 4 + ), + ( + 320210, + 320001, + 'Perf. Port Chevy W Centurion SP IM', + 'MANISING', + 2 + ), + ( + 320211, + 320001, + 'Perf. Port Chevy W Track Assassin SP IM', + 'MANISING', + 4 + ), + ( + 320212, + 320001, + 'Perf. Port Chevy W Street Lord Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320213, + 320001, + 'Perf. Port Chevy W Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320214, + 320001, + 'Perfect Port AMC Track Assassin SP IM', + 'MANISING', + 4 + ), + ( + 320215, + 320001, + 'Perfect Port AMC Street Knight SP IM', + 'MANISING', + 2 + ), + ( + 320216, + 320001, + 'Street Shark AMC Hunter SP IM', + 'MANISING', + 3 + ), + ( + 320217, + 320001, + 'Street Shark AMC Predator DP IM', + 'MANIDUAL', + 4 + ), + ( + 320218, + 320001, + 'Street Shark AMC Stalker DP IM', + 'MANIDUAL', + 2 + ), + ( + 320219, + 320001, + 'Perfort Port AMC Street Lord Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320220, + 320001, + 'Perfect Port AMC Crusader Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320221, + 320001, + 'Perfect Port AMC Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320222, + 320001, + 'Street Shark AMC Tiger Shark Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320223, + 320001, + 'Perf. Port Cadillac BB Road Squire DP IM', + 'MANIDUAL', + 1 + ), + ( + 320224, + 320001, + 'Perf. Port Cadillac BB Road Squire Alum. DP IM', + 'MANIDUAL', + 1 + ), + ( + 320225, + 320001, + 'Perf. Port Cadillac BB Street Port DP IM', + 'MANIDUAL', + 2 + ), + ( + 320226, + 320001, + 'Perf. Port Cadillac BB Centurion DP IM', + 'MANIDUAL', + 2 + ), + ( + 320227, + 320001, + 'Perf. Port Cadillac BB Usurper DP IM', + 'MANIDUAL', + 4 + ), + ( + 320228, + 320001, + 'Perf. Port Cadillac BB Street Lord DP IM', + 'MANIDUAL', + 3 + ), + ( + 320229, + 320001, + 'Perf. Port Cadillac BB Street Knight SP IM', + 'MANISING', + 2 + ), + ( + 320230, + 320001, + 'Perf. Port Cadillac BB Centurion SP IM', + 'MANISING', + 2 + ), + ( + 320231, + 320001, + 'Perf. Port Cadillac BB Super Centurion SP IM', + 'MANISING', + 3 + ), + ( + 320232, + 320001, + 'Perf. Port Cadillac BB Track Assassin SP IM', + 'MANISING', + 4 + ), + ( + 320233, + 320001, + 'Perf. Port Cadillac BB Street Lord Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320234, + 320001, + 'Perf. Port Cadillac BB Crusader Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320235, + 320001, + 'Perf. Port Cadillac BB Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320236, + 320001, + 'Perf. Port Cadillac BB Usurper Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320237, + 320001, + 'Walter Hemi Perf. Street DP IM', + 'MANIDUAL', + 2 + ), + ( + 320238, + 320001, + 'Walter Hemi Perf. Lightweight Street DP IM', + 'MANIDUAL', + 2 + ), + ( + 320239, + 320001, + 'Walter Hemi Stocker DP IM', + 'MANIDUAL', + 3 + ), + ( + 320240, + 320001, + 'Walter Hemi Lightweight Stocker DP IM', + 'MANIDUAL', + 3 + ), + ( + 320241, + 320001, + 'Walter Hemi Super Stocker DP IM', + 'MANIDUAL', + 4 + ), + ( + 320242, + 320001, + 'Walter Hemi Perf. Street SP IM', + 'MANISING', + 2 + ), + ( + 320243, + 320001, + 'Walter Hemi Stocker SP IM', + 'MANISING', + 3 + ), + ( + 320244, + 320001, + 'Walter Hemi Super Stocker SP IM', + 'MANISING', + 3 + ), + ( + 320245, + 320001, + 'Walter Hemi Intimidator Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320246, + 320001, + 'Walter Hemi Bighorn Tunnel Ram', + 'MANIDUAL', + 3 + ), + ( + 320247, + 320001, + 'Perf. Port Ford 385 Road Squire DP IM', + 'MANIDUAL', + 1 + ), + ( + 320248, + 320001, + 'Perf. Port Ford 385 Centurion SP IM', + 'MANISING', + 2 + ), + ( + 320249, + 320001, + 'Perf. Port Ford 385 Street Lord Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320250, + 320001, + 'Perf. Port Ford 385 Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320251, + 320001, + 'Oldfield Ford 385 Perf. DP IM', + 'MANIDUAL', + 2 + ), + ( + 320252, + 320001, + 'Oldfield Ford 385 Lightning SP IM', + 'MANISING', + 3 + ), + ( + 320253, + 320001, + 'Oldfield Ford 385 Track King DP IM', + 'MANIDUAL', + 4 + ), + ( + 320254, + 320001, + 'Oldfield Ford 385 Strip King Tunnel Ram', + 'MANIHIGH', + 3 + ), + ( + 320255, + 320001, + 'Oldfield Ford 385 Track King Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320256, + 320001, + 'Perf. Port Cleveland Street Port DP IM', + 'MANIDUAL', + 2 + ), + ( + 320257, + 320001, + 'Perf. Port Cleveland Emperor DP IM', + 'MANIDUAL', + 4 + ), + ( + 320258, + 320001, + 'Perf. Port Cleveland Emperor SP IM', + 'MANISING', + 4 + ), + ( + 320259, + 320001, + 'Perf. Port Cleveland Centurion SP IM', + 'MANISING', + 2 + ), + ( + 320260, + 320001, + 'Perf. Port Cleveland Emperor Tunnel Ram', + 'MANIHIGH', + 4 + ), + ( + 320261, + 320001, + 'Oldfield Cleveland Performance DP IM', + 'MANIDUAL', + 2 + ), + ( + 320262, + 320001, + 'Oldfield Cleveland Track King DP IM', + 'MANIDUAL', + 4 + ), + ( + 320263, + 320001, + 'Oldfield Cleveland Performance SP IM', + 'MANISING', + 2 + ), + ( + 320264, + 320001, + 'Oldfield Cleveland Track King SP IM', + 'MANISING', + 4 + ), + ( + 320265, + 320001, + 'Oldfield Cleveland Midget Tunnel Ram', + 'MANILOW', + 3 + ), + ( + 330001, + 330001, + 'Autolite 4V (300 cfm)', + 'CARBSING', + 1 + ), + ( + 330002, + 330001, + 'Autolite 6V (600 cfm)', + 'CARBTRI', + 2 + ), + ( + 330003, + 330001, + 'Autolite 2V (300 cfm)', + 'CARBSING', + 1 + ), + ( + 330004, + 330001, + 'Holley 4100 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330005, + 330001, + 'Rochester 2GV 2V (200 cfm)', + 'CARBSING', + 1 + ), + ( + 330006, + 330001, + 'Stromberg 97 2V (125 cfm)', + 'CARBSING', + 1 + ), + ( + 330007, + 330001, + 'Holley 2300 2V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330008, + 330001, + 'Rochester 4G 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330009, + 330001, + 'Rochester Monojet 2V (350 cfm)', + 'CARBSING', + 1 + ), + ( + 330010, + 330001, + 'Holley Dominator 2300 2V (400 cfm)', + 'CARBSING', + 2 + ), + ( + 330011, + 330001, + 'Holley 4150 4V (650 cfm)', + 'CARBSING', + 2 + ), + ( + 330012, + 330001, + 'Edelbrock Performer 4V (600 cfm)', + 'CARBSING', + 2 + ), + (330013, 330001, 'Ramjet Fuel Injector', NULL, 1), + ( + 330014, + 330001, + 'Rochester 6V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330015, + 330001, + 'Ford Detroit Lubricator 1V (100 cfm)', + 'CARBSING', + 1 + ), + ( + 330016, + 330001, + 'Rochester Quadrajet 2x4V (800 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330017, + 330001, + 'Carter Tri-Power 3x2V (780 cfm)', + 'CARBTRI', + 3 + ), + ( + 330018, + 330001, + 'Carter AFB 2x4V (800 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330019, + 330001, + 'Edelbrock Q-Jet (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330020, + 330001, + 'Rochester Quadrajet 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330021, + 330001, + 'Carter AFB 4V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330022, + 330001, + 'Holley 3x2V (680 cfm)', + 'CARBTRI', + 2 + ), + ( + 330023, + 330001, + 'Holley 4300 2x4V (1000 cfm)', + 'Carbquad', + 3 + ), + ( + 330024, + 330001, + 'Autolite 4V (350 cfm)', + 'CARBSING', + 1 + ), + ( + 330025, + 330001, + 'Autolite 4V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330026, + 330001, + 'Holley 4100 4V (780 cfm)', + 'CARBSING', + 2 + ), + ( + 330027, + 330001, + 'Corvette Cross-Fire Fuel Injection', + NULL, + 2 + ), + ( + 330028, + 330001, + 'Holley 4100 4V (850 cfm)', + 'CARBSING', + 3 + ), + (330029, 330001, 'Cadillac EFI', NULL, 1), + ( + 330030, + 330001, + 'Cadillac Tri-Power 3x2V (600 cfm)', + 'CARBTRI', + 2 + ), + ( + 330031, + 330001, + 'Rochester Tri-Power 3x2V (650 cfm)', + 'CARBTRI', + 2 + ), + ( + 330032, + 330001, + 'Chevrolet Turbo Thrust 4V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330033, + 330001, + 'Holley 4300 2x4V (800 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330034, + 330001, + 'Holley 4100 4V (735 cfm)', + 'CARBSING', + 2 + ), + ( + 330035, + 330001, + 'Carter AVS 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330036, + 330001, + 'Autolite 4100 4V (480 cfm)', + 'CARBSING', + 1 + ), + ( + 330037, + 330001, + 'Autolite 4100 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330038, + 330001, + 'Autolite 4300 4V (600 cfm)', + 'CARBSING', + 2 + ), + ( + 330039, + 330001, + 'Autolite 4300D 4V (715 cfm)', + 'CARBSING', + 2 + ), + ( + 330040, + 330001, + 'Holley 3x2V (600 cfm)', + 'CARBTRI', + 2 + ), + ( + 330041, + 330001, + 'Holley 4160 4V (1000 cfm)', + 'CARBSING', + 3 + ), + ( + 330042, + 330001, + 'Autolite 2100 2V (356 cfm)', + 'CARBSING', + 1 + ), + ( + 330043, + 330001, + 'Autolite 2100 2V (424 cfm)', + 'CARBSING', + 1 + ), + ( + 330044, + 330001, + 'Rochester Quadrajet 4V (715 cfm)', + 'CARBSING', + 2 + ), + ( + 330045, + 330001, + 'Holley Dominator 2V (550 cfm)', + 'CARBSING', + 2 + ), + ( + 330046, + 330001, + 'Holley Dominator 2V (650 cfm)', + 'CARBSING', + 2 + ), + ( + 330047, + 330001, + 'Holley Dominator 2V (675 cfm)', + 'CARBSING', + 2 + ), + ( + 330048, + 330001, + 'Holley Dominator 4V (1050 cfm)', + 'CARBSING', + 3 + ), + ( + 330049, + 330001, + 'Holley Dominator 4V (1150 cfm)', + 'CARBSING', + 3 + ), + ( + 330050, + 330001, + 'Holley Dominator 2x4V (1150 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330051, + 330001, + 'Holley Dominator 2x4V (1250 cfm)', + 'CARBDUAL', + 4 + ), + ( + 330052, + 330001, + 'Holley Dominator 4V (1250 cfm)', + 'CARBSING', + 4 + ), + ( + 330053, + 330001, + 'Carter 2V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330054, + 330001, + 'Carter AFB 4V (500 cfm) Carb', + 'CARBSING', + 1 + ), + ( + 330055, + 330001, + 'Rochester Monojet 2V (400 cfm)', + 'CARBSING', + 1 + ), + ( + 330056, + 330001, + 'Rochester Quadrajet 2x4V (600 cfm)', + 'CARBDUAL', + 2 + ), + ( + 330057, + 330001, + 'Rochester Quadrajet 4V (500 cfm)', + 'CARBSING', + 1 + ), + ( + 330058, + 330001, + 'Ramjet Fuel Injector RPO 579D', + NULL, + 2 + ), + ( + 330059, + 330001, + 'Rochester Monojet 2V (500 cfm)', + 'CARBSING', + 1 + ), + ( + 330060, + 330001, + 'Rochester Monojet 2V (600 cfm)', + 'CARBSING', + 1 + ), + ( + 330061, + 330001, + 'Rochester Quadrajet 4V (660 cfm) Carb', + 'CARBDUAL', + 1 + ), + ( + 330062, + 330001, + 'Autolite 2x4V (600 cfm)', + 'CARBDUAL', + 1 + ), + ( + 330063, + 330001, + 'Autolite 2100 2V (600 cfm)', + 'CARBSING', + 1 + ), + ( + 330064, + 330001, + 'Autolite 3x2V (860 cfm)', + 'CARBTRI', + 2 + ), + ( + 330065, + 330001, + 'Holley 3x2V (840 cfm)', + 'CARBTRI', + 2 + ), + ( + 330066, + 330001, + 'Carter 2V (600 cfm)', + 'CARBSING', + 1 + ), + ( + 330067, + 330001, + 'Carter AVS 4V (700 cfm)', + 'CARBDUAL', + 1 + ), + ( + 330068, + 330001, + 'Carter AVS 4V (800 cfm)', + 'CARBDUAL', + 2 + ), + ( + 330069, + 330001, + 'Edelbrock Performer 4V (500 cfm)', + 'CARBDUAL', + 2 + ), + ( + 330070, + 330001, + 'Edelbrock Performer 4V (750 cfm)', + 'CARBDUAL', + 2 + ), + ( + 330071, + 330001, + 'Edelbrock Q-Jet (850 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330072, + 330001, + 'Edelbrock Q-Jet (795 cfm)', + 'CARBDUAL', + 3 + ), + ( + 330073, + 330001, + 'Edelbrock Pro-Flo EFI System', + NULL, + 3 + ), + ( + 340001, + 340001, + 'Light Duty Air Cleaner', + 'airoil', + 1 + ), + ( + 340002, + 340001, + 'Normal Duty Air Cleaner', + 'airsnork', + 1 + ), + ( + 340003, + 340001, + 'Holley Hi-Tek Air Cleaner', + 'AIRSTD', + 2 + ), + ( + 340004, + 340001, + 'Edelbrock Pro-Flo 1000 XHD Air Cleaner', + 'airoval', + 4 + ), + ( + 340005, + 340001, + 'Tri-angular Air Cleaner', + 'AIRTRI', + 2 + ), + ( + 340006, + 340001, + 'Edelbrock Pro-Flo Round Air Cleaner', + 'AIRSTD', + 3 + ), + ( + 340007, + 340001, + 'Edelbrock Pro-Flo Oval Air Cleaner', + 'AIROVAL', + 3 + ), + ( + 340008, + 340001, + 'Edelbrock Pro-Flo Triangular Air Cleaner', + 'AIRTRI', + 3 + ), + ( + 340009, + 340001, + 'Edelbrock Elite Round Air Cleaner', + 'AIRSTD', + 2 + ), + ( + 340010, + 340001, + 'Edelbrock Elite Oval Air Cleaner', + 'AIROVAL', + 2 + ), + ( + 340011, + 340001, + 'Edelbrock Elite Triangular Air Cleaner', + 'AIRTRI', + 2 + ), + ( + 350001, + 350001, + 'Lindstrom P05 Blower', + 'BLOWSMAL', + 1 + ), + ( + 350002, + 350001, + 'Holley Street Blower', + 'BLOWSMAL', + 2 + ), + ( + 350003, + 350001, + 'Holley Street PowerCharger Blower', + 'BLOWSMAL', + 2 + ), + ( + 350004, + 350001, + 'Holley PowerCharger Blower', + 'BLOWLARG', + 3 + ), + ( + 350005, + 350001, + 'Holley MegaBlower', + 'BLOWLARG', + 4 + ), + ( + 350006, + 350001, + 'Weiand 671 Blower', + 'BLOWSMAL', + 3 + ), + ( + 350007, + 350001, + 'Weiand 871 Blower', + 'BLOWLARG', + 3 + ), + ( + 350008, + 350001, + 'Weiand 1071 Blower', + 'BLOWLARG', + 4 + ), + ( + 360001, + 360001, + 'Lindstrom Little Rabbit 5/1 NOS', + NULL, + 1 + ), + ( + 360002, + 360001, + 'Lindstrom Cheetah 15/5 NOS', + NULL, + 2 + ), + ( + 360003, + 360001, + 'Holley Powershot 125 NOS', + NULL, + 3 + ), + ( + 360004, + 360001, + 'Holley Super Powershot 200 NOS', + NULL, + 4 + ), + (360005, 360001, 'Holley Cheater 250 NOS', NULL, 4), + ( + 360006, + 360001, + 'Holley Sneeky Pete 75 NOS', + NULL, + 3 + ), + ( + 1000001, + 1000001, + 'Ford Y (9.0) 1.925i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000002, + 1000001, + 'Ford Flathead (6.15) Stock CH', + NULL, + 1 + ), + ( + 1000003, + 1000001, + 'Ford Flathead (6.8) Stock CH', + NULL, + 1 + ), + ( + 1000004, + 1000001, + 'Ford Flathead (7.2) Stock CH', + NULL, + 1 + ), + ( + 1000005, + 1000001, + 'Ford BB Low Riser (11.6) 2.09i/1.66e CH', + NULL, + 3 + ), + ( + 1000006, + 1000001, + 'Ford 385 Street Boss (10.5) 2.28i/1.90e CH', + NULL, + 3 + ), + ( + 1000007, + 1000001, + 'AMC (10.0) 1.787i/1.406e Stock CH', + NULL, + 1 + ), + ( + 1000008, + 1000001, + 'AMC (10.2) 2.02i/1.625e Stock CH', + NULL, + 2 + ), + ( + 1000009, + 1000001, + 'AMC (10.2) 2.02i/1.625e SS HP W/F CH', + NULL, + 3 + ), + ( + 1000010, + 1000001, + 'Pontiac (9.2) Stock W CH', + NULL, + 1 + ), + ( + 1000011, + 1000001, + 'Chrysler Hemi (10.25) 2.25i/1.90e Canted CH', + NULL, + 3 + ), + ( + 1000012, + 1000001, + 'Chrysler SB (10.5) AAR W/P CH', + NULL, + 2 + ), + ( + 1000013, + 1000001, + 'Chrysler SB (10.5) 1.78i/1.50e Wedge CH', + NULL, + 1 + ), + ( + 1000014, + 1000001, + 'Olds SB (9.0) Stock CH', + NULL, + 1 + ), + ( + 1000015, + 1000001, + 'Chevrolet SB (9.5) Wedge CH', + NULL, + 1 + ), + ( + 1000016, + 1000001, + 'Pontiac (10.5) Wedge CH', + NULL, + 1 + ), + ( + 1000017, + 1000001, + 'Olds BB (10.25) Stock CH', + NULL, + 1 + ), + (1000018, 1000001, 'Pontiac (10.75) W CH', NULL, 2), + ( + 1000019, + 1000001, + 'Chevrolet BB HP (11.0) Canted CH', + NULL, + 3 + ), + ( + 1000020, + 1000001, + 'Ford Flathead (7.5) Denver CH', + NULL, + 2 + ), + (1000021, 1000001, 'Olds BB (8.5) CH', NULL, 1), + ( + 1000022, + 1000001, + 'Chevrolet W (10.25) 2.07i/1.72e CH', + NULL, + 2 + ), + ( + 1000023, + 1000001, + 'Chevrolet BB L72 (11.0) HP CH', + NULL, + 3 + ), + ( + 1000024, + 1000001, + 'Chevrolet BB L88 Aluminum (12.5) HP CH', + NULL, + 4 + ), + ( + 1000025, + 1000001, + 'Chevrolet BB L89 Aluminum (11.0) HP CH', + NULL, + 3 + ), + ( + 1000026, + 1000001, + 'Ford Y 1957 (9.0) 1.925i/1.51e Stock CH', + NULL, + 2 + ), + ( + 1000027, + 1000001, + 'Ford 385 (8.5) 2.08i/1.66e Canted CH', + NULL, + 1 + ), + ( + 1000028, + 1000001, + 'Ford 385 (11.0) 2.08i/1.66e Canted CH', + NULL, + 3 + ), + ( + 1000029, + 1000001, + 'Ford Cleveland (9.2) 2.19i/1.71e HP Canted CH', + NULL, + 3 + ), + ( + 1000030, + 1000001, + 'Ford BB (9.6) 2.04i/1.57e W CH', + NULL, + 2 + ), + ( + 1000031, + 1000001, + 'Ford BB (11.4) 2.09i/1.66e W/P CH', + NULL, + 2 + ), + ( + 1000032, + 1000001, + 'Ford BB High Riser (11.5) 2.195i/1.73e CH', + NULL, + 3 + ), + ( + 1000033, + 1000001, + 'Ford BB Cammer 2.25i/1.90e HP CH', + NULL, + 4 + ), + ( + 1000034, + 1000001, + 'Ford 385 (10.5) 2.08i/1.66e Canted CH', + NULL, + 2 + ), + ( + 1000035, + 1000001, + 'Ford 385 (11.3) 2.25i/1.72e CJ HP CH', + NULL, + 3 + ), + ( + 1000037, + 1000001, + 'Pontiac (10.0) W/P CH', + NULL, + 3 + ), + ( + 1000038, + 1000001, + 'Chrysler BB (11.0) Max Wedge I CH', + NULL, + 3 + ), + ( + 1000039, + 1000001, + 'Chrysler BB (13.5) Max Wedge I HP CH', + NULL, + 4 + ), + ( + 1000040, + 1000001, + 'Edelbrock Performer RPM (9.25) Chevy SB CH', + NULL, + 3 + ), + ( + 1000041, + 1000001, + 'Edelbrock Performer RPM (10.5) Chevy SB CH', + NULL, + 3 + ), + ( + 1000042, + 1000001, + 'Edelbrock Performer (9.25) Chevy SB CH', + NULL, + 2 + ), + ( + 1000043, + 1000001, + 'Edelbrock Performer (10.5) Chevrolet SB CH', + NULL, + 2 + ), + ( + 1000044, + 1000001, + 'Edelbrock Performer RPM 454-O Chevy BB (9.5) CH', + NULL, + 2 + ), + ( + 1000045, + 1000001, + 'Edelbrock Performer 454-O Chevy BB (9.5) CH', + NULL, + 2 + ), + ( + 1000046, + 1000001, + 'Edelbrock Performer RPM 454-R Chevy BB (9.5) CH', + NULL, + 3 + ), + ( + 1000047, + 1000001, + 'Edelbrock Performer RPM (11.5) Chevy SB CH', + NULL, + 3 + ), + ( + 1000048, + 1000001, + 'Buick BB (10.0) 2.0i/1.625e Stock', + NULL, + 1 + ), + (1000049, 1000001, 'Pontiac (12.0) Wedge', NULL, 3), + (1000050, 1000001, 'Pontiac (13.0) Wedge', NULL, 4), + ( + 1000051, + 1000001, + 'Pontiac Ram Air II Cylinder Head', + NULL, + 2 + ), + ( + 1000052, + 1000001, + 'Ford BB Medium Riser (11.6) 2.195i/1.73e CH', + NULL, + 3 + ), + ( + 1000053, + 1000001, + 'Ford BB (10.6) 2.04i/1.57e W/P CH', + NULL, + 2 + ), + ( + 1000054, + 1000001, + 'Ford 385 2.37i/1.90e NASCAR CH', + NULL, + 4 + ), + ( + 1000055, + 1000001, + 'Chrysler BB (12.5) Max Wedge III CH', + NULL, + 3 + ), + ( + 1000056, + 1000001, + 'Chevrolet W (10.25) 2.19/1.73 CH', + NULL, + 3 + ), + ( + 1000057, + 1000001, + 'Chevrolet W (10.25) 1.94/1.65 CH', + NULL, + 2 + ), + ( + 1000058, + 1000001, + 'Ford Cleveland Boss 351 (11.7) 2.19i/1.71e CH', + NULL, + 3 + ), + ( + 1000060, + 1000001, + 'Buick Nailhead Wedge (8.5)', + NULL, + 1 + ), + ( + 1000061, + 1000001, + 'Ford SB (10.5) 1.78i/1.45e HP Wedge CH', + NULL, + 2 + ), + ( + 1000063, + 1000001, + 'Buick BB (8.5) 2.0i/1.625e Wedge CH', + NULL, + 1 + ), + (1000064, 1000001, 'Buick SB Wedge (8.5)', NULL, 1), + (1000065, 1000001, 'Buick SB Wedge (9.0)', NULL, 1), + ( + 1000066, + 1000001, + 'Buick SB Wedge (10.25)', + NULL, + 2 + ), + ( + 1000067, + 1000001, + 'Cadillac BB Stock (9.1)', + NULL, + 1 + ), + ( + 1000068, + 1000001, + 'Cadillac BB Wedge (10.5)', + NULL, + 1 + ), + ( + 1000069, + 1000001, + 'Chevrolet SB Wedge (8.0)', + NULL, + 1 + ), + ( + 1000070, + 1000001, + 'Chevrolet SB Wedge (9.25)', + NULL, + 1 + ), + ( + 1000071, + 1000001, + 'Chevrolet SB Stock Wedge (10.5) 1.72i/1.50e', + NULL, + 2 + ), + ( + 1000072, + 1000001, + 'Chevrolet SB Wedge (11.0)', + NULL, + 2 + ), + ( + 1000073, + 1000001, + 'Chevrolet SB Wedge (11.25) 1.94i/1.50e', + NULL, + 2 + ), + ( + 1000074, + 1000001, + 'Chevrolet SB Wedge (9.0)', + NULL, + 1 + ), + ( + 1000075, + 1000001, + 'Chevrolet BB Canted (10.25)', + NULL, + 3 + ), + ( + 1000076, + 1000001, + 'Chevrolet BB Canted ZL1 (12.0)', + NULL, + 3 + ), + ( + 1000077, + 1000001, + 'Chevrolet BB Canted LS6 (9.0)', + NULL, + 2 + ), + ( + 1000078, + 1000001, + 'Olds SB (10.25) Stock CH', + NULL, + 1 + ), + ( + 1000079, + 1000001, + 'Olds SB (10.5) W-31 CH', + NULL, + 3 + ), + ( + 1000080, + 1000001, + 'Olds BB (10.5) Stock CH', + NULL, + 2 + ), + ( + 1000081, + 1000001, + 'Olds BB (9.0) Stock CH', + NULL, + 1 + ), + ( + 1000082, + 1000001, + 'Olds BB (10.25) Stock CH', + NULL, + 2 + ), + ( + 1000083, + 1000001, + 'Olds BB (10.5) W-30 CH', + NULL, + 3 + ), + ( + 1000084, + 1000001, + 'Pontiac (8.6) Stock W CH', + NULL, + 1 + ), + ( + 1000085, + 1000001, + 'Pontiac (10.0) Stock W CH', + NULL, + 2 + ), + ( + 1000086, + 1000001, + 'Pontiac (11.0) SD W CH', + NULL, + 3 + ), + ( + 1000087, + 1000001, + 'Pontiac (10.75) HO W CH', + NULL, + 3 + ), + (1000088, 1000001, 'Pontiac (10.5) W CH', NULL, 2), + ( + 1000089, + 1000001, + 'Pontiac (10.25) W CH', + NULL, + 2 + ), + ( + 1000090, + 1000001, + 'Pontiac (10.0) Stock W CH', + NULL, + 1 + ), + ( + 1000091, + 1000001, + 'Pontiac (8.4) SD W CH', + NULL, + 2 + ), + ( + 1000092, + 1000001, + 'Ford Y (7.6) 1.78i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000093, + 1000001, + 'Ford Y (8.5) 1.78i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000094, + 1000001, + 'Ford Y (8.1) 1.78i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000095, + 1000001, + 'Ford Y (8.0) 1.78i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000096, + 1000001, + 'Ford Y (8.4) 1.78i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000097, + 1000001, + 'Ford Y (8.6) 1.925i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000098, + 1000001, + 'Ford Y (9.7) 1.925i/1.51e Stock CH', + NULL, + 2 + ), + ( + 1000099, + 1000001, + 'Ford Y (8.3) 1.925i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000100, + 1000001, + 'Ford Y (8.8) 1.925i/1.51e Stock CH', + NULL, + 1 + ), + ( + 1000101, + 1000001, + 'Ford Y (9.6) 1.925i/1.51e Stock CH', + NULL, + 2 + ), + ( + 1000102, + 1000001, + 'Ford BB (12.1) 2.09i/1.66e Wedge CH', + NULL, + 3 + ), + ( + 1000103, + 1000001, + 'Ford BB (11.0) 2.04i/1.57e Wedge CH', + NULL, + 2 + ), + ( + 1000104, + 1000001, + 'Ford BB (10.1) 2.04i/1.57e Wedge CH', + NULL, + 2 + ), + ( + 1000105, + 1000001, + 'Ford BB (9.4) 2.04i/1.57e Wedge CH', + NULL, + 1 + ), + ( + 1000106, + 1000001, + 'Ford Cleveland (9.5) 2.05i/1.65e CH', + NULL, + 2 + ), + ( + 1000107, + 1000001, + 'Ford Cleveland (11.0) 2.19i/1.71e CH', + NULL, + 3 + ), + ( + 1000108, + 1000001, + 'Ford Cleveland (9.0) 2.19i/1.71e CH', + NULL, + 2 + ), + ( + 1000109, + 1000001, + 'Ford Cleveland (8.6) 2.05i/1.65e CH', + NULL, + 1 + ), + ( + 1000111, + 1000001, + 'Ford 385 (10.2) 2.08i/1.66e Canted CH', + NULL, + 3 + ), + ( + 1000112, + 1000001, + 'Chrysler BB (10.0) Large Port W CH', + NULL, + 2 + ), + ( + 1000113, + 1000001, + 'Chrysler BB (9.6) W CH', + NULL, + 1 + ), + ( + 1000114, + 1000001, + 'Chrysler BB (9.2) W CH', + NULL, + 1 + ), + ( + 1000115, + 1000001, + 'Chrysler SB (8.8) 1.78i/1.50e Stock W CH', + NULL, + 1 + ), + ( + 1000116, + 1000001, + 'Chrysler SB (10.5) 2.02i/1.60e Stock W CH', + NULL, + 2 + ), + ( + 1000117, + 1000001, + 'Chrysler SB (9.0) Stock W CH', + NULL, + 1 + ), + ( + 1000118, + 1000001, + 'Chrysler SB (9.2) Stock W CH', + NULL, + 1 + ), + ( + 1000119, + 1000001, + 'Chrysler BB (10.0) W CH', + NULL, + 1 + ), + ( + 1000120, + 1000001, + 'Chevrolet SB Large Valve Wedge (10.5)', + NULL, + 2 + ), + ( + 1000121, + 1000001, + 'Chevrolet SB Wedge (10.25)', + NULL, + 2 + ), + ( + 1000122, + 1000001, + 'Chevrolet SB Wedge (8.5)', + NULL, + 1 + ), + ( + 1000123, + 1000001, + 'Chevrolet SB Wedge (10.5) 1.94i/1.50e', + NULL, + 2 + ), + ( + 1000124, + 1000001, + 'Chevrolet SB Wedge (11.25) 2.02i/1.60e', + NULL, + 2 + ), + ( + 1000125, + 1000001, + 'Chevrolet BB L36 Canted (10.25)', + NULL, + 2 + ), + ( + 1000126, + 1000001, + 'Pontiac (10.25) Stock W CH', + NULL, + 1 + ), + ( + 1000127, + 1000001, + 'Pontiac (10.75) W/P CH', + NULL, + 3 + ), + (1000128, 1000001, 'Pontiac (10.75) W CH', NULL, 2), + ( + 1000129, + 1000001, + 'Pontiac (11.0) SD 2.02i/1.76e W CH', + NULL, + 3 + ), + ( + 1000130, + 1000001, + 'Pontiac Ram Air V Cylinder Head', + NULL, + 3 + ), + ( + 1000131, + 1000001, + 'Ford BB (10.2) 2.04i/1.57e Wedge CH', + NULL, + 2 + ), + ( + 1000132, + 1000001, + 'Ford BB (8.9) 2.04i/1.57e Wedge CH', + NULL, + 1 + ), + ( + 1000133, + 1000001, + 'Ford BB (10.5) 2.04i/1.57e Wedge CH', + NULL, + 2 + ), + ( + 1000134, + 1000001, + 'Ford SB (8.7) 1.67i/1.45e Wedge CH', + NULL, + 1 + ), + ( + 1000135, + 1000001, + 'Ford SB (10.5) 1.67i/1.45e HP Wedge CH', + NULL, + 2 + ), + ( + 1000136, + 1000001, + 'Ford SB (9.0) 1.67i/1.45e Wedge CH', + NULL, + 1 + ), + ( + 1000137, + 1000001, + 'Ford SB (10.0) 1.78i/1.45e Wedge CH', + NULL, + 1 + ), + ( + 1000138, + 1000001, + 'Ford SB Boss (10.5) 2.23i/1.72e Canted CH', + NULL, + 3 + ), + ( + 1000139, + 1000001, + 'Ford SB (9.5) 1.84i/1.54e Wedge CH', + NULL, + 2 + ), + ( + 1000140, + 1000001, + 'Ford SB (10.7) 1.84i/1.54e Wedge CH', + NULL, + 2 + ), + ( + 1000141, + 1000001, + 'Chrysler BB (8.2) W CH', + NULL, + 1 + ), + ( + 1000142, + 1000001, + 'Chrysler BB (11.0) Max Wedge III Cylinder Head', + NULL, + 3 + ), + ( + 1000143, + 1000001, + 'Chrysler BB (10.5) W CH', + NULL, + 2 + ), + ( + 1000144, + 1000001, + 'Buick BB Stage I (10) 2.12i/1.75e CH', + NULL, + 2 + ), + ( + 1000145, + 1000001, + 'Pontiac (8.0) Stock W CH', + NULL, + 1 + ), + ( + 1000146, + 1000001, + 'Chevrolet BB (8.5) Stock CH', + NULL, + 1 + ), + ( + 1000147, + 1000001, + 'Shade Tree Chevrolet SB (8.0)', + NULL, + 1 + ), + ( + 1000148, + 1000001, + 'AMC (9.0) 1.787i/1.406e Stock CH', + NULL, + 1 + ), + ( + 1000149, + 1000001, + 'AMC (9.0) 2.02i/1.625e Stock CH', + NULL, + 1 + ), + ( + 1000150, + 1000001, + 'AMC (10.0) 2.02i/1.625e Stock CH', + NULL, + 2 + ), + ( + 1000151, + 1000001, + 'AMC (10.0) 2.02i/1.625e Dog Leg CH', + NULL, + 2 + ), + ( + 1000152, + 1000001, + 'Cadillac L-Head Stock CH', + NULL, + 1 + ), + ( + 1000153, + 1000001, + 'Buick BB (10.25) 2.0i/1.625e Wedge CH', + NULL, + 2 + ), + ( + 1000154, + 1000001, + 'Chevrolet W (10.25) 2.19/1.73 Z11 CH', + NULL, + 3 + ), + ( + 1000155, + 1000001, + 'Cadillac L-Head (7.5) CH', + NULL, + 2 + ), + ( + 1000156, + 1000001, + 'Cadillac L-Head (7.8) CH', + NULL, + 2 + ), + ( + 1000157, + 1000001, + 'Cadillac L-Head (8.0) CH', + NULL, + 2 + ), + ( + 1000158, + 1000001, + 'Cadillac L-Head (8.2) CH', + NULL, + 2 + ), + ( + 1000159, + 1000001, + 'Buick Nailhead (8.75) CH', + NULL, + 2 + ), + ( + 1000160, + 1000001, + 'Buick Nailhead (9.0) CH', + NULL, + 2 + ), + ( + 1000161, + 1000001, + 'Buick Nailhead (10.25) CH', + NULL, + 3 + ), + ( + 1000162, + 1000001, + 'Buick Nailhead (10.5) CH', + NULL, + 3 + ), + ( + 1000163, + 1000001, + 'Cadillac (9.75) Wedge CH', + NULL, + 2 + ), + ( + 1000164, + 1000001, + 'Cadillac (10.0) Wedge CH', + NULL, + 2 + ), + ( + 1000165, + 1000001, + 'Hemi (10.5) Canted CH', + NULL, + 3 + ), + ( + 1000166, + 1000001, + 'Hemi (10.75) Canted CH', + NULL, + 3 + ), + ( + 1000167, + 1000001, + 'Edelbrock Ford Flathead Cylinder Head', + NULL, + 3 + ), + ( + 1000168, + 1000001, + 'Holley SystemMax Chevrolet BB CH', + NULL, + 4 + ), + (1000169, 1000001, 'AMC NASCAR CH', NULL, 4), + ( + 1000170, + 1000001, + 'AMC (9.5) 2.02i/1.68e Stock CH', + NULL, + 2 + ), + ( + 1000171, + 1000001, + 'AMC (8.5) 2.02i/1.68e Stock CH', + NULL, + 1 + ), + ( + 1000172, + 1000001, + 'Ford SB (9.0) 1.84i/1.54e Wedge CH', + NULL, + 1 + ), + ( + 1000173, + 1000001, + 'Ford SB Boss (10.5) 2.19i/1.72e Canted CH', + NULL, + 3 + ), + ( + 1000174, + 1000001, + 'Ford SB TP (10.0) 2.12i/1.54e Wedge CH', + NULL, + 3 + ), + ( + 1100001, + 1100001, + 'Chevrolet SB Stock Cam', + NULL, + 1 + ), + ( + 1100002, + 1100001, + 'Chrysler SB Barracuda Cam', + NULL, + 1 + ), + ( + 1100003, + 1100001, + 'Edelbrock Performer Plus Chrysler SB HP Cam', + NULL, + 3 + ), + ( + 1100004, + 1100001, + 'Edelbrock Performer RPM Chrysler SB HP Cam', + NULL, + 2 + ), + (1100005, 1100001, 'Ford SB Stock Cam', NULL, 1), + ( + 1100006, + 1100001, + 'Reed TorqueMaster Chrysler SB HP Cam', + NULL, + 2 + ), + ( + 1100007, + 1100001, + 'Reed XLH Chrysler SB DP Cam', + NULL, + 3 + ), + ( + 1100008, + 1100001, + 'Crane PowerMax HP Chrysler SB Cam', + NULL, + 2 + ), + ( + 1100009, + 1100001, + 'Crane Saturday Night Special Chrysler SB Cam', + NULL, + 3 + ), + ( + 1100010, + 1100001, + 'Edelbrock Torker-Plus Chrysler SB DP Cam', + NULL, + 3 + ), + (1100011, 1100001, 'Buick BB Stock Cam', NULL, 1), + (1100012, 1100001, 'Buick SB Stock Cam', NULL, 1), + ( + 1100013, + 1100001, + 'Cadillac BB Stock Cam', + NULL, + 1 + ), + ( + 1100014, + 1100001, + 'Chevrolet BB Stock Cam', + NULL, + 1 + ), + (1100015, 1100001, 'Chevrolet SB HP Cam', NULL, 2), + ( + 1100016, + 1100001, + 'Chrysler BB Stock Cam', + NULL, + 1 + ), + ( + 1100017, + 1100001, + 'Chrysler SB Stock Cam', + NULL, + 1 + ), + (1100018, 1100001, 'Ford BB Stock Cam', NULL, 1), + (1100019, 1100001, 'Ford SB HP Cam', NULL, 2), + ( + 1100020, + 1100001, + 'Ford Flathead Stock Cam', + NULL, + 1 + ), + ( + 1100021, + 1100001, + 'Oldsmobile BB Stock Cam', + NULL, + 1 + ), + ( + 1100022, + 1100001, + 'Oldsmobile SB Stock Cam', + NULL, + 1 + ), + (1100023, 1100001, 'AMC Stock Cam', NULL, 1), + (1100024, 1100001, 'Pontiac Stock Cam', NULL, 1), + ( + 1100025, + 1100001, + 'Chevrolet SB Stock Hi-Lift Cam', + NULL, + 1 + ), + ( + 1100026, + 1100001, + 'Chevrolet SB HP Duntov Cam', + NULL, + 3 + ), + (1100028, 1100001, 'Chevrolet BB HP Cam', NULL, 2), + ( + 1100029, + 1100001, + 'Chevrolet BB HP LS7 Cam', + NULL, + 3 + ), + ( + 1100030, + 1100001, + 'Buick BB 1968 Stage I Cam', + NULL, + 1 + ), + ( + 1100031, + 1100001, + 'Buick BB 1969 Stage I Cam', + NULL, + 2 + ), + ( + 1100032, + 1100001, + 'Buick BB Stage II Cam', + NULL, + 2 + ), + ( + 1100033, + 1100001, + 'Oldsmobile SB W31 Performance Cam', + NULL, + 2 + ), + ( + 1100034, + 1100001, + 'Oldsmobile BB W30 Performance Cam', + NULL, + 2 + ), + (1100035, 1100001, 'Pontiac SD Cam', NULL, 3), + ( + 1100036, + 1100001, + 'Pontiac Ram Air I Cam', + NULL, + 2 + ), + ( + 1100037, + 1100001, + 'Pontiac Ram Air IV Cam', + NULL, + 3 + ), + (1100038, 1100001, 'Pontiac SD Cam', NULL, 3), + (1100039, 1100001, 'Pontiac HO Cam', NULL, 2), + (1100040, 1100001, 'Ford Y Truck Cam', NULL, 1), + (1100041, 1100001, 'Ford BB HO Cam', NULL, 2), + (1100042, 1100001, 'Ford BB HO Mild Cam', NULL, 2), + (1100043, 1100001, 'Ford BB Cammer Cam', NULL, 4), + (1100044, 1100001, 'Ford BB PI Cam', NULL, 2), + (1100045, 1100001, 'Ford 385 Boss Cam', NULL, 3), + (1100046, 1100001, 'Chrysler BB HP Cam', NULL, 2), + ( + 1100047, + 1100001, + 'Chrysler BB Max Wedge I Cam', + NULL, + 2 + ), + ( + 1100048, + 1100001, + 'Chrysler BB Max Wedge III Cam', + NULL, + 3 + ), + (1100049, 1100001, 'Chrysler Hemi Cam', NULL, 3), + (1100050, 1100001, 'Chrysler SB AAR Cam', NULL, 2), + (1100051, 1100001, 'AMC Group 19 Cam', NULL, 2), + (1100052, 1100001, 'AMC SS/AMX Cam', NULL, 3), + ( + 1100054, + 1100001, + 'Crane PowerMax HP Cadillac BB Cam', + NULL, + 2 + ), + ( + 1100055, + 1100001, + 'Crane PowerMax HP Buick BB Cam', + NULL, + 2 + ), + ( + 1100056, + 1100001, + 'Crane PowerMax HP Buick SB Cam', + NULL, + 2 + ), + ( + 1100057, + 1100001, + 'Crane PowerMax HP Chevrolet BB Cam', + NULL, + 2 + ), + ( + 1100058, + 1100001, + 'Crane PowerMax HP Chevrolet SB Cam', + NULL, + 2 + ), + ( + 1100059, + 1100001, + 'Crane PowerMax HP Chrysler BB Cam', + NULL, + 2 + ), + ( + 1100060, + 1100001, + 'Crane PowerMax HP Ford BB Cam', + NULL, + 2 + ), + ( + 1100061, + 1100001, + 'Crane PowerMax HP Ford SB Cam', + NULL, + 2 + ), + ( + 1100062, + 1100001, + 'Crane PowerMax HP Olds BB Cam', + NULL, + 2 + ), + ( + 1100063, + 1100001, + 'Crane PowerMax HP Olds SB Cam', + NULL, + 2 + ), + ( + 1100064, + 1100001, + 'Crane PowerMax HP Pontiac Cam', + NULL, + 2 + ), + (1100065, 1100001, 'Shade Tree Hemi Cam', NULL, 2), + ( + 1100066, + 1100001, + 'Crane Saturday Night Special Chrysler BB Cam', + NULL, + 3 + ), + ( + 1100067, + 1100001, + 'Crane Saturday Night Special Buick BB Cam', + NULL, + 3 + ), + ( + 1100068, + 1100001, + 'Crane Saturday Night Special Buick SB Cam', + NULL, + 3 + ), + ( + 1100069, + 1100001, + 'Crane Saturday Night Special Chevrolet BB Cam', + NULL, + 3 + ), + ( + 1100070, + 1100001, + 'Crane Saturday Night Special Chevrolet SB Cam', + NULL, + 3 + ), + ( + 1100071, + 1100001, + 'Crane Saturday Night Special Ford BB Cam', + NULL, + 3 + ), + ( + 1100072, + 1100001, + 'Crane Saturday Night Special Ford SB Cam', + NULL, + 3 + ), + ( + 1100073, + 1100001, + 'Crane Saturday Night Special Olds BB Cam', + NULL, + 3 + ), + ( + 1100074, + 1100001, + 'Crane Saturday Night Special Olds SB Cam', + NULL, + 3 + ), + ( + 1100075, + 1100001, + 'Crane Saturday Night Special Pontiac Cam', + NULL, + 3 + ), + ( + 1100076, + 1100001, + 'Crane Saturday Night Special Chevy W Cam', + NULL, + 3 + ), + ( + 1100077, + 1100001, + 'Edelbrock Performer Plus Chevrolet SB HP Cam', + NULL, + 3 + ), + ( + 1100078, + 1100001, + 'Edelbrock Performer Plus Ford SB HP Cam', + NULL, + 3 + ), + ( + 1100079, + 1100001, + 'Edelbrock Performer Plus Ford BB HP Cam', + NULL, + 3 + ), + ( + 1100080, + 1100001, + 'Edelbrock Performer RPM Chrysler BB HP Cam', + NULL, + 2 + ), + ( + 1100081, + 1100001, + 'Edelbrock Performer RPM Buick BB HP Cam', + NULL, + 2 + ), + ( + 1100082, + 1100001, + 'Edelbrock Performer RPM Chevrolet BB HP Cam', + NULL, + 2 + ), + ( + 1100083, + 1100001, + 'Edelbrock Performer RPM Chevrolet SB HP Cam', + NULL, + 2 + ), + ( + 1100084, + 1100001, + 'Edelbrock Performer RPM Ford BB HP Cam', + NULL, + 2 + ), + ( + 1100085, + 1100001, + 'Edelbrock Performer RPM Ford SB HP Cam', + NULL, + 2 + ), + ( + 1100087, + 1100001, + 'Edelbrock Performer RPM Olds SB HP Cam', + NULL, + 2 + ), + ( + 1100088, + 1100001, + 'Edelbrock Performer RPM Pontiac HP Cam', + NULL, + 2 + ), + ( + 1100090, + 1100001, + 'Edelbrock Torker-Plus Chrysler BB DP Cam', + NULL, + 3 + ), + ( + 1100092, + 1100001, + 'Edelbrock Torker-Plus Chevrolet BB DP Cam', + NULL, + 3 + ), + ( + 1100093, + 1100001, + 'Edelbrock Torker-Plus Chevrolet SB DP Cam', + NULL, + 3 + ), + ( + 1100094, + 1100001, + 'Edelbrock Torker-Plus Ford BB DP Cam', + NULL, + 3 + ), + ( + 1100095, + 1100001, + 'Edelbrock Torker-Plus Ford SB DP Cam', + NULL, + 3 + ), + ( + 1100098, + 1100001, + 'Edelbrock Torker-Plus Pontiac DP Cam', + NULL, + 3 + ), + (1100100, 1100001, 'Oldsmobile BB HP Cam', NULL, 2), + ( + 1100101, + 1100001, + 'Pontiac m/t Stock Cam', + NULL, + 1 + ), + ( + 1100102, + 1100001, + 'Pontiac Trophy (HP) Cam', + NULL, + 2 + ), + (1100103, 1100001, 'Ford SB HP Cam', NULL, 2), + ( + 1100104, + 1100001, + 'Ford SB Special Stock Cam', + NULL, + 1 + ), + ( + 1100105, + 1100001, + 'Ford Flathead Power Cam', + NULL, + 2 + ), + ( + 1100106, + 1100001, + 'Buick SB Special Stock Cam', + NULL, + 1 + ), + ( + 1100107, + 1100001, + 'Cadillac BB Midrange Cam', + NULL, + 2 + ), + ( + 1100108, + 1100001, + 'Chevrolet BB Midrange Cam', + NULL, + 2 + ), + ( + 1100109, + 1100001, + 'Chevrolet SB Special Stock Cam', + NULL, + 1 + ), + ( + 1100110, + 1100001, + 'Chrysler BB Midrange Cam', + NULL, + 2 + ), + ( + 1100111, + 1100001, + 'Oldsmobile BB Special Stock Cam', + NULL, + 1 + ), + (1100112, 1100001, 'Pontiac Midrange Cam', NULL, 2), + ( + 1100113, + 1100001, + 'Shade Tree Chevrolet SB Stock Cam', + NULL, + 1 + ), + ( + 1100114, + 1100001, + 'Cadillac L-Head Camshaft', + NULL, + 1 + ), + ( + 1100115, + 1100001, + 'Buick Nailhead Stock 322 Camshaft', + NULL, + 1 + ), + ( + 1100116, + 1100001, + 'Ford Cleveland Block Stock Camshaft', + NULL, + 1 + ), + ( + 1100117, + 1100001, + 'Ford Cleveland Block Boss Camshaft', + NULL, + 2 + ), + ( + 1100118, + 1100001, + 'Ford Cleveland Block HO Camshaft', + NULL, + 2 + ), + ( + 1100119, + 1100001, + 'Ford 385 Block Stock Camshaft', + NULL, + 1 + ), + ( + 1100120, + 1100001, + 'Ford 385 Block Special Stock Camshaft', + NULL, + 1 + ), + ( + 1100121, + 1100001, + 'Ford Y Stock Camshaft', + NULL, + 1 + ), + ( + 1100122, + 1100001, + 'Chevrolet W Stock Camshaft', + NULL, + 1 + ), + ( + 1100123, + 1100001, + 'Chevrolet W HP Camshaft', + NULL, + 2 + ), + ( + 1100124, + 1100001, + 'Chevrolet W Z11 Camshaft', + NULL, + 3 + ), + ( + 1100125, + 1100001, + 'Buick Nailhead Power Plus', + NULL, + 2 + ), + (1100126, 1100001, 'Buick Nailhead HP', NULL, 2), + ( + 1100127, + 1100001, + 'Cadillac L-Head Power Plus', + NULL, + 2 + ), + (1100128, 1100001, 'Cadillac L-Head HP', NULL, 2), + (1100129, 1100001, 'Ford Y E4 Low Range', NULL, 2), + ( + 1100130, + 1100001, + 'Edelbrock Performer Plus AMC Camshaft', + NULL, + 3 + ), + (1100131, 1100001, 'AMC WG Camshaft', NULL, 2), + ( + 1100132, + 1100001, + 'Edelbrock Performer Plus Olds SB HP Cam', + NULL, + 3 + ), + ( + 1100133, + 1100001, + 'Edelbrock Performer Plus Olds BB HP Cam', + NULL, + 3 + ), + ( + 1100134, + 1100001, + 'Fyne Grind Y Block Street 36 Cam', + NULL, + 1 + ), + ( + 1100135, + 1100001, + 'Fyne Grind Y Block Street 39 Cam', + NULL, + 1 + ), + ( + 1100136, + 1100001, + 'Fyne Grind Y Block Street 40 Cam', + NULL, + 1 + ), + ( + 1100137, + 1100001, + 'Fyne Grind Y Block Super 39 HP Cam', + NULL, + 2 + ), + ( + 1100138, + 1100001, + 'Fyne Grind Y Block Super 40 HP Cam', + NULL, + 2 + ), + ( + 1100139, + 1100001, + 'Fyne Grind Y Block Super 43 HP Cam', + NULL, + 2 + ), + ( + 1100140, + 1100001, + 'Fyne Grind Y Block Super 44 HP Cam', + NULL, + 2 + ), + ( + 1100141, + 1100001, + 'Fyne Grind Y Block Ultra 44 DP Cam', + NULL, + 3 + ), + ( + 1100142, + 1100001, + 'Fyne Grind Y Block Ultra 48 DP Cam', + NULL, + 3 + ), + ( + 1100143, + 1100001, + 'Fyne Grind Buick Nailhead Street 45 Cam', + NULL, + 2 + ), + ( + 1100144, + 1100001, + 'Fyne Grind Buick Nailhead Street 47 Cam', + NULL, + 2 + ), + ( + 1100145, + 1100001, + 'Fyne Grind Buick Nailhead Street 48 Cam', + NULL, + 2 + ), + ( + 1100146, + 1100001, + 'Fyne Grind Buick Nailhead Super 47 Cam', + NULL, + 3 + ), + ( + 1100147, + 1100001, + 'Fyne Grind Buick Nailhead Super 49 Cam', + NULL, + 3 + ), + ( + 1100148, + 1100001, + 'Buick Nailhead Stock 401 Cam', + NULL, + 1 + ), + ( + 1100149, + 1100001, + 'Buick Nailhead Stock 425 Cam', + NULL, + 1 + ), + ( + 1100150, + 1100001, + 'Oldfield Ford 385 Street King Cam', + NULL, + 2 + ), + ( + 1100151, + 1100001, + 'Oldfield Cleveland Street King Cam', + NULL, + 2 + ), + ( + 1100152, + 1100001, + 'Oldfield Cleveland New Boss Cam', + NULL, + 3 + ), + ( + 1100153, + 1100001, + 'Oldfield Ford 385 New Boss Cam', + NULL, + 3 + ), + ( + 1100154, + 1100001, + 'Walter Hemi Blueprint Classic Cam', + NULL, + 2 + ), + ( + 1100155, + 1100001, + 'Walter Hemi Extra Stock Cam', + NULL, + 3 + ), + ( + 1100156, + 1100001, + 'Leland Cadillac BB Highway Plus Cam', + NULL, + 1 + ), + ( + 1100157, + 1100001, + 'Leland Cadillac BB Streeter Cam', + NULL, + 2 + ), + ( + 1100158, + 1100001, + 'Leland Cadillac Racing Cam', + NULL, + 4 + ), + ( + 1100159, + 1100001, + 'Walter Hemi Bighorn Cam', + NULL, + 4 + ), + ( + 1100160, + 1100001, + 'Chevrolet Chevy SB Corvette (220hp) Cam', + NULL, + 1 + ), + ( + 1100161, + 1100001, + 'Ford 88 Flathead Camshaft', + NULL, + 2 + ), + ( + 1200001, + 1200001, + 'Chevrolet BB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200002, + 1200001, + 'Chrysler SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200003, + 1200001, + 'Ford BB Stock Hydraulic Valve Train', + NULL, + 1 + ), + ( + 1200004, + 1200001, + 'Crane PowerMax Ford BB VT', + NULL, + 2 + ), + ( + 1200005, + 1200001, + 'Ford 385 Boss Solid Lifter Valve Train', + NULL, + 2 + ), + ( + 1200006, + 1200001, + 'Chevrolet BB Hi-Lift Hydraulic Valve Train', + NULL, + 2 + ), + ( + 1200007, + 1200001, + 'Chrysler BB Max Wedge III Valve Train', + NULL, + 3 + ), + ( + 1200008, + 1200001, + 'Crane Energizer Ford BB VT', + NULL, + 2 + ), + ( + 1200009, + 1200001, + 'Reed T-UL Solid Lifter Ford BB Valvetrain', + NULL, + 2 + ), + ( + 1200010, + 1200001, + 'Reed R-ULX Roller Lifter Ford BB Valvetrain', + NULL, + 3 + ), + ( + 1200011, + 1200001, + 'Reed TM Hydraulic Lifter Ford BB Valvetrain', + NULL, + 2 + ), + ( + 1200012, + 1200001, + 'Buick BB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200013, + 1200001, + 'Buick Nailhead Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200014, + 1200001, + 'Cadillac BB Stock Valvetrain', + NULL, + 1 + ), + ( + 1200015, + 1200001, + 'Chrysler BB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200016, + 1200001, + 'Chrysler SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200017, + 1200001, + 'Ford SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200018, + 1200001, + 'Ford Flathead Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200019, + 1200001, + 'Olds BB Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200020, + 1200001, + 'Olds SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200021, + 1200001, + 'AMC Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200022, + 1200001, + 'Buick SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200023, + 1200001, + 'Chevrolet SB Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200024, + 1200001, + 'Chevrolet BB Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200025, + 1200001, + 'Chevrolet BB SS Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200026, + 1200001, + 'Pontiac Ram Air V Solid Lifter Valvetrain', + NULL, + 3 + ), + ( + 1200027, + 1200001, + 'Ford Y Truck Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200028, + 1200001, + 'Ford BB Stock Mechanical Lifter Valvetrain', + NULL, + 1 + ), + ( + 1200029, + 1200001, + 'Ford BB Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200030, + 1200001, + 'Ford BB Cammer Valvetrain', + NULL, + 4 + ), + ( + 1200031, + 1200001, + 'Ford BB SCJ Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200032, + 1200001, + 'Chrysler BB Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200033, + 1200001, + 'Chrysler SB Stock Mechanical Lifter Valvetrain', + NULL, + 1 + ), + ( + 1200034, + 1200001, + 'Chevrolet SB Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200035, + 1200001, + 'Pontiac Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200036, + 1200001, + 'AMC Group 19 Mechanical Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200037, + 1200001, + 'Pontiac SD Mech Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200038, + 1200001, + 'Ford SB HP Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200039, + 1200001, + 'Chrysler Hemi Solid Lifter Valvetrain', + NULL, + 2 + ), + ( + 1200040, + 1200001, + 'Shade Tree Chrysler Hemi Valvetrain', + NULL, + 1 + ), + ( + 1200041, + 1200001, + 'Chrysler Hemi Hydraulic Valvetrain', + NULL, + 2 + ), + ( + 1200042, + 1200001, + 'Cadillac L-Head Valvetrain', + NULL, + 1 + ), + ( + 1200043, + 1200001, + 'Ford Cleveland Block Stock Valvetrain', + NULL, + 1 + ), + ( + 1200044, + 1200001, + 'Ford Cleveland Block Boss Valvetrain', + NULL, + 2 + ), + ( + 1200045, + 1200001, + 'Ford 385 Block Stock Valvetrain', + NULL, + 1 + ), + ( + 1200046, + 1200001, + 'Ford 385 Block SCJ Valvetrain', + NULL, + 2 + ), + ( + 1200047, + 1200001, + 'Ford 385 Block Boss Hydraulic Valvetrain', + NULL, + 2 + ), + ( + 1200048, + 1200001, + 'Ford Y Stock Solid Valvetrain', + NULL, + 1 + ), + ( + 1200049, + 1200001, + 'Chevrolet W Stock Hydraulic Valvetrain', + NULL, + 1 + ), + ( + 1200050, + 1200001, + 'Chevrolet W STT Solid Valvetrain', + NULL, + 2 + ), + ( + 1200051, + 1200001, + 'Buick Nailhead Solid Valvetrain', + NULL, + 2 + ), + ( + 1200052, + 1200001, + 'Buick SB Solid Valvetrain', + NULL, + 2 + ), + ( + 1200053, + 1200001, + 'Buick BB Solid Valvetrain', + NULL, + 2 + ), + ( + 1200054, + 1200001, + 'Cadillac L-Head Super Hydraulic Valvetrain', + NULL, + 2 + ), + ( + 1200055, + 1200001, + 'Ford Flathead Super Hydraulic Valvetrain', + NULL, + 2 + ), + ( + 1200056, + 1200001, + 'Cadillac Solid Valvetrain', + NULL, + 2 + ), + ( + 1200057, + 1200001, + 'Oldsmobile SB Solid Valvetrain', + NULL, + 2 + ), + ( + 1200058, + 1200001, + 'Oldsmobile BB Solid Valvetrain', + NULL, + 2 + ), + ( + 1200059, + 1200001, + 'Edelbrock AMC Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200060, + 1200001, + 'Edelbrock Chevrolet SB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200061, + 1200001, + 'Edelbrock Chevrolet BB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200062, + 1200001, + 'Edelbrock Chrysler SB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200063, + 1200001, + 'Edelbrock Chrysler BB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200064, + 1200001, + 'Edelbrock Ford SB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200065, + 1200001, + 'Edelbrock Ford C Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200066, + 1200001, + 'Edelbrock Ford BB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200067, + 1200001, + 'Edelbrock Ford 385 Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200068, + 1200001, + 'Edelbrock Olds SB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200069, + 1200001, + 'Edelbrock Olds BB Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200070, + 1200001, + 'Edelbrock Pontiac Hydraulic Lifters', + NULL, + 2 + ), + ( + 1200071, + 1200001, + 'Crane PowerMax Roller Ford BB VT', + NULL, + 3 + ), + ( + 1200072, + 1200001, + 'Crane PowerMax AMC VT', + NULL, + 2 + ), + ( + 1200073, + 1200001, + 'Crane PowerMax Roller AMC VT', + NULL, + 3 + ), + ( + 1200074, + 1200001, + 'Crane Energizer Buick SB VT', + NULL, + 2 + ), + ( + 1200075, + 1200001, + 'Crane PowerMax Buick SB VT', + NULL, + 2 + ), + ( + 1200076, + 1200001, + 'Crane Energizer Chevrolet SB VT', + NULL, + 2 + ), + ( + 1200077, + 1200001, + 'Crane PowerMax Chevrolet SB VT', + NULL, + 2 + ), + ( + 1200078, + 1200001, + 'Crane PowerMax Roller Chevrolet SB VT', + NULL, + 3 + ), + ( + 1200079, + 1200001, + 'Crane Energizer Chevrolet BB VT', + NULL, + 2 + ), + ( + 1200080, + 1200001, + 'Crane PowerMax Chevrolet BB VT', + NULL, + 2 + ), + ( + 1200081, + 1200001, + 'Crane PowerMax Roller Chevrolet BB VT', + NULL, + 3 + ), + ( + 1200082, + 1200001, + 'Crane Energizer Chevrolet W VT', + NULL, + 2 + ), + ( + 1200083, + 1200001, + 'Crane PowerMax Chevrolet W VT', + NULL, + 2 + ), + ( + 1200084, + 1200001, + 'Crane PowerMax Roller Chevrolet W VT', + NULL, + 3 + ), + ( + 1200085, + 1200001, + 'Crane Energizer Chrysler SB VT', + NULL, + 2 + ), + ( + 1200086, + 1200001, + 'Crane PowerMax Chrysler SB VT', + NULL, + 2 + ), + ( + 1200087, + 1200001, + 'Crane PowerMax Roller Chrysler SB VT', + NULL, + 3 + ), + ( + 1200088, + 1200001, + 'Crane Energizer Chrysler BB VT', + NULL, + 2 + ), + ( + 1200089, + 1200001, + 'Crane PowerMax Chrysler BB VT', + NULL, + 2 + ), + ( + 1200090, + 1200001, + 'Crane PowerMax Roller Chrysler BB VT', + NULL, + 3 + ), + ( + 1200091, + 1200001, + 'Crane PowerMax Chrysler Hemi VT', + NULL, + 2 + ), + ( + 1200092, + 1200001, + 'Crane PowerMax Roller Chrysler Hemi VT', + NULL, + 3 + ), + ( + 1200093, + 1200001, + 'Crane Energizer Ford SB VT', + NULL, + 2 + ), + ( + 1200094, + 1200001, + 'Crane PowerMax Ford SB VT', + NULL, + 2 + ), + ( + 1200095, + 1200001, + 'Crane PowerMax Roller Ford SB VT', + NULL, + 3 + ), + ( + 1200096, + 1200001, + 'Crane Energizer Ford C VT', + NULL, + 2 + ), + ( + 1200097, + 1200001, + 'Crane PowerMax Ford C VT', + NULL, + 2 + ), + ( + 1200098, + 1200001, + 'Crane PowerMax Roller Ford C VT', + NULL, + 3 + ), + ( + 1200099, + 1200001, + 'Crane Energizer Ford 385 VT', + NULL, + 2 + ), + ( + 1200100, + 1200001, + 'Crane PowerMax Ford 385 VT', + NULL, + 2 + ), + ( + 1200101, + 1200001, + 'Crane PowerMax Roller Ford 385 VT', + NULL, + 3 + ), + ( + 1200102, + 1200001, + 'Crane Energizer Olds SB VT', + NULL, + 2 + ), + ( + 1200103, + 1200001, + 'Crane PowerMax Olds SB VT', + NULL, + 2 + ), + ( + 1200104, + 1200001, + 'Crane PowerMax Roller Olds SB VT', + NULL, + 3 + ), + ( + 1200105, + 1200001, + 'Crane Energizer Pontiac VT', + NULL, + 2 + ), + ( + 1200106, + 1200001, + 'Crane PowerMax Pontiac VT', + NULL, + 2 + ), + ( + 1200107, + 1200001, + 'Crane PowerMax Roller Pontiac VT', + NULL, + 3 + ), + ( + 1200108, + 1200001, + 'Crane Energizer Olds BB VT', + NULL, + 2 + ), + ( + 1200109, + 1200001, + 'Crane PowerMax Olds BB VT', + NULL, + 2 + ), + ( + 1200110, + 1200001, + 'Crane PowerMax Roller Olds BB VT', + NULL, + 3 + ), + ( + 1200111, + 1200001, + 'Oldfield Y Block Street King Solid VT', + NULL, + 2 + ), + ( + 1200112, + 1200001, + 'Oldfield Y Block Strip King Solid VT', + NULL, + 2 + ), + ( + 1200113, + 1200001, + 'Oldfield Y Block Race Pro Roller VT', + NULL, + 2 + ), + ( + 1200114, + 1200001, + 'Quik Lift Y Block Solid VT', + NULL, + 2 + ), + ( + 1200115, + 1200001, + 'Quik Lift Y Block Performance Solid VT', + NULL, + 2 + ), + ( + 1200116, + 1200001, + 'Quik Lift Y Block Race Roller VT', + NULL, + 2 + ), + ( + 1200117, + 1200001, + 'Milloy Y Block Speed Lifter Solid VT', + NULL, + 2 + ), + ( + 1200118, + 1200001, + 'Milloy Y Block Super Lifter Solid VT', + NULL, + 2 + ), + ( + 1200119, + 1200001, + 'Milloy Chevy SB Speed Lifter Solid VT', + NULL, + 2 + ), + ( + 1200120, + 1200001, + 'Milloy Chevy SB Street Plus Hydraulic VT', + NULL, + 1 + ), + ( + 1200121, + 1200001, + 'Milloy Chevy SB Premier Roller VT', + NULL, + 3 + ), + ( + 1200122, + 1200001, + 'Quik Lift Chevy SB Performance Solid VT', + NULL, + 2 + ), + ( + 1200123, + 1200001, + 'Quik Lift Chevy SB Performance Hydraulic VT', + NULL, + 2 + ), + ( + 1200124, + 1200001, + 'Quik Lift Chevy SB Race Roller VT', + NULL, + 2 + ), + ( + 1200125, + 1200001, + 'Milloy Buick Nailhead Super Lift Solid VT', + NULL, + 2 + ), + ( + 1200126, + 1200001, + 'Quik Lift Buick Nailhead Perf. Hydraulic VT', + NULL, + 2 + ), + ( + 1200127, + 1200001, + 'Dunbar Buick Nailhead Craftsmith Roller VT', + NULL, + 2 + ), + ( + 1200128, + 1200001, + 'Quik Lift Buick Nailhead Race Roller VT', + NULL, + 2 + ), + ( + 1200129, + 1200001, + 'Quik Lift Buick Nailhead Solid VT', + NULL, + 2 + ), + ( + 1200130, + 1200001, + 'Milloy Buick Nailhead Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200131, + 1200001, + 'Dunbar Buick Nailhead Craftsmith Hydraulic VT', + NULL, + 1 + ), + ( + 1200132, + 1200001, + 'Dunbar Buick Nailhead Craftsmith Solid VT', + NULL, + 2 + ), + ( + 1200133, + 1200001, + 'Oldfield Ford SB Street King Solid VT', + NULL, + 2 + ), + ( + 1200134, + 1200001, + 'Oldfield Ford SB Strip King Solid VT', + NULL, + 2 + ), + ( + 1200135, + 1200001, + 'Milloy Ford SB Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200136, + 1200001, + 'Millory Ford SB Strip King Solid VT', + NULL, + 2 + ), + ( + 1200137, + 1200001, + 'Quik Lift Ford SB Solid VT', + NULL, + 2 + ), + ( + 1200138, + 1200001, + 'Quik Lift Ford SB Performance Hydraulic VT', + NULL, + 2 + ), + ( + 1200139, + 1200001, + 'Quik Lift Ford SB Race Rolller VT', + NULL, + 2 + ), + ( + 1200140, + 1200001, + 'Milloy Ford SB Super Lift Solid VT', + NULL, + 2 + ), + ( + 1200141, + 1200001, + 'Milloy Chrysler SB Super Lift Solid VT', + NULL, + 2 + ), + ( + 1200142, + 1200001, + 'Milloy Chrysler SB Premier Roller VT', + NULL, + 3 + ), + ( + 1200143, + 1200001, + 'Quik Lift Chrysler SB Race Roller VT', + NULL, + 2 + ), + ( + 1200144, + 1200001, + 'Milloy Pontiac Premier Roller VT', + NULL, + 3 + ), + ( + 1200145, + 1200001, + 'Quik Lift Pontiac Race Roller VT', + NULL, + 3 + ), + ( + 1200146, + 1200001, + 'Milloy Cleveland Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200147, + 1200001, + 'Milloy Cleveland Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200148, + 1200001, + 'Milloy Cleveland Premier Roller VT', + NULL, + 4 + ), + ( + 1200149, + 1200001, + 'Oldfield Cleveland Strip King Roller VT', + NULL, + 3 + ), + ( + 1200150, + 1200001, + 'Oldfield Cleveland Track King Roller VT', + NULL, + 4 + ), + ( + 1200151, + 1200001, + 'Milloy Ford 385 Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200152, + 1200001, + 'Milloy Ford 385 Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200153, + 1200001, + 'Milloy Ford 385 Premier Roller VT', + NULL, + 4 + ), + ( + 1200154, + 1200001, + 'Oldfield Ford 385 Strip King Roller VT', + NULL, + 3 + ), + ( + 1200155, + 1200001, + 'Oldfield Ford 385 Track King Roller VT', + NULL, + 4 + ), + ( + 1200156, + 1200001, + 'Milloy Hemi Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200157, + 1200001, + 'Milloy Hemi Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200158, + 1200001, + 'Milloy Hemi Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200159, + 1200001, + 'Millloy Hemi Premier Roller VT', + NULL, + 4 + ), + ( + 1200160, + 1200001, + 'Quik Lift Hemi Race Roller VT', + NULL, + 3 + ), + ( + 1200161, + 1200001, + 'Millloy Cadillac BB Street Plus Hydraulic VT', + NULL, + 1 + ), + ( + 1200162, + 1200001, + 'Milloy Cadillac BB Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200163, + 1200001, + 'Milloy Cadillac BB Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200164, + 1200001, + 'Milloy Cadillac BB Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200165, + 1200001, + 'Milloy Cadillac BB Premier Roller VT', + NULL, + 4 + ), + ( + 1200166, + 1200001, + 'Quik Lift Cadillac BB Perf. Hydraulic VT', + NULL, + 2 + ), + ( + 1200167, + 1200001, + 'Quik Lift Cadillac BB Perf. Solid VT', + NULL, + 2 + ), + ( + 1200168, + 1200001, + 'Quik Lift Cadillac BB Race Roller VT', + NULL, + 3 + ), + ( + 1200169, + 1200001, + 'Milloy Chevy W Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200170, + 1200001, + 'Milloy Chevy W Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200171, + 1200001, + 'Milloy Chevy W Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200172, + 1200001, + 'Milloy Chevy W Premier Roller VT', + NULL, + 4 + ), + ( + 1200173, + 1200001, + 'Quik Lift Chevy W Perf. Hydraulic VT', + NULL, + 2 + ), + ( + 1200174, + 1200001, + 'Quik Lift Chevy W Perf. Solid VT', + NULL, + 2 + ), + ( + 1200175, + 1200001, + 'Quik Lift Chevy W Race Roller VT', + NULL, + 3 + ), + ( + 1200176, + 1200001, + 'Milloy AMC Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200177, + 1200001, + 'Milloy AMC Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200178, + 1200001, + 'Milloy AMC Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200179, + 1200001, + 'Milloy AMC Premier Roller VT', + NULL, + 4 + ), + ( + 1200180, + 1200001, + 'Quik Lift AMC Perf. Hydraulic VT', + NULL, + 2 + ), + ( + 1200181, + 1200001, + 'Quik Lift AMC Perf. Solid VT', + NULL, + 2 + ), + ( + 1200182, + 1200001, + 'Quik Lift AMC Race Roller VT', + NULL, + 3 + ), + ( + 1200183, + 1200001, + 'Milloy Olds BB Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200184, + 1200001, + 'Milloy Olds BB Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200185, + 1200001, + 'Milloy Olds BB Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200186, + 1200001, + 'Milloy Olds BB Premier Roller VT', + NULL, + 4 + ), + ( + 1200187, + 1200001, + 'Milloy Chrysler BB Speed Lift Hydraulic VT', + NULL, + 2 + ), + ( + 1200188, + 1200001, + 'Milloy Chrysler BB Speed Lift Solid VT', + NULL, + 2 + ), + ( + 1200189, + 1200001, + 'Milloy Chrysler BB Super Lift Solid VT', + NULL, + 3 + ), + ( + 1200190, + 1200001, + 'Milloy Chrysler BB Premier Roller VT', + NULL, + 4 + ), + ( + 1200191, + 1200001, + 'Milloy Chevy BB Premier Roller VT', + NULL, + 4 + ), + ( + 1200192, + 1200001, + 'Quik Lift Chevy BB Race Roller VT', + NULL, + 3 + ), + ( + 1200193, + 1200001, + 'Crane PowerMax Ford Flathead VT', + NULL, + 2 + ); \ No newline at end of file diff --git a/migrations/0021-seedBrandedPart.sql b/migrations/0021-seedBrandedPart.sql new file mode 100644 index 000000000..b327f8974 --- /dev/null +++ b/migrations/0021-seedBrandedPart.sql @@ -0,0 +1,32092 @@ +INSERT INTO + branded_part ( + branded_part_id, + part_type_id, + model_id, + mfg_date, + qty_avail, + retail_price, + max_item_wear, + engine_block_family_id + ) +VALUES + ( + 101, + 101, + 1, + '1932-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 102, + 102, + 7, + '1940-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 103, + 103, + 14, + '1953-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 104, + 104, + 21, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 105, + 105, + 25, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 106, + 106, + 47, + '1957-01-01 00:00:00.000000', + 250, + 0, + 30000, + 0 + ), + ( + 107, + 107, + 32, + '1963-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 108, + 108, + 509, + '1965-01-01 00:00:00.000000', + 250, + 0, + 30000, + 0 + ), + ( + 109, + 109, + 40, + '1964-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 110, + 110, + 974, + '1969-01-01 00:00:00.000000', + 125, + 0, + 30000, + 0 + ), + ( + 111, + 111, + 36, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 112, + 112, + 2, + '1949-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 113, + 113, + 3, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 114, + 114, + 8, + '1957-01-01 00:00:00.000000', + 60, + 0, + 30000, + 0 + ), + ( + 115, + 115, + 16, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 116, + 116, + 48, + '1964-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 117, + 117, + 26, + '1963-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 118, + 118, + 49, + '1958-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 119, + 119, + 33, + '1967-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 120, + 120, + 37, + '1967-01-01 00:00:00.000000', + 250, + 0, + 30000, + 0 + ), + ( + 121, + 121, + 41, + '1970-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 122, + 122, + 45, + '1970-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 123, + 123, + 46, + '1970-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 124, + 124, + 4, + '1947-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 125, + 125, + 9, + '1959-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 126, + 126, + 10, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 127, + 127, + 5, + '1955-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 128, + 128, + 6, + '1966-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 129, + 129, + 12, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 130, + 130, + 20, + '1973-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 131, + 131, + 172, + '1969-01-01 00:00:00.000000', + 250, + 0, + 30000, + 0 + ), + ( + 132, + 132, + 173, + '1969-01-01 00:00:00.000000', + 250, + 0, + 30000, + 0 + ), + ( + 133, + 133, + 174, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 134, + 134, + 175, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 135, + 135, + 176, + '1971-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 153, + 138, + 526, + '1999-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 159, + 104, + 964, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 171, + 142, + 971, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 173, + 146, + 1051, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 174, + 147, + 1052, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 175, + 148, + 1053, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 176, + 149, + 1054, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 177, + 150, + 1055, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 178, + 151, + 1056, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 179, + 152, + 1057, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 180, + 153, + 1058, + '1990-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 184, + 157, + 990, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 190, + 154, + 980, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 208, + 127, + 1202, + '1955-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 236, + 113, + 1203, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 30000, + 0 + ), + ( + 320, + 207, + 2153, + '1966-01-01 00:00:00.000000', + 0, + 0, + 15000, + 0 + ), + ( + 335, + 210, + 2179, + '1970-01-01 00:00:00.000000', + 250, + 0, + 1500, + 0 + ), + ( + 336, + 211, + 2180, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 337, + 212, + 2181, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 338, + 213, + 2182, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 339, + 214, + 2183, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 340, + 215, + 2184, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 341, + 216, + 2185, + '1971-01-01 00:00:00.000000', + 250, + 0, + 1500, + 0 + ), + ( + 342, + 217, + 2186, + '1964-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 343, + 218, + 2187, + '1967-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 344, + 219, + 2188, + '1967-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 345, + 220, + 2189, + '1967-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 346, + 221, + 2190, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 347, + 222, + 2191, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 348, + 223, + 2192, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 349, + 224, + 2193, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 350, + 225, + 2194, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 351, + 226, + 1230, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 352, + 227, + 2196, + '1973-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 353, + 228, + 2197, + '1973-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 354, + 124, + 4, + '1947-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 355, + 112, + 2, + '1949-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 356, + 103, + 14, + '1953-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 357, + 104, + 21, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 358, + 105, + 25, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 359, + 106, + 47, + '1957-01-01 00:00:00.000000', + 250, + 0, + 1500, + 0 + ), + ( + 360, + 113, + 3, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 361, + 115, + 16, + '1957-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 362, + 114, + 8, + '1957-01-01 00:00:00.000000', + 60, + 0, + 1500, + 0 + ), + ( + 363, + 118, + 49, + '1958-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 364, + 117, + 26, + '1963-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 365, + 116, + 48, + '1964-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 366, + 109, + 40, + '1964-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 367, + 108, + 509, + '1964-01-01 00:00:00.000000', + 250, + 0, + 1500, + 0 + ), + ( + 368, + 128, + 6, + '1966-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 369, + 119, + 33, + '1967-01-01 00:00:00.000000', + 1000, + 0, + 1500, + 0 + ), + ( + 370, + 120, + 37, + '1967-01-01 00:00:00.000000', + 250, + 0, + 1500, + 0 + ), + ( + 371, + 126, + 2215, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 372, + 129, + 12, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 373, + 133, + 174, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 374, + 140, + 2217, + '1967-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 375, + 106, + 2367, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 377, + 113, + 2369, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 378, + 127, + 2370, + '1955-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 379, + 103, + 2371, + '1953-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 383, + 129, + 2376, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 384, + 108, + 2377, + '1964-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 385, + 106, + 2378, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 386, + 127, + 2379, + '1955-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 387, + 121, + 2380, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 388, + 109, + 2381, + '1964-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 389, + 132, + 2382, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 390, + 113, + 2383, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 391, + 103, + 2384, + '1953-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 392, + 131, + 2385, + '1969-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 393, + 105, + 2386, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 394, + 120, + 2387, + '1967-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 395, + 112, + 2425, + '1949-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 396, + 113, + 2426, + '1957-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 397, + 128, + 2427, + '1966-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 398, + 125, + 2428, + '1959-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 399, + 117, + 2429, + '1963-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 400, + 108, + 2430, + '1964-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 401, + 134, + 2431, + '1970-01-01 00:00:00.000000', + 0, + 0, + 1500, + 0 + ), + ( + 402, + 127, + 5, + '1955-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 403, + 140, + 2217, + '1967-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 404, + 207, + 2153, + '1966-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 405, + 117, + 26, + '1963-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 406, + 207, + 2153, + '1966-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 407, + 213, + 2182, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 408, + 111, + 36, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 409, + 220, + 2189, + '1967-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 410, + 130, + 20, + '1973-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 411, + 132, + 2872, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 412, + 111, + 36, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 413, + 114, + 8, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 414, + 114, + 2878, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 415, + 114, + 3003, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 416, + 133, + 3004, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 417, + 108, + 3005, + '1964-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 418, + 121, + 3009, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 419, + 112, + 3006, + '1949-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 420, + 103, + 3010, + '1953-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 421, + 118, + 3011, + '1958-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 422, + 113, + 3012, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 423, + 127, + 3013, + '1955-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 424, + 218, + 3014, + '1967-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 425, + 142, + 3015, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 426, + 134, + 3016, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 427, + 124, + 3017, + '1947-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 428, + 114, + 3018, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 429, + 115, + 3603, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 430, + 105, + 3604, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 431, + 128, + 3605, + '1966-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 432, + 101, + 3606, + '1932-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 433, + 102, + 3607, + '1940-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 434, + 104, + 3608, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 435, + 106, + 3609, + '1957-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 436, + 109, + 3610, + '1964-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 437, + 211, + 3611, + '1969-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 438, + 111, + 3612, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 439, + 116, + 3613, + '1964-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 440, + 121, + 3614, + '1970-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 441, + 117, + 3615, + '1963-01-01 00:00:00.000000', + 0, + 0, + 30000, + 0 + ), + ( + 1001, + 1001, + 2027, + '1932-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 2001, + 2001, + 2028, + '1932-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 4001, + 4001, + 2029, + '1999-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 5001, + 5001, + 2030, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 6001, + 6001, + 1742, + '1999-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 10001, + 10001, + 622, + '1960-01-01 00:00:00.000000', + 1000, + 138, + 30000, + 0 + ), + ( + 10002, + 10002, + 623, + '1960-01-01 00:00:00.000000', + 1000, + 232, + 30000, + 0 + ), + ( + 10003, + 10003, + 624, + '1960-01-01 00:00:00.000000', + 500, + 388, + 30000, + 0 + ), + ( + 10004, + 10004, + 1716, + '1960-01-01 00:00:00.000000', + 1000, + 107, + 30000, + 0 + ), + ( + 10005, + 10005, + 1717, + '1960-01-01 00:00:00.000000', + 1000, + 138, + 30000, + 0 + ), + ( + 10006, + 10006, + 625, + '1960-01-01 00:00:00.000000', + 1000, + 169, + 30000, + 0 + ), + ( + 10007, + 10007, + 626, + '1960-01-01 00:00:00.000000', + 1000, + 263, + 30000, + 0 + ), + ( + 10008, + 10008, + 627, + '1960-01-01 00:00:00.000000', + 250, + 419, + 30000, + 0 + ), + ( + 10009, + 10009, + 1718, + '1960-01-01 00:00:00.000000', + 1000, + 85, + 30000, + 0 + ), + ( + 10010, + 10010, + 615, + '1960-01-01 00:00:00.000000', + 1000, + 116, + 30000, + 0 + ), + ( + 10011, + 10011, + 616, + '1960-01-01 00:00:00.000000', + 1000, + 210, + 30000, + 0 + ), + ( + 10012, + 10012, + 617, + '1960-01-01 00:00:00.000000', + 500, + 366, + 30000, + 0 + ), + ( + 10013, + 10013, + 1719, + '1960-01-01 00:00:00.000000', + 1000, + 116, + 30000, + 0 + ), + ( + 10014, + 10014, + 618, + '1960-01-01 00:00:00.000000', + 1000, + 147, + 30000, + 0 + ), + ( + 10015, + 10015, + 619, + '1960-01-01 00:00:00.000000', + 1000, + 241, + 30000, + 0 + ), + ( + 10016, + 10016, + 1720, + '1960-01-01 00:00:00.000000', + 250, + 397, + 30000, + 0 + ), + ( + 10017, + 10017, + 629, + '1960-01-01 00:00:00.000000', + 250, + 329, + 30000, + 0 + ), + ( + 10018, + 10018, + 630, + '1960-01-01 00:00:00.000000', + 125, + 485, + 30000, + 0 + ), + ( + 10019, + 10019, + 621, + '1960-01-01 00:00:00.000000', + 250, + 307, + 30000, + 0 + ), + ( + 10020, + 10020, + 1721, + '1960-01-01 00:00:00.000000', + 125, + 463, + 30000, + 0 + ), + ( + 10021, + 10021, + 633, + '1960-01-01 00:00:00.000000', + 125, + 426, + 30000, + 0 + ), + ( + 10022, + 10022, + 634, + '1960-01-01 00:00:00.000000', + 60, + 583, + 30000, + 0 + ), + ( + 10023, + 10023, + 635, + '1960-01-01 00:00:00.000000', + 0, + 1083, + 30000, + 0 + ), + ( + 10024, + 10024, + 636, + '1960-01-01 00:00:00.000000', + 0, + 1833, + 30000, + 0 + ), + ( + 10025, + 10025, + 632, + '1960-01-01 00:00:00.000000', + 250, + 333, + 30000, + 0 + ), + ( + 10026, + 10026, + 631, + '1960-01-01 00:00:00.000000', + 250, + 301, + 30000, + 0 + ), + ( + 10027, + 10027, + 1722, + '1960-01-01 00:00:00.000000', + 125, + 858, + 30000, + 0 + ), + ( + 10028, + 10028, + 1723, + '1960-01-01 00:00:00.000000', + 60, + 1108, + 30000, + 0 + ), + ( + 10029, + 10029, + 1724, + '1960-01-01 00:00:00.000000', + 0, + 1608, + 30000, + 0 + ), + ( + 10030, + 10030, + 1725, + '1960-01-01 00:00:00.000000', + 0, + 2358, + 30000, + 0 + ), + ( + 10031, + 10031, + 1752, + '1990-01-01 00:00:00.000000', + 60, + 951, + 30000, + 0 + ), + ( + 10032, + 10044, + 2598, + '1990-01-01 00:00:00.000000', + 125, + 826, + 30000, + 0 + ), + ( + 10033, + 10043, + 2597, + '1990-01-01 00:00:00.000000', + 500, + 204, + 30000, + 0 + ), + ( + 10034, + 10042, + 2596, + '1990-01-01 00:00:00.000000', + 125, + 919, + 30000, + 0 + ), + ( + 10035, + 10041, + 2595, + '1990-01-01 00:00:00.000000', + 60, + 897, + 30000, + 0 + ), + ( + 10036, + 10040, + 2594, + '1990-01-01 00:00:00.000000', + 125, + 888, + 30000, + 0 + ), + ( + 10037, + 10039, + 2593, + '1990-01-01 00:00:00.000000', + 125, + 866, + 30000, + 0 + ), + ( + 10038, + 10038, + 2592, + '1990-01-01 00:00:00.000000', + 30, + 1326, + 30000, + 0 + ), + ( + 10039, + 10037, + 2591, + '1990-01-01 00:00:00.000000', + 125, + 704, + 30000, + 0 + ), + ( + 10040, + 10036, + 2590, + '1990-01-01 00:00:00.000000', + 60, + 801, + 30000, + 0 + ), + ( + 10041, + 10035, + 2589, + '1990-01-01 00:00:00.000000', + 250, + 638, + 30000, + 0 + ), + ( + 10042, + 10034, + 2588, + '1990-01-01 00:00:00.000000', + 250, + 616, + 30000, + 0 + ), + ( + 10043, + 10033, + 2587, + '1990-01-01 00:00:00.000000', + 250, + 607, + 30000, + 0 + ), + ( + 10044, + 10032, + 2586, + '1990-01-01 00:00:00.000000', + 125, + 585, + 30000, + 0 + ), + ( + 11001, + 11001, + 606, + '1955-01-01 00:00:00.000000', + 500, + 22, + 30000, + 0 + ), + ( + 11002, + 11002, + 607, + '1955-01-01 00:00:00.000000', + 1000, + 32, + 30000, + 0 + ), + ( + 11003, + 11003, + 608, + '1955-01-01 00:00:00.000000', + 500, + 32, + 30000, + 0 + ), + ( + 11004, + 11004, + 609, + '1955-01-01 00:00:00.000000', + 1000, + 42, + 30000, + 0 + ), + ( + 11005, + 11005, + 610, + '1955-01-01 00:00:00.000000', + 250, + 66, + 30000, + 0 + ), + ( + 11006, + 11006, + 611, + '1955-01-01 00:00:00.000000', + 500, + 72, + 30000, + 0 + ), + ( + 11007, + 11007, + 1740, + '1955-01-01 00:00:00.000000', + 125, + 84, + 30000, + 0 + ), + ( + 11008, + 11008, + 612, + '1955-01-01 00:00:00.000000', + 250, + 122, + 30000, + 0 + ), + ( + 11009, + 11009, + 613, + '1955-01-01 00:00:00.000000', + 125, + 134, + 30000, + 0 + ), + ( + 11010, + 11010, + 614, + '1955-01-01 00:00:00.000000', + 60, + 142, + 30000, + 0 + ), + ( + 11011, + 11011, + 2200, + '1955-01-01 00:00:00.000000', + 250, + 267, + 30000, + 0 + ), + ( + 11012, + 11012, + 2665, + '1995-01-01 00:00:00.000000', + 15, + 76, + 30000, + 0 + ), + ( + 11013, + 11013, + 2666, + '1995-01-01 00:00:00.000000', + 15, + 130, + 30000, + 0 + ), + ( + 12001, + 12001, + 559, + '1930-01-01 00:00:00.000000', + 125, + 58, + 30000, + 0 + ), + ( + 12002, + 12002, + 560, + '1930-01-01 00:00:00.000000', + 250, + 61, + 30000, + 0 + ), + ( + 12003, + 12003, + 561, + '1930-01-01 00:00:00.000000', + 500, + 65, + 30000, + 0 + ), + ( + 12004, + 12004, + 562, + '1930-01-01 00:00:00.000000', + 500, + 70, + 30000, + 0 + ), + ( + 12005, + 12005, + 563, + '1930-01-01 00:00:00.000000', + 500, + 76, + 30000, + 0 + ), + ( + 12006, + 12006, + 564, + '1950-01-01 00:00:00.000000', + 1000, + 153, + 30000, + 0 + ), + ( + 12007, + 12007, + 565, + '1950-01-01 00:00:00.000000', + 1000, + 160, + 30000, + 0 + ), + ( + 12008, + 12008, + 566, + '1950-01-01 00:00:00.000000', + 1000, + 167, + 30000, + 0 + ), + ( + 12009, + 12009, + 567, + '1950-01-01 00:00:00.000000', + 500, + 176, + 30000, + 0 + ), + ( + 12010, + 12010, + 568, + '1950-01-01 00:00:00.000000', + 500, + 185, + 30000, + 0 + ), + ( + 12011, + 12011, + 569, + '1950-01-01 00:00:00.000000', + 250, + 195, + 30000, + 0 + ), + ( + 12012, + 12012, + 570, + '1950-01-01 00:00:00.000000', + 250, + 135, + 30000, + 0 + ), + ( + 12013, + 12013, + 571, + '1950-01-01 00:00:00.000000', + 125, + 147, + 30000, + 0 + ), + ( + 12014, + 12014, + 572, + '1950-01-01 00:00:00.000000', + 125, + 159, + 30000, + 0 + ), + ( + 12015, + 12015, + 573, + '1950-01-01 00:00:00.000000', + 125, + 243, + 30000, + 0 + ), + ( + 12016, + 12016, + 574, + '1950-01-01 00:00:00.000000', + 125, + 257, + 30000, + 0 + ), + ( + 12017, + 12017, + 575, + '1950-01-01 00:00:00.000000', + 125, + 272, + 30000, + 0 + ), + ( + 12018, + 12018, + 576, + '1950-01-01 00:00:00.000000', + 60, + 288, + 30000, + 0 + ), + ( + 12019, + 12019, + 577, + '1950-01-01 00:00:00.000000', + 60, + 305, + 30000, + 0 + ), + ( + 12020, + 12020, + 2201, + '1965-01-01 00:00:00.000000', + 500, + 141, + 30000, + 0 + ), + ( + 12021, + 12021, + 2202, + '1965-01-01 00:00:00.000000', + 500, + 146, + 30000, + 0 + ), + ( + 12022, + 12022, + 2203, + '1965-01-01 00:00:00.000000', + 500, + 105, + 30000, + 0 + ), + ( + 12023, + 12023, + 2204, + '1965-01-01 00:00:00.000000', + 500, + 114, + 30000, + 0 + ), + ( + 12024, + 12024, + 2205, + '1965-01-01 00:00:00.000000', + 500, + 124, + 30000, + 0 + ), + ( + 12025, + 12026, + 2206, + '1965-01-01 00:00:00.000000', + 125, + 230, + 30000, + 0 + ), + ( + 12026, + 12025, + 2207, + '1965-01-01 00:00:00.000000', + 250, + 217, + 30000, + 0 + ), + ( + 12027, + 12031, + 2212, + '1950-01-01 00:00:00.000000', + 1000, + 89, + 30000, + 0 + ), + ( + 12028, + 12033, + 2214, + '1950-01-01 00:00:00.000000', + 1000, + 76, + 30000, + 0 + ), + ( + 12029, + 12032, + 2213, + '1950-01-01 00:00:00.000000', + 1000, + 82, + 30000, + 0 + ), + ( + 12030, + 12030, + 2211, + '1950-01-01 00:00:00.000000', + 1000, + 97, + 30000, + 0 + ), + ( + 12031, + 12029, + 2210, + '1950-01-01 00:00:00.000000', + 250, + 185, + 30000, + 0 + ), + ( + 12032, + 12028, + 2209, + '1950-01-01 00:00:00.000000', + 250, + 195, + 30000, + 0 + ), + ( + 12033, + 12027, + 2208, + '1950-01-01 00:00:00.000000', + 250, + 206, + 30000, + 0 + ), + ( + 12034, + 12034, + 2390, + '1950-01-01 00:00:00.000000', + 125, + 257, + 30000, + 0 + ), + ( + 12035, + 12035, + 2391, + '1950-01-01 00:00:00.000000', + 125, + 272, + 30000, + 0 + ), + ( + 12036, + 12036, + 2392, + '1950-01-01 00:00:00.000000', + 60, + 288, + 30000, + 0 + ), + ( + 12037, + 12037, + 2393, + '1950-01-01 00:00:00.000000', + 60, + 305, + 30000, + 0 + ), + ( + 12038, + 12038, + 2394, + '1950-01-01 00:00:00.000000', + 60, + 323, + 30000, + 0 + ), + ( + 12039, + 12039, + 2395, + '1950-01-01 00:00:00.000000', + 60, + 341, + 30000, + 0 + ), + ( + 12040, + 12040, + 2396, + '1950-01-01 00:00:00.000000', + 60, + 361, + 30000, + 0 + ), + ( + 12041, + 12041, + 2397, + '1950-01-01 00:00:00.000000', + 30, + 381, + 30000, + 0 + ), + ( + 12042, + 12042, + 2398, + '1950-01-01 00:00:00.000000', + 30, + 402, + 30000, + 0 + ), + ( + 12043, + 12043, + 2399, + '1950-01-01 00:00:00.000000', + 30, + 424, + 30000, + 0 + ), + ( + 12044, + 12044, + 2400, + '1950-01-01 00:00:00.000000', + 30, + 448, + 30000, + 0 + ), + ( + 12045, + 12045, + 2401, + '1950-01-01 00:00:00.000000', + 30, + 472, + 30000, + 0 + ), + ( + 12046, + 12046, + 2402, + '1950-01-01 00:00:00.000000', + 30, + 497, + 30000, + 0 + ), + ( + 12047, + 12047, + 2403, + '1950-01-01 00:00:00.000000', + 30, + 523, + 30000, + 0 + ), + ( + 12048, + 12048, + 2404, + '1950-01-01 00:00:00.000000', + 30, + 550, + 30000, + 0 + ), + ( + 12049, + 12049, + 2405, + '1950-01-01 00:00:00.000000', + 30, + 578, + 30000, + 0 + ), + ( + 12050, + 12050, + 2406, + '1950-01-01 00:00:00.000000', + 30, + 608, + 30000, + 0 + ), + ( + 12051, + 12051, + 2407, + '1950-01-01 00:00:00.000000', + 30, + 638, + 30000, + 0 + ), + ( + 12052, + 12052, + 2408, + '1950-01-01 00:00:00.000000', + 30, + 669, + 30000, + 0 + ), + ( + 12053, + 12053, + 2409, + '1950-01-01 00:00:00.000000', + 30, + 701, + 30000, + 0 + ), + ( + 12054, + 12054, + 2410, + '1950-01-01 00:00:00.000000', + 30, + 734, + 30000, + 0 + ), + ( + 12055, + 12055, + 2411, + '1950-01-01 00:00:00.000000', + 30, + 769, + 30000, + 0 + ), + ( + 12056, + 12056, + 2412, + '1950-01-01 00:00:00.000000', + 30, + 804, + 30000, + 0 + ), + ( + 12057, + 12057, + 2413, + '1950-01-01 00:00:00.000000', + 30, + 840, + 30000, + 0 + ), + ( + 12058, + 12058, + 2414, + '1950-01-01 00:00:00.000000', + 0, + 878, + 30000, + 0 + ), + ( + 12059, + 12059, + 2415, + '1950-01-01 00:00:00.000000', + 0, + 916, + 30000, + 0 + ), + ( + 12060, + 12060, + 2416, + '1950-01-01 00:00:00.000000', + 0, + 956, + 30000, + 0 + ), + ( + 12061, + 12061, + 2417, + '1950-01-01 00:00:00.000000', + 0, + 996, + 30000, + 0 + ), + ( + 12062, + 12062, + 2418, + '1950-01-01 00:00:00.000000', + 0, + 1038, + 30000, + 0 + ), + ( + 12063, + 12063, + 2419, + '1950-01-01 00:00:00.000000', + 0, + 1081, + 30000, + 0 + ), + ( + 12064, + 12064, + 2420, + '1950-01-01 00:00:00.000000', + 250, + 206, + 30000, + 0 + ), + ( + 12065, + 12066, + 2673, + '1995-01-01 00:00:00.000000', + 60, + 226, + 30000, + 0 + ), + ( + 12066, + 12065, + 2674, + '1995-01-01 00:00:00.000000', + 125, + 203, + 30000, + 0 + ), + ( + 12067, + 12067, + 2675, + '1995-01-01 00:00:00.000000', + 60, + 239, + 30000, + 0 + ), + ( + 12068, + 12069, + 2676, + '1995-01-01 00:00:00.000000', + 125, + 214, + 30000, + 0 + ), + ( + 12069, + 12068, + 2677, + '1995-01-01 00:00:00.000000', + 60, + 253, + 30000, + 0 + ), + ( + 13001, + 13001, + 578, + '1960-01-01 00:00:00.000000', + 1000, + 312, + 30000, + 0 + ), + ( + 13002, + 13002, + 579, + '1960-01-01 00:00:00.000000', + 1000, + 332, + 30000, + 0 + ), + ( + 13003, + 13003, + 580, + '1960-01-01 00:00:00.000000', + 1000, + 352, + 30000, + 0 + ), + ( + 13004, + 13004, + 581, + '1960-01-01 00:00:00.000000', + 1000, + 372, + 30000, + 0 + ), + ( + 13005, + 13005, + 582, + '1960-01-01 00:00:00.000000', + 500, + 392, + 30000, + 0 + ), + ( + 13006, + 13006, + 583, + '1960-01-01 00:00:00.000000', + 500, + 412, + 30000, + 0 + ), + ( + 13007, + 13007, + 584, + '1960-01-01 00:00:00.000000', + 500, + 432, + 30000, + 0 + ), + ( + 13008, + 13008, + 585, + '1960-01-01 00:00:00.000000', + 500, + 452, + 30000, + 0 + ), + ( + 13009, + 13009, + 586, + '1960-01-01 00:00:00.000000', + 500, + 472, + 30000, + 0 + ), + ( + 13010, + 13010, + 587, + '1960-01-01 00:00:00.000000', + 500, + 492, + 30000, + 0 + ), + ( + 13011, + 13011, + 588, + '1960-01-01 00:00:00.000000', + 500, + 512, + 30000, + 0 + ), + ( + 13012, + 13012, + 589, + '1960-01-01 00:00:00.000000', + 250, + 532, + 30000, + 0 + ), + ( + 13013, + 13013, + 590, + '1960-01-01 00:00:00.000000', + 250, + 607, + 30000, + 0 + ), + ( + 13014, + 13014, + 591, + '1960-01-01 00:00:00.000000', + 250, + 629, + 30000, + 0 + ), + ( + 13015, + 13015, + 592, + '1960-01-01 00:00:00.000000', + 250, + 651, + 30000, + 0 + ), + ( + 13016, + 13016, + 593, + '1960-01-01 00:00:00.000000', + 250, + 673, + 30000, + 0 + ), + ( + 13017, + 13017, + 594, + '1960-01-01 00:00:00.000000', + 250, + 695, + 30000, + 0 + ), + ( + 13018, + 13018, + 595, + '1960-01-01 00:00:00.000000', + 250, + 717, + 30000, + 0 + ), + ( + 13019, + 13019, + 596, + '1960-01-01 00:00:00.000000', + 125, + 739, + 30000, + 0 + ), + ( + 13020, + 13020, + 597, + '1960-01-01 00:00:00.000000', + 125, + 761, + 30000, + 0 + ), + ( + 13021, + 13021, + 598, + '1960-01-01 00:00:00.000000', + 60, + 783, + 30000, + 0 + ), + ( + 13022, + 13022, + 599, + '1960-01-01 00:00:00.000000', + 60, + 878, + 30000, + 0 + ), + ( + 13023, + 13023, + 600, + '1960-01-01 00:00:00.000000', + 60, + 902, + 30000, + 0 + ), + ( + 13024, + 13024, + 601, + '1960-01-01 00:00:00.000000', + 30, + 926, + 30000, + 0 + ), + ( + 13025, + 13025, + 2678, + '1995-01-01 00:00:00.000000', + 60, + 1151, + 30000, + 0 + ), + ( + 14001, + 14001, + 602, + '1960-01-01 00:00:00.000000', + 1000, + 137, + 30000, + 0 + ), + ( + 14002, + 14002, + 603, + '1960-01-01 00:00:00.000000', + 250, + 187, + 30000, + 0 + ), + ( + 14003, + 14003, + 604, + '1960-01-01 00:00:00.000000', + 125, + 637, + 30000, + 0 + ), + ( + 14004, + 14004, + 605, + '1960-01-01 00:00:00.000000', + 0, + 1487, + 30000, + 0 + ), + ( + 14005, + 14005, + 2679, + '1995-01-01 00:00:00.000000', + 60, + 837, + 30000, + 0 + ), + ( + 15001, + 15001, + 2031, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 16001, + 16001, + 195, + '1953-01-01 00:00:00.000000', + 500, + 5, + 30000, + 0 + ), + ( + 17001, + 17001, + 2375, + '1964-01-01 00:00:00.000000', + 1000, + 25, + 30000, + 0 + ), + ( + 18001, + 18001, + 226, + '1999-01-01 00:00:00.000000', + 500, + 48, + 30000, + 0 + ), + ( + 18002, + 18002, + 2157, + '1999-01-01 00:00:00.000000', + 500, + 39, + 30000, + 0 + ), + ( + 18003, + 18003, + 2158, + '1999-01-01 00:00:00.000000', + 500, + 55, + 30000, + 0 + ), + ( + 18004, + 18004, + 2159, + '1999-01-01 00:00:00.000000', + 500, + 65, + 30000, + 0 + ), + ( + 20101, + 20101, + 1, + '1932-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20102, + 20102, + 7, + '1940-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20103, + 20103, + 14, + '1953-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20104, + 20104, + 21, + '1957-01-01 00:00:00.000000', + 1000, + 1002, + 30000, + 0 + ), + ( + 20105, + 20105, + 25, + '1957-01-01 00:00:00.000000', + 1000, + 1002, + 30000, + 0 + ), + ( + 20106, + 20106, + 47, + '1957-01-01 00:00:00.000000', + 250, + 1255, + 30000, + 0 + ), + ( + 20107, + 20107, + 32, + '1963-01-01 00:00:00.000000', + 250, + 3950, + 30000, + 0 + ), + ( + 20108, + 20108, + 509, + '1964-01-01 00:00:00.000000', + 250, + 6363, + 30000, + 0 + ), + ( + 20109, + 20109, + 40, + '1964-01-01 00:00:00.000000', + 1000, + 3885, + 30000, + 0 + ), + ( + 20110, + 20110, + 974, + '1969-01-01 00:00:00.000000', + 125, + 3871, + 30000, + 0 + ), + ( + 20111, + 20111, + 36, + '1970-01-01 00:00:00.000000', + 60, + 11238, + 30000, + 0 + ), + ( + 20112, + 20112, + 2, + '1949-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20113, + 20113, + 3, + '1957-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20114, + 20114, + 8, + '1957-01-01 00:00:00.000000', + 60, + 11817, + 30000, + 0 + ), + ( + 20115, + 20115, + 16, + '1957-01-01 00:00:00.000000', + 1000, + 1012, + 30000, + 0 + ), + ( + 20116, + 20116, + 48, + '1964-01-01 00:00:00.000000', + 1000, + 4242, + 30000, + 0 + ), + ( + 20117, + 20117, + 26, + '1963-01-01 00:00:00.000000', + 0, + 23463, + 30000, + 0 + ), + ( + 20118, + 20118, + 49, + '1958-01-01 00:00:00.000000', + 1000, + 2724, + 30000, + 0 + ), + ( + 20119, + 20119, + 33, + '1967-01-01 00:00:00.000000', + 1000, + 5584, + 30000, + 0 + ), + ( + 20120, + 20120, + 37, + '1967-01-01 00:00:00.000000', + 250, + 10886, + 30000, + 0 + ), + ( + 20121, + 20121, + 41, + '1970-01-01 00:00:00.000000', + 1000, + 7196, + 30000, + 0 + ), + ( + 20122, + 20122, + 45, + '1970-01-01 00:00:00.000000', + 1000, + 9158, + 30000, + 0 + ), + ( + 20123, + 20123, + 46, + '1970-01-01 00:00:00.000000', + 1000, + 5182, + 30000, + 0 + ), + ( + 20124, + 20124, + 4, + '1947-01-01 00:00:00.000000', + 1000, + 3760, + 30000, + 0 + ), + ( + 20125, + 20125, + 9, + '1959-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20126, + 20126, + 10, + '1969-01-01 00:00:00.000000', + 125, + 5109, + 30000, + 0 + ), + ( + 20127, + 20127, + 5, + '1955-01-01 00:00:00.000000', + 1000, + 1000, + 30000, + 0 + ), + ( + 20128, + 20128, + 6, + '1966-01-01 00:00:00.000000', + 250, + 7022, + 30000, + 0 + ), + ( + 20129, + 20129, + 12, + '1969-01-01 00:00:00.000000', + 250, + 6454, + 30000, + 0 + ), + ( + 20130, + 20130, + 20, + '1973-01-01 00:00:00.000000', + 60, + 14915, + 30000, + 0 + ), + ( + 20131, + 20131, + 172, + '1969-01-01 00:00:00.000000', + 1000, + 5549, + 30000, + 0 + ), + ( + 20132, + 20132, + 173, + '1969-01-01 00:00:00.000000', + 250, + 6534, + 30000, + 0 + ), + ( + 20133, + 20133, + 174, + '1969-01-01 00:00:00.000000', + 250, + 5289, + 30000, + 0 + ), + ( + 20134, + 20134, + 175, + '1970-01-01 00:00:00.000000', + 125, + 9275, + 30000, + 0 + ), + ( + 20135, + 20135, + 176, + '1971-01-01 00:00:00.000000', + 250, + 5084, + 30000, + 0 + ), + ( + 20138, + 20138, + 526, + '1999-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20140, + 20140, + 2217, + '1967-01-01 00:00:00.000000', + 250, + 11458, + 30000, + 0 + ), + ( + 20146, + 20146, + 1051, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20147, + 20147, + 1052, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20148, + 20148, + 1053, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20149, + 20149, + 1054, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20150, + 20150, + 1055, + '1990-01-01 00:00:00.000000', + 0, + 3891, + 30000, + 0 + ), + ( + 20151, + 20151, + 1056, + '1990-01-01 00:00:00.000000', + 0, + 3891, + 30000, + 0 + ), + ( + 20152, + 20152, + 1057, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20153, + 20153, + 1058, + '1990-01-01 00:00:00.000000', + 0, + 1000, + 30000, + 0 + ), + ( + 20157, + 20157, + 990, + '1969-01-01 00:00:00.000000', + 25, + 5089, + 30000, + 0 + ), + ( + 20207, + 20207, + 2153, + '1966-01-01 00:00:00.000000', + 0, + 49296, + 15000, + 0 + ), + ( + 20210, + 20210, + 2179, + '1970-01-01 00:00:00.000000', + 250, + 7101, + 1500, + 0 + ), + ( + 20211, + 20211, + 2180, + '1969-01-01 00:00:00.000000', + 125, + 3871, + 1500, + 0 + ), + ( + 20212, + 20212, + 2181, + '1970-01-01 00:00:00.000000', + 250, + 8467, + 1500, + 0 + ), + ( + 20213, + 20213, + 2182, + '1970-01-01 00:00:00.000000', + 125, + 9275, + 1500, + 0 + ), + ( + 20214, + 20214, + 2183, + '1970-01-01 00:00:00.000000', + 125, + 9275, + 1500, + 0 + ), + ( + 20215, + 20215, + 2184, + '1970-01-01 00:00:00.000000', + 125, + 9275, + 1500, + 0 + ), + ( + 20216, + 20216, + 2185, + '1971-01-01 00:00:00.000000', + 125, + 5084, + 1500, + 0 + ), + ( + 20217, + 20217, + 2186, + '1964-01-01 00:00:00.000000', + 250, + 4242, + 1500, + 0 + ), + ( + 20218, + 20218, + 2187, + '1967-01-01 00:00:00.000000', + 250, + 5584, + 1500, + 0 + ), + ( + 20219, + 20219, + 2188, + '1967-01-01 00:00:00.000000', + 125, + 11619, + 1500, + 0 + ), + ( + 20220, + 20220, + 2189, + '1967-01-01 00:00:00.000000', + 60, + 11458, + 1500, + 0 + ), + ( + 20221, + 20221, + 2190, + '1970-01-01 00:00:00.000000', + 250, + 7196, + 1500, + 0 + ), + ( + 20222, + 20222, + 2191, + '1970-01-01 00:00:00.000000', + 1000, + 5497, + 1500, + 0 + ), + ( + 20223, + 20223, + 2192, + '1970-01-01 00:00:00.000000', + 250, + 5162, + 1500, + 0 + ), + ( + 20224, + 20224, + 2193, + '1969-01-01 00:00:00.000000', + 125, + 5086, + 1500, + 0 + ), + ( + 20225, + 20225, + 2194, + '1969-01-01 00:00:00.000000', + 125, + 5086, + 1500, + 0 + ), + ( + 20226, + 20226, + 1230, + '1969-01-01 00:00:00.000000', + 125, + 5998, + 1500, + 0 + ), + ( + 20227, + 20227, + 2196, + '1973-01-01 00:00:00.000000', + 60, + 19009, + 1500, + 0 + ), + ( + 20228, + 20228, + 2197, + '1973-01-01 00:00:00.000000', + 60, + 14624, + 1500, + 0 + ), + ( + 21001, + 21008, + 198, + '1953-01-01 00:00:00.000000', + 500, + 95, + 30000, + 0 + ), + ( + 21002, + 21012, + 221, + '1937-01-01 00:00:00.000000', + 500, + 85, + 30000, + 0 + ), + ( + 21003, + 21013, + 222, + '1939-01-01 00:00:00.000000', + 500, + 85, + 30000, + 0 + ), + ( + 21004, + 21014, + 220, + '1940-01-01 00:00:00.000000', + 500, + 90, + 30000, + 0 + ), + ( + 21005, + 21015, + 223, + '1941-01-01 00:00:00.000000', + 500, + 90, + 30000, + 0 + ), + ( + 21006, + 21001, + 202, + '1947-01-01 00:00:00.000000', + 500, + 110, + 30000, + 0 + ), + ( + 21007, + 21002, + 203, + '1949-01-01 00:00:00.000000', + 500, + 115, + 30000, + 0 + ), + ( + 21008, + 21004, + 205, + '1953-01-01 00:00:00.000000', + 500, + 100, + 30000, + 0 + ), + ( + 21009, + 21009, + 199, + '1955-01-01 00:00:00.000000', + 500, + 100, + 30000, + 0 + ), + ( + 21010, + 21010, + 200, + '1956-01-01 00:00:00.000000', + 500, + 95, + 30000, + 0 + ), + ( + 21011, + 21011, + 201, + '1957-01-01 00:00:00.000000', + 500, + 95, + 30000, + 0 + ), + ( + 21012, + 21005, + 206, + '1967-01-01 00:00:00.000000', + 500, + 125, + 30000, + 0 + ), + ( + 21013, + 21006, + 207, + '1969-01-01 00:00:00.000000', + 500, + 120, + 30000, + 0 + ), + ( + 21014, + 21007, + 208, + '1970-01-01 00:00:00.000000', + 500, + 125, + 30000, + 0 + ), + ( + 21015, + 21003, + 204, + '1973-01-01 00:00:00.000000', + 500, + 130, + 30000, + 0 + ), + ( + 21016, + 21016, + 246, + '1949-01-01 00:00:00.000000', + 500, + 110, + 30000, + 0 + ), + ( + 22001, + 22002, + 657, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22002, + 22003, + 658, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22003, + 22004, + 659, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22004, + 22005, + 660, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22005, + 22006, + 661, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22006, + 22007, + 662, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22007, + 22008, + 663, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22008, + 22009, + 664, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22009, + 22010, + 665, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22010, + 22011, + 666, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22011, + 22012, + 667, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22012, + 22013, + 668, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22013, + 22014, + 669, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22014, + 22015, + 670, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22015, + 22016, + 671, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22016, + 22017, + 672, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22017, + 22018, + 673, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22018, + 22019, + 674, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22019, + 22020, + 2114, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22020, + 22023, + 2151, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22021, + 22022, + 2150, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22022, + 22021, + 2149, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 22023, + 22024, + 2160, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 23001, + 23001, + 228, + '2027-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23002, + 23002, + 229, + '1931-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23003, + 23003, + 830, + '1932-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23004, + 23004, + 230, + '1932-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23005, + 23005, + 231, + '1934-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23006, + 23006, + 232, + '1937-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23007, + 23007, + 233, + '1937-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23008, + 23008, + 234, + '1939-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23009, + 23009, + 834, + '1940-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23010, + 23010, + 235, + '1941-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23011, + 23011, + 236, + '1947-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23012, + 23010, + 237, + '1948-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 23013, + 23012, + 237, + '1948-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 25001, + 25001, + 99, + '1967-01-01 00:00:00.000000', + 1000, + 359, + 30000, + 0 + ), + ( + 25002, + 25002, + 100, + '1967-01-01 00:00:00.000000', + 500, + 458, + 30000, + 0 + ), + ( + 25003, + 25003, + 101, + '1967-01-01 00:00:00.000000', + 250, + 556, + 30000, + 0 + ), + ( + 25004, + 25004, + 1549, + '1967-01-01 00:00:00.000000', + 125, + 655, + 30000, + 0 + ), + ( + 25005, + 25005, + 1578, + '1967-01-01 00:00:00.000000', + 0, + 754, + 30000, + 0 + ), + ( + 25006, + 25006, + 2041, + '1968-01-01 00:00:00.000000', + 500, + 470, + 30000, + 0 + ), + ( + 25007, + 25007, + 2067, + '1967-01-01 00:00:00.000000', + 500, + 470, + 30000, + 0 + ), + ( + 25008, + 25008, + 2352, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25009, + 25009, + 2353, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25010, + 25010, + 2354, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25011, + 25011, + 2355, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25012, + 25012, + 2356, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25013, + 25013, + 2357, + '2001-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 25014, + 25014, + 2358, + '2001-01-01 00:00:00.000000', + 250, + 288, + 30000, + 0 + ), + ( + 25015, + 25015, + 2359, + '2001-01-01 00:00:00.000000', + 250, + 288, + 30000, + 0 + ), + ( + 25016, + 25016, + 2360, + '2001-01-01 00:00:00.000000', + 250, + 288, + 30000, + 0 + ), + ( + 25017, + 25017, + 2361, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 25018, + 25018, + 2362, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 25019, + 25019, + 2363, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 25020, + 25020, + 2364, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 25021, + 25021, + 2365, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 25022, + 25022, + 2366, + '2001-01-01 00:00:00.000000', + 250, + 318, + 30000, + 0 + ), + ( + 26001, + 26001, + 244, + '1966-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 27003, + 27001, + 238, + '2027-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 28001, + 28001, + 272, + '1940-01-01 00:00:00.000000', + 500, + 15, + 30000, + 0 + ), + ( + 28002, + 28002, + 273, + '1947-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 28003, + 28003, + 274, + '1955-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 28004, + 28004, + 275, + '1957-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 28005, + 28005, + 276, + '1957-01-01 00:00:00.000000', + 500, + 10, + 30000, + 0 + ), + ( + 29001, + 29001, + 637, + '1975-01-01 00:00:00.000000', + 1000, + 387, + 30000, + 0 + ), + ( + 29002, + 29002, + 638, + '1975-01-01 00:00:00.000000', + 500, + 498, + 30000, + 0 + ), + ( + 29003, + 29003, + 639, + '1975-01-01 00:00:00.000000', + 500, + 682, + 30000, + 0 + ), + ( + 29004, + 29004, + 640, + '1975-01-01 00:00:00.000000', + 250, + 940, + 30000, + 0 + ), + ( + 29005, + 29005, + 641, + '1975-01-01 00:00:00.000000', + 125, + 1272, + 30000, + 0 + ), + ( + 29006, + 29006, + 642, + '1975-01-01 00:00:00.000000', + 60, + 1678, + 30000, + 0 + ), + ( + 29007, + 29007, + 643, + '1975-01-01 00:00:00.000000', + 60, + 2157, + 30000, + 0 + ), + ( + 29008, + 29008, + 644, + '1975-01-01 00:00:00.000000', + 30, + 2710, + 30000, + 0 + ), + ( + 29009, + 29009, + 645, + '1975-01-01 00:00:00.000000', + 30, + 3337, + 30000, + 0 + ), + ( + 29010, + 29010, + 646, + '1975-01-01 00:00:00.000000', + 0, + 4038, + 30000, + 0 + ), + ( + 30001, + 30001, + 647, + '1975-01-01 00:00:00.000000', + 1000, + 387, + 30000, + 0 + ), + ( + 30002, + 30002, + 648, + '1975-01-01 00:00:00.000000', + 500, + 498, + 30000, + 0 + ), + ( + 30003, + 30003, + 649, + '1975-01-01 00:00:00.000000', + 250, + 682, + 30000, + 0 + ), + ( + 30004, + 30004, + 650, + '1975-01-01 00:00:00.000000', + 250, + 940, + 30000, + 0 + ), + ( + 30005, + 30005, + 641, + '1975-01-01 00:00:00.000000', + 125, + 1272, + 30000, + 0 + ), + ( + 30006, + 30006, + 652, + '1975-01-01 00:00:00.000000', + 60, + 1678, + 30000, + 0 + ), + ( + 30007, + 30007, + 643, + '1975-01-01 00:00:00.000000', + 60, + 2157, + 30000, + 0 + ), + ( + 30008, + 30008, + 654, + '1975-01-01 00:00:00.000000', + 30, + 2710, + 30000, + 0 + ), + ( + 30009, + 30009, + 645, + '1975-01-01 00:00:00.000000', + 30, + 3337, + 30000, + 0 + ), + ( + 30010, + 30010, + 656, + '1975-01-01 00:00:00.000000', + 0, + 4038, + 30000, + 0 + ), + ( + 31150, + 31169, + 2164, + '2001-02-05 00:00:00.000000', + 1000, + 50, + 30000, + 0 + ), + ( + 31151, + 31167, + 2162, + '2001-02-05 00:00:00.000000', + 1000, + 50, + 30000, + 0 + ), + ( + 31152, + 31168, + 2163, + '2001-02-05 00:00:00.000000', + 1000, + 50, + 30000, + 0 + ), + ( + 31153, + 31166, + 2161, + '2001-02-05 00:00:00.000000', + 1000, + 50, + 30000, + 0 + ), + ( + 32001, + 32001, + 407, + '1960-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 33001, + 33001, + 192, + '1999-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 34001, + 34001, + 828, + '1932-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 34002, + 34001, + 829, + '1932-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 35001, + 35001, + 831, + '1932-01-01 00:00:00.000000', + 500, + 100, + 30000, + 0 + ), + ( + 35002, + 35002, + 443, + '1940-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 35003, + 35003, + 2156, + '1965-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 36001, + 36002, + 2032, + '2000-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 36002, + 36002, + 953, + '1932-01-01 00:00:00.000000', + 500, + 0, + 30000, + 10 + ), + ( + 36003, + 36002, + 954, + '1932-01-01 00:00:00.000000', + 500, + 0, + 30000, + 10 + ), + ( + 36004, + 36002, + 955, + '1940-01-01 00:00:00.000000', + 500, + 0, + 30000, + 10 + ), + ( + 36005, + 36002, + 956, + '1940-01-01 00:00:00.000000', + 500, + 0, + 30000, + 10 + ), + ( + 36006, + 36002, + 957, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36007, + 36002, + 958, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36008, + 36002, + 959, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36009, + 36002, + 960, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36010, + 36002, + 961, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36011, + 36002, + 1014, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36012, + 36002, + 1015, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36013, + 36002, + 1016, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 9 + ), + ( + 36014, + 36002, + 1017, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 2 + ), + ( + 36015, + 36002, + 1018, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36016, + 36175, + 1019, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 18 + ), + ( + 36017, + 36002, + 1021, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 2 + ), + ( + 36018, + 36002, + 1020, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 2 + ), + ( + 36019, + 36002, + 1113, + '1949-01-01 00:00:00.000000', + 500, + 0, + 30000, + 20 + ), + ( + 36020, + 36002, + 1114, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 21 + ), + ( + 36021, + 36002, + 1115, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36022, + 36002, + 1116, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 9 + ), + ( + 36023, + 36002, + 1117, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36024, + 36002, + 1118, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36025, + 36002, + 1119, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36026, + 36002, + 1120, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36027, + 36002, + 1121, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36028, + 36002, + 1122, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36029, + 36002, + 1123, + '1973-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36030, + 36003, + 1472, + '1956-01-01 00:00:00.000000', + 500, + 0, + 30000, + 21 + ), + ( + 36031, + 36004, + 1474, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36032, + 36005, + 1475, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36033, + 36006, + 1476, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36034, + 36007, + 1477, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36035, + 36008, + 1478, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36036, + 36009, + 1479, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36037, + 36010, + 1480, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36038, + 36011, + 1481, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36039, + 36012, + 1482, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36040, + 36013, + 1483, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36041, + 36014, + 1484, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36042, + 36015, + 1485, + '1956-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36043, + 36016, + 1486, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36044, + 36017, + 1487, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36045, + 36018, + 1488, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36046, + 36019, + 1489, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36047, + 36020, + 1490, + '1964-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36048, + 36021, + 1491, + '1964-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36049, + 36022, + 1492, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36050, + 36023, + 1493, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36051, + 36024, + 1494, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36052, + 36025, + 1495, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36053, + 36026, + 1496, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36054, + 36027, + 1497, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36055, + 36028, + 1498, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36056, + 36029, + 1500, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36057, + 36030, + 1501, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36058, + 36031, + 1502, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36059, + 36032, + 1503, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36060, + 36033, + 1504, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36061, + 36034, + 1505, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36062, + 36035, + 1506, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36063, + 36036, + 1507, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36064, + 36037, + 1508, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36065, + 36038, + 1509, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36066, + 36039, + 1510, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36067, + 36040, + 1511, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36068, + 36041, + 1512, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36069, + 36042, + 1513, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36070, + 36044, + 1515, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36071, + 36045, + 1518, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36072, + 36046, + 1519, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36073, + 36047, + 1520, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36074, + 36048, + 1522, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36075, + 36049, + 1523, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36076, + 36050, + 1524, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36077, + 36051, + 1525, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36078, + 36052, + 1526, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36079, + 36053, + 1527, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36080, + 36054, + 1528, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36081, + 36055, + 1529, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36082, + 36056, + 1531, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36083, + 36057, + 1532, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36084, + 36058, + 1533, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36085, + 36061, + 1534, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36086, + 36059, + 1535, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36087, + 36060, + 1536, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36088, + 36062, + 1537, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36089, + 36063, + 1539, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36090, + 36064, + 1540, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36091, + 36065, + 1541, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36092, + 36066, + 1542, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36093, + 36067, + 1543, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36094, + 36068, + 1545, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36095, + 36069, + 1546, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36096, + 36070, + 1547, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36097, + 36071, + 1548, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 12 + ), + ( + 36098, + 36072, + 1550, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36099, + 36073, + 1551, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36100, + 36074, + 1552, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36101, + 36075, + 1553, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36102, + 36076, + 1554, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36103, + 36077, + 1555, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36104, + 36078, + 1556, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36105, + 36079, + 1557, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36106, + 36080, + 1558, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36107, + 36081, + 1562, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36108, + 36082, + 1563, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36109, + 36083, + 1564, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36110, + 36084, + 1566, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36111, + 36085, + 1567, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36112, + 36086, + 1568, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36113, + 36087, + 1569, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36114, + 36088, + 1570, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36115, + 36089, + 1571, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36116, + 36090, + 1572, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36117, + 36091, + 1575, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36118, + 36092, + 1576, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36119, + 36093, + 1577, + '1967-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36120, + 36094, + 1579, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36121, + 36095, + 1581, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36122, + 36096, + 1583, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36123, + 36097, + 1584, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36124, + 36098, + 1585, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36125, + 36099, + 1586, + '1973-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36126, + 36100, + 1587, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36127, + 36101, + 1588, + '1955-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36128, + 36102, + 1589, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36129, + 36103, + 1590, + '1956-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36130, + 36104, + 1592, + '1956-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36131, + 36105, + 1593, + '1957-01-01 00:00:00.000000', + 500, + 0, + 30000, + 15 + ), + ( + 36132, + 36106, + 1594, + '1958-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36133, + 36107, + 1595, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36134, + 36108, + 1596, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36135, + 36109, + 1597, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36136, + 36110, + 1598, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36137, + 36111, + 1599, + '1961-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36138, + 36112, + 1601, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36139, + 36113, + 1602, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36140, + 36114, + 1603, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36141, + 36115, + 1604, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36142, + 36116, + 1605, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36143, + 36117, + 1606, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36144, + 36118, + 1607, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36145, + 36119, + 1608, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36146, + 36120, + 1610, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36147, + 36121, + 1611, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36148, + 36122, + 1612, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36149, + 36123, + 1614, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36150, + 36124, + 1616, + '1966-01-01 00:00:00.000000', + 500, + 0, + 32000, + 3 + ), + ( + 36151, + 36125, + 1617, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36152, + 36126, + 1618, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36153, + 36127, + 1619, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36154, + 36128, + 1620, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36155, + 36129, + 1621, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36156, + 36130, + 1622, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36157, + 36131, + 1625, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36158, + 36132, + 1626, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36159, + 36133, + 1627, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36160, + 36134, + 1628, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36161, + 36135, + 1630, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36162, + 36136, + 1631, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36163, + 36137, + 1632, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 4 + ), + ( + 36164, + 36138, + 1633, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36165, + 36139, + 1634, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36166, + 36140, + 1635, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36167, + 36141, + 1636, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36168, + 36142, + 1637, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36169, + 36143, + 1638, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36170, + 36144, + 1639, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36171, + 36145, + 1640, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 16 + ), + ( + 36172, + 36146, + 1641, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36173, + 36147, + 1642, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36174, + 36148, + 1643, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36175, + 36149, + 1644, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36176, + 36150, + 1645, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36177, + 36151, + 1646, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36178, + 36152, + 1648, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36179, + 36153, + 1649, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36180, + 36154, + 1650, + '1973-01-01 00:00:00.000000', + 500, + 0, + 30000, + 17 + ), + ( + 36181, + 36155, + 1651, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36182, + 36156, + 1652, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36183, + 36157, + 1653, + '1965-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36184, + 36158, + 1654, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36185, + 36159, + 1656, + '1971-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36186, + 36160, + 1657, + '1972-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36187, + 36161, + 1658, + '1974-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36188, + 36162, + 1660, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36189, + 36163, + 1661, + '1959-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36190, + 36164, + 1662, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36191, + 36165, + 1663, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36192, + 36166, + 1664, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36193, + 36167, + 1665, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36194, + 36168, + 1666, + '1962-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36195, + 36169, + 1667, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36196, + 36170, + 1668, + '1964-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36197, + 36171, + 1669, + '1964-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36198, + 36172, + 1672, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36199, + 36173, + 1673, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36200, + 36174, + 1674, + '1964-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36201, + 36176, + 1676, + '1966-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36202, + 36177, + 1677, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 1 + ), + ( + 36203, + 36178, + 1679, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36204, + 36179, + 1680, + '1968-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36205, + 36180, + 1681, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36206, + 36181, + 1682, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 14 + ), + ( + 36207, + 36002, + 2032, + '2000-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 36208, + 36182, + 2046, + '1956-01-01 00:00:00.000000', + 500, + 0, + 30000, + 6 + ), + ( + 36209, + 36183, + 1514, + '1963-01-01 00:00:00.000000', + 500, + 0, + 30000, + 19 + ), + ( + 36210, + 36184, + 2061, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36211, + 36185, + 2062, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 5 + ), + ( + 36212, + 36186, + 2082, + '1969-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36213, + 36187, + 2083, + '1970-01-01 00:00:00.000000', + 500, + 0, + 30000, + 13 + ), + ( + 36214, + 36188, + 2089, + '1960-01-01 00:00:00.000000', + 500, + 0, + 30000, + 3 + ), + ( + 36215, + 36189, + 2454, + '1960-01-01 00:00:00.000000', + 0, + 0, + 30000, + 6 + ), + ( + 37001, + 37001, + 1565, + '1999-01-01 00:00:00.000000', + 500, + 0, + 30000, + 0 + ), + ( + 39001, + 39001, + 525, + '1999-01-01 00:00:00.000000', + 500, + 500, + 30000, + 0 + ), + ( + 40001, + 40001, + 527, + '1999-01-01 00:00:00.000000', + 500, + 39, + 30000, + 0 + ), + ( + 40002, + 40002, + 827, + '1932-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40003, + 40003, + 833, + '1940-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40004, + 40004, + 836, + '1949-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40005, + 40005, + 838, + '1953-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40006, + 40006, + 840, + '1957-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40007, + 40007, + 842, + '1957-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40008, + 40008, + 844, + '1957-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40009, + 40009, + 846, + '1963-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40010, + 40010, + 850, + '1964-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40011, + 40011, + 848, + '1964-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40012, + 40012, + 852, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40013, + 40013, + 854, + '1970-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40014, + 40014, + 536, + '1947-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40015, + 40015, + 537, + '1955-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40016, + 40016, + 538, + '1957-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40017, + 40017, + 539, + '1957-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40018, + 40018, + 540, + '1957-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40019, + 40019, + 541, + '1958-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40020, + 40020, + 542, + '1959-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40021, + 40021, + 543, + '1963-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40022, + 40022, + 544, + '1964-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40023, + 40023, + 545, + '1966-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40024, + 40024, + 546, + '1967-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40025, + 40025, + 547, + '1967-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40026, + 40026, + 548, + '1969-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40027, + 40027, + 549, + '1969-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40028, + 40028, + 550, + '1970-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40029, + 40029, + 551, + '1970-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40030, + 40030, + 552, + '1970-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40031, + 40031, + 553, + '1973-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40032, + 40032, + 554, + '1969-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40033, + 40033, + 555, + '1969-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40034, + 40034, + 556, + '1969-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40035, + 40035, + 557, + '1970-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40036, + 40036, + 558, + '1971-01-01 00:00:00.000000', + 500, + 30, + 30000, + 0 + ), + ( + 40037, + 40037, + 253, + '1963-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40038, + 40038, + 263, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40039, + 40039, + 265, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40040, + 40040, + 264, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40041, + 40041, + 257, + '1967-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40042, + 40042, + 256, + '1967-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40043, + 40043, + 251, + '1957-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40044, + 40044, + 254, + '1964-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40045, + 40045, + 252, + '1963-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40046, + 40046, + 262, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40047, + 40047, + 271, + '1973-01-01 00:00:00.000000', + 50, + 30, + 30000, + 0 + ), + ( + 40048, + 40048, + 255, + '1966-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40049, + 40049, + 260, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40050, + 40050, + 259, + '1969-01-01 00:00:00.000000', + 50, + 30, + 30000, + 0 + ), + ( + 40051, + 40051, + 258, + '1969-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40052, + 40052, + 261, + '1970-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40053, + 40053, + 266, + '1970-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40054, + 40054, + 267, + '1970-01-01 00:00:00.000000', + 100, + 40, + 30000, + 0 + ), + ( + 40055, + 40055, + 270, + '1973-01-01 00:00:00.000000', + 50, + 30, + 30000, + 0 + ), + ( + 40056, + 40056, + 269, + '1970-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40057, + 40057, + 408, + '1958-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40058, + 40058, + 268, + '1970-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40059, + 40059, + 1185, + '1957-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 40060, + 40060, + 2154, + '1965-01-01 00:00:00.000000', + 50, + 50, + 30000, + 0 + ), + ( + 40061, + 40061, + 2216, + '1950-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 40062, + 40062, + 2876, + '1970-01-01 00:00:00.000000', + 100, + 30, + 30000, + 0 + ), + ( + 100001, + 100001, + 190, + '1999-01-01 00:00:00.000000', + 1000, + 30, + 30000, + 0 + ), + ( + 100002, + 100002, + 857, + '1932-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100003, + 100003, + 856, + '1967-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100004, + 100004, + 456, + '1999-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100005, + 100005, + 457, + '1999-01-01 00:00:00.000000', + 100, + 2504, + 30000, + 0 + ), + ( + 100006, + 100006, + 2219, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100007, + 100066, + 2279, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100008, + 100067, + 2280, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100009, + 100068, + 2281, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100010, + 100069, + 2282, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100011, + 100070, + 2283, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100012, + 100071, + 2284, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100013, + 100072, + 2285, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100014, + 100073, + 2286, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100015, + 100074, + 2287, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100016, + 100075, + 2288, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100017, + 100076, + 2289, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100018, + 100077, + 2290, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100019, + 100078, + 2291, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100020, + 100079, + 2292, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100021, + 100080, + 2293, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100022, + 100081, + 2294, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100023, + 100082, + 2295, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100024, + 100083, + 2296, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100025, + 100084, + 2297, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100026, + 100085, + 2298, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100027, + 100086, + 2299, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100028, + 100087, + 2300, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100029, + 100088, + 2301, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100030, + 100089, + 2302, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100031, + 100090, + 2303, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100032, + 100091, + 2304, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100033, + 100092, + 2305, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100034, + 100006, + 2219, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100035, + 100007, + 2220, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100036, + 100008, + 2221, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100037, + 100009, + 2222, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100038, + 100010, + 2223, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100039, + 100011, + 2224, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100040, + 100012, + 2225, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100041, + 100013, + 2226, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100042, + 100014, + 2227, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100043, + 100015, + 2228, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100044, + 100016, + 2229, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100045, + 100017, + 2230, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100046, + 100018, + 2231, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100047, + 100019, + 2232, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100048, + 100020, + 2233, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100049, + 100021, + 2234, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100050, + 100022, + 2235, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100051, + 100023, + 2236, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100052, + 100024, + 2237, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100053, + 100025, + 2238, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100054, + 100026, + 2239, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100055, + 100027, + 2240, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100056, + 100028, + 2241, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100057, + 100029, + 2242, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100058, + 100030, + 2243, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100059, + 100031, + 2244, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100060, + 100032, + 2245, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100061, + 100033, + 2246, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100062, + 100034, + 2247, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100063, + 100035, + 2248, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100064, + 100036, + 2249, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100065, + 100037, + 2250, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100066, + 100038, + 2251, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100067, + 100039, + 2252, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100068, + 100040, + 2253, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100069, + 100041, + 2254, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100070, + 100042, + 2255, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100071, + 100043, + 2256, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100072, + 100044, + 2257, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100073, + 100045, + 2258, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100074, + 100046, + 2259, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100075, + 100047, + 2260, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100076, + 100048, + 2261, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100077, + 100049, + 2262, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100078, + 100050, + 2263, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100079, + 100051, + 2264, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100080, + 100052, + 2265, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100081, + 100053, + 2266, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100082, + 100054, + 2267, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100083, + 100055, + 2268, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100084, + 100056, + 2269, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100085, + 100057, + 2270, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100086, + 100058, + 2271, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100087, + 100059, + 2272, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100088, + 100060, + 2273, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100089, + 100061, + 2274, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100090, + 100062, + 2275, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100091, + 100063, + 2276, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100092, + 100064, + 2277, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100093, + 100106, + 2321, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100094, + 100107, + 2322, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100095, + 100108, + 2323, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100096, + 100109, + 2324, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100097, + 100110, + 2325, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100098, + 100111, + 2326, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100099, + 100112, + 2327, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100100, + 100113, + 2328, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100101, + 100114, + 2329, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100102, + 100115, + 2330, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100103, + 100116, + 2331, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100104, + 100117, + 2332, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100105, + 100118, + 2333, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100106, + 100119, + 2334, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100107, + 100120, + 2335, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100108, + 100121, + 2336, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100109, + 100122, + 2337, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100110, + 100123, + 2338, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100111, + 100124, + 2339, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100112, + 100125, + 2340, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100113, + 100126, + 2341, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100114, + 100127, + 2342, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100115, + 100128, + 2343, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100116, + 100129, + 2344, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100117, + 100130, + 2345, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100118, + 100131, + 2346, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100119, + 100132, + 2347, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100120, + 100133, + 2348, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100121, + 100134, + 2349, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100122, + 100135, + 2350, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100123, + 100093, + 2308, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100124, + 100094, + 2309, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100125, + 100095, + 2310, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100126, + 100096, + 2311, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100127, + 100097, + 2312, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100128, + 100098, + 2313, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100129, + 100099, + 2314, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100130, + 100100, + 2315, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100131, + 100101, + 2316, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100132, + 100102, + 2317, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100133, + 100103, + 2318, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100134, + 100104, + 2319, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100135, + 100105, + 2320, + '2001-01-01 00:00:00.000000', + 1000, + 36, + 30000, + 0 + ), + ( + 100136, + 100136, + 2450, + '1970-01-01 00:00:00.000000', + 0, + 36, + 30000, + 0 + ), + ( + 100137, + 100137, + 3648, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100138, + 100138, + 3649, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100139, + 100139, + 3702, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100140, + 100140, + 3703, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100141, + 100141, + 3704, + '2001-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100142, + 100142, + 3707, + '2001-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100143, + 100143, + 3708, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100144, + 100144, + 3709, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 100145, + 100145, + 3710, + '2000-01-01 00:00:00.000000', + 500, + 505, + 30000, + 0 + ), + ( + 110001, + 110001, + 209, + '1932-01-01 00:00:00.000000', + 1, + 107, + 30000, + 0 + ), + ( + 110002, + 110002, + 680, + '1950-01-01 00:00:00.000000', + 1, + 47, + 30000, + 0 + ), + ( + 110003, + 110003, + 681, + '1950-01-01 00:00:00.000000', + 1, + 65, + 30000, + 0 + ), + ( + 110004, + 110004, + 682, + '1950-01-01 00:00:00.000000', + 1, + 87, + 30000, + 0 + ), + ( + 110005, + 110005, + 683, + '1950-01-01 00:00:00.000000', + 1, + 97, + 30000, + 0 + ), + ( + 110006, + 110006, + 684, + '1950-01-01 00:00:00.000000', + 1, + 99, + 30000, + 0 + ), + ( + 110007, + 110007, + 685, + '1950-01-01 00:00:00.000000', + 1, + 62, + 30000, + 0 + ), + ( + 110008, + 110008, + 686, + '1950-01-01 00:00:00.000000', + 1, + 65, + 30000, + 0 + ), + ( + 110009, + 110009, + 687, + '1950-01-01 00:00:00.000000', + 1, + 87, + 30000, + 0 + ), + ( + 110010, + 110010, + 688, + '1950-01-01 00:00:00.000000', + 1, + 97, + 30000, + 0 + ), + ( + 110011, + 110011, + 689, + '1950-01-01 00:00:00.000000', + 1, + 114, + 30000, + 0 + ), + ( + 110012, + 110012, + 690, + '1950-01-01 00:00:00.000000', + 1, + 95, + 30000, + 0 + ), + ( + 110013, + 110013, + 691, + '1950-01-01 00:00:00.000000', + 1, + 127, + 30000, + 0 + ), + ( + 110014, + 110014, + 692, + '1950-01-01 00:00:00.000000', + 1, + 129, + 30000, + 0 + ), + ( + 110015, + 110015, + 693, + '1950-01-01 00:00:00.000000', + 1, + 62, + 30000, + 0 + ), + ( + 110016, + 110016, + 694, + '1950-01-01 00:00:00.000000', + 1, + 80, + 30000, + 0 + ), + ( + 110017, + 110017, + 695, + '1950-01-01 00:00:00.000000', + 1, + 112, + 30000, + 0 + ), + ( + 110018, + 110018, + 696, + '1950-01-01 00:00:00.000000', + 1, + 92, + 30000, + 0 + ), + ( + 110019, + 110019, + 697, + '1950-01-01 00:00:00.000000', + 1, + 95, + 30000, + 0 + ), + ( + 110020, + 110020, + 698, + '1950-01-01 00:00:00.000000', + 1, + 142, + 30000, + 0 + ), + ( + 110021, + 110021, + 699, + '1950-01-01 00:00:00.000000', + 1, + 159, + 30000, + 0 + ), + ( + 110022, + 110022, + 700, + '1960-01-01 00:00:00.000000', + 500, + 184, + 30000, + 0 + ), + ( + 110023, + 110023, + 701, + '1960-01-01 00:00:00.000000', + 1000, + 204, + 30000, + 0 + ), + ( + 110024, + 110024, + 702, + '1960-01-01 00:00:00.000000', + 500, + 225, + 30000, + 0 + ), + ( + 110025, + 110025, + 703, + '1960-01-01 00:00:00.000000', + 500, + 112, + 30000, + 0 + ), + ( + 110026, + 110026, + 704, + '1960-01-01 00:00:00.000000', + 1000, + 122, + 30000, + 0 + ), + ( + 110027, + 110027, + 705, + '1960-01-01 00:00:00.000000', + 500, + 132, + 30000, + 0 + ), + ( + 110028, + 110028, + 706, + '1960-01-01 00:00:00.000000', + 500, + 143, + 30000, + 0 + ), + ( + 110029, + 110029, + 707, + '1960-01-01 00:00:00.000000', + 500, + 153, + 30000, + 0 + ), + ( + 110030, + 110030, + 708, + '1960-01-01 00:00:00.000000', + 500, + 91, + 30000, + 0 + ), + ( + 110031, + 110031, + 709, + '1960-01-01 00:00:00.000000', + 500, + 102, + 30000, + 0 + ), + ( + 110032, + 110032, + 710, + '1960-01-01 00:00:00.000000', + 500, + 112, + 30000, + 0 + ), + ( + 110033, + 110033, + 711, + '1960-01-01 00:00:00.000000', + 500, + 122, + 30000, + 0 + ), + ( + 110034, + 110034, + 712, + '1960-01-01 00:00:00.000000', + 500, + 132, + 30000, + 0 + ), + ( + 110035, + 110035, + 713, + '1960-01-01 00:00:00.000000', + 500, + 102, + 30000, + 0 + ), + ( + 110036, + 110036, + 714, + '1960-01-01 00:00:00.000000', + 500, + 122, + 30000, + 0 + ), + ( + 110037, + 110037, + 715, + '1960-01-01 00:00:00.000000', + 1000, + 204, + 30000, + 0 + ), + ( + 110038, + 110038, + 716, + '1960-01-01 00:00:00.000000', + 1000, + 224, + 30000, + 0 + ), + ( + 110039, + 110039, + 717, + '1960-01-01 00:00:00.000000', + 1000, + 245, + 30000, + 0 + ), + ( + 110040, + 110040, + 718, + '1960-01-01 00:00:00.000000', + 1000, + 255, + 30000, + 0 + ), + ( + 110041, + 110041, + 719, + '1960-01-01 00:00:00.000000', + 1000, + 152, + 30000, + 0 + ), + ( + 110042, + 110042, + 720, + '1960-01-01 00:00:00.000000', + 1000, + 173, + 30000, + 0 + ), + ( + 110043, + 110043, + 721, + '1960-01-01 00:00:00.000000', + 1000, + 183, + 30000, + 0 + ), + ( + 110044, + 110044, + 722, + '1960-01-01 00:00:00.000000', + 1000, + 142, + 30000, + 0 + ), + ( + 110045, + 110045, + 723, + '1960-01-01 00:00:00.000000', + 500, + 162, + 30000, + 0 + ), + ( + 110046, + 110046, + 724, + '1960-01-01 00:00:00.000000', + 1000, + 183, + 30000, + 0 + ), + ( + 110047, + 110047, + 725, + '1960-01-01 00:00:00.000000', + 1000, + 132, + 30000, + 0 + ), + ( + 110048, + 110048, + 726, + '1960-01-01 00:00:00.000000', + 1000, + 152, + 30000, + 0 + ), + ( + 110049, + 110049, + 727, + '1960-01-01 00:00:00.000000', + 1000, + 173, + 30000, + 0 + ), + ( + 110050, + 110050, + 728, + '1960-01-01 00:00:00.000000', + 1000, + 183, + 30000, + 0 + ), + ( + 110051, + 110051, + 729, + '1970-01-01 00:00:00.000000', + 500, + 283, + 30000, + 0 + ), + ( + 110052, + 110052, + 730, + '1970-01-01 00:00:00.000000', + 500, + 300, + 30000, + 0 + ), + ( + 110053, + 110053, + 731, + '1970-01-01 00:00:00.000000', + 500, + 262, + 30000, + 0 + ), + ( + 110054, + 110054, + 732, + '1970-01-01 00:00:00.000000', + 500, + 279, + 30000, + 0 + ), + ( + 110055, + 110055, + 733, + '1970-01-01 00:00:00.000000', + 500, + 250, + 30000, + 0 + ), + ( + 110056, + 110056, + 734, + '1970-01-01 00:00:00.000000', + 500, + 258, + 30000, + 0 + ), + ( + 110057, + 110057, + 735, + '1970-01-01 00:00:00.000000', + 500, + 322, + 30000, + 0 + ), + ( + 110058, + 110058, + 736, + '1970-01-01 00:00:00.000000', + 500, + 339, + 30000, + 0 + ), + ( + 110059, + 110059, + 737, + '1970-01-01 00:00:00.000000', + 500, + 300, + 30000, + 0 + ), + ( + 110060, + 110060, + 738, + '1970-01-01 00:00:00.000000', + 500, + 309, + 30000, + 0 + ), + ( + 110061, + 110061, + 739, + '1970-01-01 00:00:00.000000', + 500, + 326, + 30000, + 0 + ), + ( + 110062, + 110062, + 740, + '1970-01-01 00:00:00.000000', + 500, + 288, + 30000, + 0 + ), + ( + 110063, + 110063, + 741, + '1970-01-01 00:00:00.000000', + 500, + 297, + 30000, + 0 + ), + ( + 110064, + 110064, + 742, + '1970-01-01 00:00:00.000000', + 500, + 314, + 30000, + 0 + ), + ( + 110065, + 110065, + 743, + '1970-01-01 00:00:00.000000', + 500, + 369, + 30000, + 0 + ), + ( + 110066, + 110066, + 744, + '1970-01-01 00:00:00.000000', + 500, + 399, + 30000, + 0 + ), + ( + 110067, + 110067, + 745, + '1970-01-01 00:00:00.000000', + 500, + 407, + 30000, + 0 + ), + ( + 110068, + 110068, + 746, + '1970-01-01 00:00:00.000000', + 500, + 437, + 30000, + 0 + ), + ( + 110069, + 110069, + 747, + '1970-01-01 00:00:00.000000', + 250, + 690, + 30000, + 0 + ), + ( + 110070, + 110070, + 748, + '1970-01-01 00:00:00.000000', + 250, + 652, + 30000, + 0 + ), + ( + 110071, + 110071, + 749, + '1970-01-01 00:00:00.000000', + 250, + 660, + 30000, + 0 + ), + ( + 110072, + 110072, + 750, + '1970-01-01 00:00:00.000000', + 250, + 669, + 30000, + 0 + ), + ( + 110073, + 110073, + 751, + '1970-01-01 00:00:00.000000', + 250, + 613, + 30000, + 0 + ), + ( + 110074, + 110074, + 752, + '1970-01-01 00:00:00.000000', + 250, + 622, + 30000, + 0 + ), + ( + 110075, + 110075, + 753, + '1970-01-01 00:00:00.000000', + 250, + 630, + 30000, + 0 + ), + ( + 110076, + 110076, + 754, + '1970-01-01 00:00:00.000000', + 250, + 639, + 30000, + 0 + ), + ( + 110077, + 110077, + 755, + '1970-01-01 00:00:00.000000', + 250, + 738, + 30000, + 0 + ), + ( + 110078, + 110078, + 756, + '1970-01-01 00:00:00.000000', + 250, + 699, + 30000, + 0 + ), + ( + 110079, + 110079, + 757, + '1970-01-01 00:00:00.000000', + 250, + 708, + 30000, + 0 + ), + ( + 110080, + 110080, + 758, + '1975-01-01 00:00:00.000000', + 250, + 780, + 30000, + 0 + ), + ( + 110081, + 110081, + 759, + '1975-01-01 00:00:00.000000', + 250, + 788, + 30000, + 0 + ), + ( + 110082, + 110082, + 760, + '1975-01-01 00:00:00.000000', + 250, + 750, + 30000, + 0 + ), + ( + 110083, + 110083, + 761, + '1975-01-01 00:00:00.000000', + 250, + 758, + 30000, + 0 + ), + ( + 110084, + 110084, + 762, + '1975-01-01 00:00:00.000000', + 250, + 767, + 30000, + 0 + ), + ( + 110085, + 110085, + 763, + '1975-01-01 00:00:00.000000', + 250, + 711, + 30000, + 0 + ), + ( + 110086, + 110086, + 764, + '1975-01-01 00:00:00.000000', + 250, + 720, + 30000, + 0 + ), + ( + 110087, + 110087, + 765, + '1975-01-01 00:00:00.000000', + 250, + 728, + 30000, + 0 + ), + ( + 110088, + 110088, + 766, + '1975-01-01 00:00:00.000000', + 250, + 737, + 30000, + 0 + ), + ( + 110089, + 110089, + 767, + '1975-01-01 00:00:00.000000', + 250, + 908, + 30000, + 0 + ), + ( + 110090, + 110090, + 768, + '1975-01-01 00:00:00.000000', + 250, + 917, + 30000, + 0 + ), + ( + 110091, + 110091, + 770, + '1975-01-01 00:00:00.000000', + 250, + 878, + 30000, + 0 + ), + ( + 110092, + 110092, + 771, + '1975-01-01 00:00:00.000000', + 266, + 887, + 30000, + 0 + ), + ( + 110093, + 110093, + 772, + '1975-01-01 00:00:00.000000', + 250, + 848, + 30000, + 0 + ), + ( + 110094, + 110094, + 773, + '1975-01-01 00:00:00.000000', + 250, + 865, + 30000, + 0 + ), + ( + 110095, + 110095, + 774, + '1975-01-01 00:00:00.000000', + 250, + 883, + 30000, + 0 + ), + ( + 110096, + 110096, + 775, + '1975-01-01 00:00:00.000000', + 250, + 818, + 30000, + 0 + ), + ( + 110097, + 110097, + 776, + '1975-01-01 00:00:00.000000', + 250, + 827, + 30000, + 0 + ), + ( + 110098, + 110098, + 777, + '1975-01-01 00:00:00.000000', + 250, + 835, + 30000, + 0 + ), + ( + 110099, + 110099, + 778, + '1975-01-01 00:00:00.000000', + 250, + 797, + 30000, + 0 + ), + ( + 110100, + 110100, + 779, + '1975-01-01 00:00:00.000000', + 250, + 805, + 30000, + 0 + ), + ( + 110101, + 110101, + 780, + '1975-01-01 00:00:00.000000', + 250, + 814, + 30000, + 0 + ), + ( + 110102, + 110102, + 781, + '1975-01-01 00:00:00.000000', + 250, + 947, + 30000, + 0 + ), + ( + 110103, + 110103, + 782, + '1975-01-01 00:00:00.000000', + 250, + 964, + 30000, + 0 + ), + ( + 110104, + 110104, + 783, + '1975-01-01 00:00:00.000000', + 250, + 981, + 30000, + 0 + ), + ( + 110105, + 110105, + 784, + '1975-01-01 00:00:00.000000', + 250, + 917, + 30000, + 0 + ), + ( + 110106, + 110106, + 785, + '1975-01-01 00:00:00.000000', + 250, + 925, + 30000, + 0 + ), + ( + 110107, + 110107, + 786, + '1975-01-01 00:00:00.000000', + 250, + 934, + 30000, + 0 + ), + ( + 110108, + 110108, + 787, + '1975-01-01 00:00:00.000000', + 250, + 943, + 30000, + 0 + ), + ( + 110109, + 110109, + 788, + '1975-01-01 00:00:00.000000', + 250, + 1063, + 30000, + 0 + ), + ( + 110110, + 110110, + 789, + '1975-01-01 00:00:00.000000', + 125, + 1279, + 30000, + 0 + ), + ( + 110111, + 110111, + 790, + '1975-01-01 00:00:00.000000', + 125, + 1288, + 30000, + 0 + ), + ( + 110112, + 110112, + 791, + '1975-01-01 00:00:00.000000', + 125, + 1249, + 30000, + 0 + ), + ( + 110113, + 110113, + 792, + '1975-01-01 00:00:00.000000', + 125, + 1258, + 30000, + 0 + ), + ( + 110114, + 110114, + 793, + '1975-01-01 00:00:00.000000', + 125, + 1267, + 30000, + 0 + ), + ( + 110115, + 110115, + 794, + '1975-01-01 00:00:00.000000', + 125, + 1211, + 30000, + 0 + ), + ( + 110116, + 110116, + 795, + '1975-01-01 00:00:00.000000', + 125, + 1219, + 30000, + 0 + ), + ( + 110117, + 110117, + 796, + '1975-01-01 00:00:00.000000', + 125, + 1228, + 30000, + 0 + ), + ( + 110118, + 110118, + 797, + '1975-01-01 00:00:00.000000', + 125, + 1237, + 30000, + 0 + ), + ( + 110119, + 110119, + 798, + '1975-01-01 00:00:00.000000', + 125, + 1408, + 30000, + 0 + ), + ( + 110120, + 110120, + 799, + '1975-01-01 00:00:00.000000', + 125, + 1378, + 30000, + 0 + ), + ( + 110121, + 110121, + 800, + '1975-01-01 00:00:00.000000', + 125, + 1387, + 30000, + 0 + ), + ( + 110122, + 110120, + 799, + '1975-01-01 00:00:00.000000', + 125, + 1378, + 30000, + 0 + ), + ( + 110123, + 110122, + 801, + '1975-01-01 00:00:00.000000', + 125, + 1348, + 30000, + 0 + ), + ( + 110124, + 110123, + 802, + '1975-01-01 00:00:00.000000', + 125, + 1365, + 30000, + 0 + ), + ( + 110125, + 110124, + 803, + '1975-01-01 00:00:00.000000', + 125, + 1382, + 30000, + 0 + ), + ( + 110126, + 110125, + 804, + '1975-01-01 00:00:00.000000', + 125, + 1318, + 30000, + 0 + ), + ( + 110127, + 110126, + 805, + '1975-01-01 00:00:00.000000', + 125, + 1335, + 30000, + 0 + ), + ( + 110128, + 110127, + 806, + '1975-01-01 00:00:00.000000', + 125, + 1297, + 30000, + 0 + ), + ( + 110129, + 110128, + 807, + '1975-01-01 00:00:00.000000', + 125, + 1305, + 30000, + 0 + ), + ( + 110130, + 110129, + 808, + '1975-01-01 00:00:00.000000', + 125, + 1314, + 30000, + 0 + ), + ( + 110131, + 110130, + 809, + '1975-01-01 00:00:00.000000', + 125, + 1447, + 30000, + 0 + ), + ( + 110132, + 110131, + 810, + '1975-01-01 00:00:00.000000', + 125, + 1464, + 30000, + 0 + ), + ( + 110133, + 110132, + 811, + '1975-01-01 00:00:00.000000', + 125, + 1417, + 30000, + 0 + ), + ( + 110134, + 110133, + 812, + '1975-01-01 00:00:00.000000', + 125, + 1425, + 30000, + 0 + ), + ( + 110135, + 110134, + 813, + '1975-01-01 00:00:00.000000', + 125, + 1434, + 30000, + 0 + ), + ( + 110136, + 110135, + 814, + '1975-01-01 00:00:00.000000', + 125, + 1442, + 30000, + 0 + ), + ( + 110137, + 110136, + 962, + '1950-01-01 00:00:00.000000', + 2, + 172, + 30000, + 0 + ), + ( + 110138, + 110137, + 1687, + '1969-01-01 00:00:00.000000', + 0, + 994, + 30000, + 0 + ), + ( + 110139, + 110138, + 1743, + '1995-01-01 00:00:00.000000', + 0, + 1781, + 30000, + 0 + ), + ( + 110140, + 110139, + 2389, + '2001-03-22 00:00:00.000000', + 125, + 248, + 30000, + 0 + ), + ( + 110141, + 110140, + 2422, + '1970-01-01 00:00:00.000000', + 0, + 591, + 30000, + 0 + ), + ( + 110142, + 110141, + 2433, + '1960-01-01 00:00:00.000000', + 250, + 134, + 30000, + 0 + ), + ( + 110143, + 110142, + 2434, + '1960-01-01 00:00:00.000000', + 250, + 139, + 30000, + 0 + ), + ( + 110144, + 110143, + 2435, + '1960-01-01 00:00:00.000000', + 250, + 147, + 30000, + 0 + ), + ( + 110145, + 110144, + 2436, + '1960-01-01 00:00:00.000000', + 250, + 156, + 30000, + 0 + ), + ( + 110146, + 110145, + 2437, + '1960-01-01 00:00:00.000000', + 250, + 167, + 30000, + 0 + ), + ( + 110147, + 110146, + 2438, + '1960-01-01 00:00:00.000000', + 250, + 172, + 30000, + 0 + ), + ( + 110148, + 110147, + 2439, + '1960-01-01 00:00:00.000000', + 250, + 182, + 30000, + 0 + ), + ( + 110149, + 110148, + 2440, + '1960-01-01 00:00:00.000000', + 250, + 245, + 30000, + 0 + ), + ( + 110150, + 110149, + 2441, + '1960-01-01 00:00:00.000000', + 250, + 255, + 30000, + 0 + ), + ( + 110151, + 110150, + 2442, + '1960-01-01 00:00:00.000000', + 250, + 239, + 30000, + 0 + ), + ( + 110152, + 110151, + 2616, + '1960-01-01 00:00:00.000000', + 500, + 274, + 30000, + 0 + ), + ( + 110153, + 110152, + 2615, + '1960-01-01 00:00:00.000000', + 500, + 292, + 30000, + 0 + ), + ( + 110154, + 110153, + 2614, + '1960-01-01 00:00:00.000000', + 500, + 313, + 30000, + 0 + ), + ( + 110155, + 110154, + 2613, + '1960-01-01 00:00:00.000000', + 500, + 322, + 30000, + 0 + ), + ( + 110156, + 110155, + 2612, + '1960-01-01 00:00:00.000000', + 500, + 313, + 30000, + 0 + ), + ( + 110157, + 110156, + 2611, + '1960-01-01 00:00:00.000000', + 500, + 330, + 30000, + 0 + ), + ( + 110158, + 110157, + 2610, + '1960-01-01 00:00:00.000000', + 500, + 352, + 30000, + 0 + ), + ( + 110159, + 110158, + 2609, + '1960-01-01 00:00:00.000000', + 500, + 360, + 30000, + 0 + ), + ( + 110160, + 110159, + 2608, + '1960-01-01 00:00:00.000000', + 500, + 369, + 30000, + 0 + ), + ( + 110161, + 110160, + 2607, + '1960-01-01 00:00:00.000000', + 500, + 382, + 30000, + 0 + ), + ( + 110162, + 110161, + 2606, + '1960-01-01 00:00:00.000000', + 500, + 390, + 30000, + 0 + ), + ( + 110163, + 110162, + 2605, + '1960-01-01 00:00:00.000000', + 500, + 412, + 30000, + 0 + ), + ( + 110164, + 110163, + 2604, + '1960-01-01 00:00:00.000000', + 500, + 420, + 30000, + 0 + ), + ( + 110165, + 110164, + 2603, + '1960-01-01 00:00:00.000000', + 500, + 437, + 30000, + 0 + ), + ( + 110166, + 110165, + 2602, + '1960-01-01 00:00:00.000000', + 125, + 810, + 30000, + 0 + ), + ( + 110167, + 110166, + 2601, + '1960-01-01 00:00:00.000000', + 125, + 818, + 30000, + 0 + ), + ( + 110168, + 110167, + 2600, + '1960-01-01 00:00:00.000000', + 125, + 835, + 30000, + 0 + ), + ( + 110169, + 110168, + 2599, + '1960-01-01 00:00:00.000000', + 125, + 938, + 30000, + 0 + ), + ( + 110170, + 110169, + 2660, + '1978-01-01 00:00:00.000000', + 0, + 1841, + 30000, + 0 + ), + ( + 110171, + 110170, + 2661, + '1978-01-01 00:00:00.000000', + 0, + 1704, + 30000, + 0 + ), + ( + 110172, + 110172, + 3035, + '1978-01-01 00:00:00.000000', + 0, + 5340, + 30000, + 0 + ), + ( + 110173, + 110171, + 3034, + '1978-01-01 00:00:00.000000', + 0, + 5203, + 30000, + 0 + ), + ( + 110174, + 110173, + 3033, + '1995-01-01 00:00:00.000000', + 0, + 5280, + 30000, + 0 + ), + ( + 110175, + 110174, + 3626, + '1995-01-01 00:00:00.000000', + 0, + 1884, + 30000, + 0 + ), + ( + 110176, + 110175, + 3627, + '1995-01-01 00:00:00.000000', + 0, + 1836, + 30000, + 0 + ), + ( + 110177, + 110176, + 3628, + '1995-01-01 00:00:00.000000', + 0, + 1815, + 30000, + 0 + ), + ( + 110178, + 110177, + 3629, + '1995-01-01 00:00:00.000000', + 0, + 1845, + 30000, + 0 + ), + ( + 110179, + 110178, + 3630, + '1995-01-01 00:00:00.000000', + 0, + 1824, + 30000, + 0 + ), + ( + 110180, + 110179, + 3631, + '1995-01-01 00:00:00.000000', + 0, + 1862, + 30000, + 0 + ), + ( + 110181, + 110180, + 3632, + '1995-01-01 00:00:00.000000', + 0, + 1871, + 30000, + 0 + ), + ( + 110182, + 110181, + 3633, + '1995-01-01 00:00:00.000000', + 0, + 1879, + 30000, + 0 + ), + ( + 110183, + 110182, + 3634, + '1995-01-01 00:00:00.000000', + 0, + 1888, + 30000, + 0 + ), + ( + 110184, + 110183, + 3635, + '1995-01-01 00:00:00.000000', + 0, + 1776, + 30000, + 0 + ), + ( + 110185, + 110184, + 3636, + '1995-01-01 00:00:00.000000', + 0, + 1785, + 30000, + 0 + ), + ( + 110186, + 110185, + 3637, + '1995-01-01 00:00:00.000000', + 0, + 1815, + 30000, + 0 + ), + ( + 110187, + 110186, + 3638, + '1995-01-01 00:00:00.000000', + 0, + 1794, + 30000, + 0 + ), + ( + 110188, + 110187, + 3639, + '1995-01-01 00:00:00.000000', + 0, + 1824, + 30000, + 0 + ), + ( + 110189, + 110188, + 3640, + '1995-01-01 00:00:00.000000', + 0, + 1832, + 30000, + 0 + ), + ( + 110190, + 110189, + 3641, + '1995-01-01 00:00:00.000000', + 0, + 1811, + 30000, + 0 + ), + ( + 110191, + 110190, + 3642, + '1995-01-01 00:00:00.000000', + 0, + 1716, + 30000, + 0 + ), + ( + 110192, + 110191, + 3643, + '1995-01-01 00:00:00.000000', + 0, + 1746, + 30000, + 0 + ), + ( + 110193, + 110192, + 3644, + '1995-01-01 00:00:00.000000', + 0, + 1776, + 30000, + 0 + ), + ( + 110194, + 110193, + 3645, + '1995-01-01 00:00:00.000000', + 0, + 1725, + 30000, + 0 + ), + ( + 110195, + 110194, + 3646, + '1995-01-01 00:00:00.000000', + 0, + 1785, + 30000, + 0 + ), + ( + 110196, + 110195, + 3647, + '1995-01-01 00:00:00.000000', + 0, + 1764, + 30000, + 0 + ), + ( + 110197, + 110201, + 3765, + '1965-01-01 00:00:00.000000', + 125, + 412, + 30000, + 0 + ), + ( + 110198, + 110200, + 3766, + '1965-01-01 00:00:00.000000', + 125, + 403, + 30000, + 0 + ), + ( + 110199, + 110199, + 3767, + '1965-01-01 00:00:00.000000', + 125, + 395, + 30000, + 0 + ), + ( + 110200, + 110198, + 3768, + '1965-01-01 00:00:00.000000', + 60, + 438, + 30000, + 0 + ), + ( + 110201, + 110197, + 3769, + '1965-01-01 00:00:00.000000', + 60, + 420, + 30000, + 0 + ), + ( + 110202, + 110196, + 3770, + '1965-01-01 00:00:00.000000', + 250, + 386, + 30000, + 0 + ), + ( + 130001, + 130001, + 121, + '1999-01-01 00:00:00.000000', + 500, + 1234, + 30000, + 0 + ), + ( + 130002, + 130002, + 122, + '1999-01-01 00:00:00.000000', + 1000, + 1298, + 30000, + 0 + ), + ( + 130003, + 130003, + 123, + '1999-01-01 00:00:00.000000', + 125, + 1744, + 30000, + 0 + ), + ( + 130004, + 130004, + 124, + '1999-01-01 00:00:00.000000', + 500, + 1357, + 30000, + 0 + ), + ( + 130005, + 130005, + 125, + '1999-01-01 00:00:00.000000', + 500, + 1282, + 30000, + 0 + ), + ( + 130006, + 130006, + 126, + '1999-01-01 00:00:00.000000', + 250, + 1859, + 30000, + 0 + ), + ( + 130007, + 130007, + 127, + '1999-01-01 00:00:00.000000', + 125, + 1490, + 30000, + 0 + ), + ( + 130008, + 130008, + 128, + '1999-01-01 00:00:00.000000', + 125, + 1474, + 30000, + 0 + ), + ( + 130009, + 130009, + 129, + '1999-01-01 00:00:00.000000', + 250, + 1681, + 30000, + 0 + ), + ( + 130010, + 130010, + 130, + '1999-01-01 00:00:00.000000', + 125, + 1859, + 30000, + 0 + ), + ( + 130011, + 130011, + 131, + '1999-01-01 00:00:00.000000', + 250, + 2360, + 30000, + 0 + ), + ( + 130012, + 130051, + 864, + '1932-01-01 00:00:00.000000', + 1000, + 684, + 30000, + 0 + ), + ( + 130013, + 130013, + 132, + '1999-01-01 00:00:00.000000', + 125, + 2012, + 30000, + 0 + ), + ( + 130014, + 130014, + 133, + '1999-01-01 00:00:00.000000', + 125, + 1887, + 30000, + 0 + ), + ( + 130015, + 130015, + 134, + '1999-01-01 00:00:00.000000', + 250, + 1570, + 30000, + 0 + ), + ( + 130016, + 130016, + 135, + '1999-01-01 00:00:00.000000', + 250, + 1700, + 30000, + 0 + ), + ( + 130017, + 130017, + 136, + '1999-01-01 00:00:00.000000', + 250, + 1999, + 30000, + 0 + ), + ( + 130018, + 130018, + 137, + '1999-01-01 00:00:00.000000', + 250, + 1581, + 30000, + 0 + ), + ( + 130019, + 130019, + 138, + '1999-01-01 00:00:00.000000', + 500, + 1342, + 30000, + 0 + ), + ( + 130020, + 130020, + 139, + '1999-01-01 00:00:00.000000', + 250, + 1576, + 30000, + 0 + ), + ( + 130021, + 130021, + 227, + '1957-01-01 00:00:00.000000', + 1000, + 1058, + 30000, + 0 + ), + ( + 130022, + 130022, + 247, + '1957-01-01 00:00:00.000000', + 500, + 1355, + 30000, + 0 + ), + ( + 130023, + 130023, + 248, + '1957-01-01 00:00:00.000000', + 500, + 1206, + 30000, + 0 + ), + ( + 130024, + 130024, + 249, + '1957-01-01 00:00:00.000000', + 500, + 1576, + 30000, + 0 + ), + ( + 130025, + 130025, + 250, + '1957-05-01 00:00:00.000000', + 125, + 1162, + 30000, + 0 + ), + ( + 130026, + 130026, + 873, + '1957-01-01 00:00:00.000000', + 500, + 1191, + 30000, + 0 + ), + ( + 130027, + 130029, + 423, + '1966-01-01 00:00:00.000000', + 500, + 2179, + 30000, + 0 + ), + ( + 130028, + 130028, + 422, + '1963-01-01 00:00:00.000000', + 250, + 2211, + 30000, + 0 + ), + ( + 130029, + 130030, + 424, + '1966-01-01 00:00:00.000000', + 250, + 2027, + 30000, + 0 + ), + ( + 130030, + 130031, + 425, + '1999-01-01 00:00:00.000000', + 60, + 4490, + 30000, + 0 + ), + ( + 130031, + 130032, + 426, + '1999-01-01 00:00:00.000000', + 0, + 2608, + 30000, + 0 + ), + ( + 130032, + 130033, + 427, + '1963-01-01 00:00:00.000000', + 1000, + 1033, + 30000, + 0 + ), + ( + 130033, + 130034, + 428, + '1969-01-01 00:00:00.000000', + 500, + 1186, + 30000, + 0 + ), + ( + 130034, + 130035, + 867, + '1965-01-01 00:00:00.000000', + 500, + 1161, + 30000, + 0 + ), + ( + 130035, + 130036, + 866, + '1957-01-01 00:00:00.000000', + 60, + 2906, + 30000, + 0 + ), + ( + 130036, + 130037, + 429, + '1957-01-01 00:00:00.000000', + 60, + 3709, + 30000, + 0 + ), + ( + 130037, + 130038, + 430, + '1957-01-01 00:00:00.000000', + 30, + 3072, + 30000, + 0 + ), + ( + 130038, + 130039, + 431, + '1959-01-01 00:00:00.000000', + 60, + 3262, + 30000, + 0 + ), + ( + 130039, + 130040, + 868, + '1964-01-01 00:00:00.000000', + 500, + 1397, + 30000, + 0 + ), + ( + 130040, + 130041, + 432, + '1977-01-01 00:00:00.000000', + 250, + 1919, + 30000, + 0 + ), + ( + 130041, + 130042, + 433, + '1979-01-01 00:00:00.000000', + 500, + 1739, + 30000, + 0 + ), + ( + 130042, + 130043, + 872, + '1957-01-01 00:00:00.000000', + 1000, + 996, + 30000, + 0 + ), + ( + 130043, + 130044, + 435, + '1964-01-01 00:00:00.000000', + 250, + 1589, + 30000, + 0 + ), + ( + 130044, + 130045, + 499, + '1999-01-01 00:00:00.000000', + 250, + 2155, + 30000, + 0 + ), + ( + 130045, + 130046, + 500, + '1999-01-01 00:00:00.000000', + 125, + 1281, + 30000, + 0 + ), + ( + 130046, + 130047, + 874, + '1999-01-01 00:00:00.000000', + 500, + 3450, + 30000, + 0 + ), + ( + 130047, + 130048, + 865, + '1999-01-01 00:00:00.000000', + 1000, + 1033, + 30000, + 0 + ), + ( + 130048, + 130049, + 1034, + '1969-01-01 00:00:00.000000', + 125, + 1522, + 30000, + 0 + ), + ( + 130049, + 130012, + 1158, + '1957-01-01 00:00:00.000000', + 1000, + 1263, + 30000, + 0 + ), + ( + 130050, + 130027, + 1159, + '1963-01-01 00:00:00.000000', + 500, + 1925, + 30000, + 0 + ), + ( + 130051, + 130050, + 1746, + '1995-01-01 00:00:00.000000', + 30, + 6341, + 30000, + 0 + ), + ( + 130052, + 130052, + 2801, + '1972-01-01 00:00:00.000000', + 0, + 3382, + 30000, + 0 + ), + ( + 130053, + 130053, + 2802, + '1972-01-01 00:00:00.000000', + 0, + 2960, + 30000, + 0 + ), + ( + 130054, + 130054, + 3762, + '1965-01-01 00:00:00.000000', + 125, + 3163, + 30000, + 0 + ), + ( + 130055, + 130055, + 3763, + '1967-01-01 00:00:00.000000', + 125, + 1331, + 30000, + 0 + ), + ( + 130056, + 130056, + 3764, + '1967-01-01 00:00:00.000000', + 125, + 2695, + 30000, + 0 + ), + ( + 130057, + 130057, + 3772, + '1955-01-01 00:00:00.000000', + 1000, + 1497, + 30000, + 0 + ), + ( + 140001, + 140001, + 140, + '1999-01-01 00:00:00.000000', + 250, + 725, + 30000, + 0 + ), + ( + 140002, + 140002, + 141, + '1999-01-01 00:00:00.000000', + 500, + 774, + 30000, + 0 + ), + ( + 140003, + 140003, + 142, + '1999-01-01 00:00:00.000000', + 1000, + 790, + 30000, + 0 + ), + ( + 140004, + 140004, + 143, + '1999-01-01 00:00:00.000000', + 1000, + 846, + 30000, + 0 + ), + ( + 140005, + 140005, + 144, + '1999-01-01 00:00:00.000000', + 500, + 865, + 30000, + 0 + ), + ( + 140006, + 140006, + 145, + '1999-01-01 00:00:00.000000', + 500, + 892, + 30000, + 0 + ), + ( + 140007, + 140007, + 146, + '1999-01-01 00:00:00.000000', + 250, + 911, + 30000, + 0 + ), + ( + 140008, + 140008, + 147, + '1999-01-01 00:00:00.000000', + 250, + 921, + 30000, + 0 + ), + ( + 140009, + 140009, + 148, + '1999-01-01 00:00:00.000000', + 250, + 923, + 30000, + 0 + ), + ( + 140010, + 140010, + 149, + '1999-01-01 00:00:00.000000', + 250, + 945, + 30000, + 0 + ), + ( + 140011, + 140011, + 150, + '1999-01-01 00:00:00.000000', + 250, + 960, + 30000, + 0 + ), + ( + 140012, + 140012, + 151, + '1999-01-01 00:00:00.000000', + 250, + 977, + 30000, + 0 + ), + ( + 140013, + 140013, + 152, + '1999-01-01 00:00:00.000000', + 125, + 1008, + 30000, + 0 + ), + ( + 140014, + 140014, + 153, + '1999-01-01 00:00:00.000000', + 60, + 1558, + 30000, + 0 + ), + ( + 140015, + 140015, + 154, + '1999-01-01 00:00:00.000000', + 60, + 1642, + 30000, + 0 + ), + ( + 140016, + 140016, + 440, + '1957-01-01 00:00:00.000000', + 1000, + 815, + 30000, + 0 + ), + ( + 140017, + 140017, + 869, + '1957-01-01 00:00:00.000000', + 250, + 926, + 30000, + 0 + ), + ( + 140018, + 140018, + 441, + '1955-01-01 00:00:00.000000', + 500, + 887, + 30000, + 0 + ), + ( + 140019, + 140019, + 870, + '1999-01-01 00:00:00.000000', + 1000, + 851, + 30000, + 0 + ), + ( + 140020, + 140020, + 871, + '1999-01-01 00:00:00.000000', + 125, + 1010, + 30000, + 0 + ), + ( + 140021, + 140021, + 1160, + '1957-01-01 00:00:00.000000', + 250, + 962, + 30000, + 0 + ), + ( + 140022, + 140022, + 2152, + '1960-01-01 00:00:00.000000', + 1000, + 807, + 30000, + 0 + ), + ( + 140023, + 140023, + 2195, + '1932-01-01 00:00:00.000000', + 125, + 454, + 30000, + 0 + ), + ( + 140024, + 140024, + 2198, + '1949-01-01 00:00:00.000000', + 125, + 430, + 30000, + 0 + ), + ( + 140025, + 140025, + 2199, + '1940-01-01 00:00:00.000000', + 125, + 360, + 30000, + 0 + ), + ( + 140026, + 140026, + 2774, + '1965-01-01 00:00:00.000000', + 125, + 1187, + 30000, + 0 + ), + ( + 140027, + 140027, + 2775, + '1965-01-01 00:00:00.000000', + 125, + 1256, + 30000, + 0 + ), + ( + 140028, + 140028, + 2776, + '1965-01-01 00:00:00.000000', + 125, + 1322, + 30000, + 0 + ), + ( + 140029, + 140029, + 2777, + '1965-01-01 00:00:00.000000', + 125, + 1358, + 30000, + 0 + ), + ( + 140030, + 140030, + 2778, + '1965-01-01 00:00:00.000000', + 125, + 1424, + 30000, + 0 + ), + ( + 140031, + 140031, + 2779, + '1965-01-01 00:00:00.000000', + 60, + 1558, + 30000, + 0 + ), + ( + 140032, + 140032, + 2780, + '1965-01-01 00:00:00.000000', + 1000, + 810, + 30000, + 0 + ), + ( + 140033, + 140033, + 2781, + '1965-01-01 00:00:00.000000', + 1000, + 856, + 30000, + 0 + ), + ( + 140034, + 140034, + 2782, + '1965-01-01 00:00:00.000000', + 500, + 899, + 30000, + 0 + ), + ( + 140035, + 140035, + 2783, + '1965-01-01 00:00:00.000000', + 250, + 923, + 30000, + 0 + ), + ( + 140036, + 140036, + 2784, + '1965-01-01 00:00:00.000000', + 250, + 967, + 30000, + 0 + ), + ( + 140037, + 140037, + 2785, + '1965-01-01 00:00:00.000000', + 125, + 1056, + 30000, + 0 + ), + ( + 140038, + 140038, + 2786, + '1965-01-01 00:00:00.000000', + 250, + 725, + 30000, + 0 + ), + ( + 140039, + 140039, + 2787, + '1965-01-01 00:00:00.000000', + 1000, + 810, + 30000, + 0 + ), + ( + 140040, + 140040, + 2788, + '1965-01-01 00:00:00.000000', + 500, + 878, + 30000, + 0 + ), + ( + 140041, + 140041, + 2789, + '1965-01-01 00:00:00.000000', + 250, + 923, + 30000, + 0 + ), + ( + 140042, + 140042, + 2790, + '1965-01-01 00:00:00.000000', + 250, + 960, + 30000, + 0 + ), + ( + 140043, + 140048, + 2791, + '1965-01-01 00:00:00.000000', + 125, + 1060, + 30000, + 0 + ), + ( + 140044, + 140043, + 2792, + '1965-01-01 00:00:00.000000', + 125, + 1184, + 30000, + 0 + ), + ( + 140045, + 140044, + 2793, + '1965-01-01 00:00:00.000000', + 125, + 1271, + 30000, + 0 + ), + ( + 140046, + 140045, + 2794, + '1965-01-01 00:00:00.000000', + 125, + 1358, + 30000, + 0 + ), + ( + 140047, + 140049, + 2795, + '1965-01-01 00:00:00.000000', + 30, + 1793, + 30000, + 0 + ), + ( + 140048, + 140046, + 2796, + '1965-01-01 00:00:00.000000', + 125, + 1424, + 30000, + 0 + ), + ( + 140049, + 140047, + 2797, + '1965-01-01 00:00:00.000000', + 60, + 1558, + 30000, + 0 + ), + ( + 140050, + 140052, + 2798, + '1970-01-01 00:00:00.000000', + 30, + 2061, + 30000, + 0 + ), + ( + 140051, + 140051, + 2799, + '1970-01-01 00:00:00.000000', + 30, + 1881, + 30000, + 0 + ), + ( + 140052, + 140050, + 2800, + '1970-01-01 00:00:00.000000', + 60, + 1730, + 30000, + 0 + ), + ( + 150001, + 150004, + 504, + '1999-01-01 00:00:00.000000', + 0, + 730, + 30000, + 0 + ), + ( + 150002, + 150003, + 503, + '1999-01-01 00:00:00.000000', + 1000, + 280, + 30000, + 0 + ), + ( + 150003, + 150001, + 501, + '1999-01-01 00:00:00.000000', + 250, + 480, + 30000, + 0 + ), + ( + 150004, + 150002, + 502, + '1999-01-01 00:00:00.000000', + 500, + 330, + 30000, + 0 + ), + ( + 160001, + 160001, + 1162, + '1953-01-01 00:00:00.000000', + 1000, + 1116, + 30000, + 21 + ), + ( + 160002, + 160002, + 1429, + '1999-01-01 00:00:00.000000', + 500, + 2198, + 30000, + 8 + ), + ( + 160003, + 160003, + 1430, + '1999-01-01 00:00:00.000000', + 125, + 5777, + 30000, + 7 + ), + ( + 160004, + 160004, + 1455, + '1963-01-01 00:00:00.000000', + 125, + 1787, + 30000, + 19 + ), + ( + 160005, + 160005, + 76, + '1999-01-01 00:00:00.000000', + 1000, + 1087, + 30000, + 6 + ), + ( + 160006, + 160006, + 77, + '1999-01-01 00:00:00.000000', + 1000, + 1140, + 30000, + 6 + ), + ( + 160007, + 160007, + 78, + '1999-01-01 00:00:00.000000', + 500, + 1199, + 30000, + 6 + ), + ( + 160008, + 160008, + 80, + '1999-01-01 00:00:00.000000', + 500, + 1215, + 30000, + 6 + ), + ( + 160009, + 160009, + 83, + '1999-01-01 00:00:00.000000', + 500, + 1283, + 30000, + 6 + ), + ( + 160010, + 160010, + 1161, + '1940-01-01 00:00:00.000000', + 250, + 1204, + 30000, + 20 + ), + ( + 160011, + 160011, + 86, + '1999-01-01 00:00:00.000000', + 500, + 1458, + 30000, + 19 + ), + ( + 160012, + 160012, + 87, + '1999-01-01 00:00:00.000000', + 500, + 1367, + 30000, + 6 + ), + ( + 160013, + 160013, + 90, + '1999-01-01 00:00:00.000000', + 250, + 1425, + 30000, + 9 + ), + ( + 160014, + 160014, + 92, + '1965-01-01 00:00:00.000000', + 250, + 2478, + 30000, + 5 + ), + ( + 160015, + 160015, + 93, + '1970-01-01 00:00:00.000000', + 500, + 1416, + 30000, + 6 + ), + ( + 160016, + 160016, + 95, + '1961-01-01 00:00:00.000000', + 250, + 1708, + 30000, + 19 + ), + ( + 160017, + 160017, + 96, + '1970-01-01 00:00:00.000000', + 125, + 5754, + 30000, + 5 + ), + ( + 160018, + 160018, + 98, + '1970-01-01 00:00:00.000000', + 0, + 6493, + 30000, + 5 + ), + ( + 160019, + 160020, + 1464, + '1969-01-01 00:00:00.000000', + 500, + 1476, + 30000, + 4 + ), + ( + 160020, + 160021, + 1459, + '1971-01-01 00:00:00.000000', + 250, + 2518, + 30000, + 16 + ), + ( + 160021, + 160022, + 79, + '1932-01-01 00:00:00.000000', + 500, + 740, + 30000, + 10 + ), + ( + 160022, + 160023, + 875, + '1940-01-01 00:00:00.000000', + 500, + 782, + 30000, + 10 + ), + ( + 160023, + 160024, + 81, + '1999-01-01 00:00:00.000000', + 1000, + 1057, + 30000, + 4 + ), + ( + 160024, + 160025, + 82, + '1999-01-01 00:00:00.000000', + 1000, + 1107, + 30000, + 15 + ), + ( + 160025, + 160026, + 878, + '1999-01-01 00:00:00.000000', + 1000, + 1257, + 30000, + 4 + ), + ( + 160026, + 160027, + 85, + '1999-01-01 00:00:00.000000', + 1000, + 1167, + 30000, + 15 + ), + ( + 160027, + 160028, + 879, + '1999-01-01 00:00:00.000000', + 500, + 1299, + 30000, + 4 + ), + ( + 160028, + 160029, + 876, + '1999-01-01 00:00:00.000000', + 500, + 1233, + 30000, + 15 + ), + ( + 160029, + 160030, + 88, + '1970-01-01 00:00:00.000000', + 500, + 2212, + 30000, + 16 + ), + ( + 160030, + 160031, + 89, + '1999-01-01 00:00:00.000000', + 250, + 2438, + 30000, + 3 + ), + ( + 160031, + 160032, + 91, + '1999-01-01 00:00:00.000000', + 250, + 2518, + 30000, + 3 + ), + ( + 160032, + 160033, + 877, + '1999-01-01 00:00:00.000000', + 125, + 5340, + 30000, + 3 + ), + ( + 160033, + 160034, + 94, + '1999-01-01 00:00:00.000000', + 125, + 2681, + 30000, + 3 + ), + ( + 160034, + 160035, + 880, + '1968-01-01 00:00:00.000000', + 125, + 3074, + 30000, + 17 + ), + ( + 160035, + 160036, + 97, + '1999-01-01 00:00:00.000000', + 500, + 2212, + 30000, + 3 + ), + ( + 160036, + 160037, + 34, + '1968-01-01 00:00:00.000000', + 500, + 1468, + 30000, + 11 + ), + ( + 160037, + 160038, + 38, + '1966-01-01 00:00:00.000000', + 250, + 2513, + 30000, + 12 + ), + ( + 160038, + 160039, + 42, + '1968-01-01 00:00:00.000000', + 125, + 5756, + 30000, + 12 + ), + ( + 160039, + 160042, + 52, + '1959-01-01 00:00:00.000000', + 500, + 1620, + 30000, + 13 + ), + ( + 160040, + 160043, + 54, + '1967-01-01 00:00:00.000000', + 250, + 2505, + 30000, + 13 + ), + ( + 160041, + 160044, + 56, + '1999-01-01 00:00:00.000000', + 125, + 2681, + 30000, + 13 + ), + ( + 160042, + 160045, + 58, + '1999-01-01 00:00:00.000000', + 125, + 7226, + 30000, + 13 + ), + ( + 160043, + 160046, + 421, + '1967-01-01 00:00:00.000000', + 0, + 7567, + 30000, + 14 + ), + ( + 160044, + 160047, + 442, + '1968-01-01 00:00:00.000000', + 30, + 4121, + 30000, + 17 + ), + ( + 160046, + 160049, + 495, + '1999-01-01 00:00:00.000000', + 0, + 4840, + 30000, + 6 + ), + ( + 160047, + 160050, + 498, + '1955-01-01 00:00:00.000000', + 500, + 820, + 30000, + 10 + ), + ( + 160048, + 160060, + 1036, + '1965-01-01 00:00:00.000000', + 1000, + 1261, + 32000, + 14 + ), + ( + 160049, + 160061, + 1037, + '1965-01-01 00:00:00.000000', + 500, + 1442, + 30000, + 14 + ), + ( + 160050, + 160062, + 1038, + '1965-01-01 00:00:00.000000', + 250, + 2438, + 30000, + 14 + ), + ( + 160054, + 160052, + 1039, + '1999-01-01 00:00:00.000000', + 500, + 1354, + 30000, + 2 + ), + ( + 160055, + 160059, + 1040, + '1999-01-01 00:00:00.000000', + 125, + 5545, + 30000, + 1 + ), + ( + 160056, + 160058, + 1041, + '1963-01-01 00:00:00.000000', + 60, + 2674, + 30000, + 1 + ), + ( + 160057, + 160053, + 1042, + '1999-01-01 00:00:00.000000', + 500, + 1430, + 30000, + 2 + ), + ( + 160069, + 160040, + 1176, + '1960-01-01 00:00:00.000000', + 500, + 1483, + 30000, + 13 + ), + ( + 160070, + 160041, + 1177, + '1960-01-01 00:00:00.000000', + 250, + 2644, + 30000, + 13 + ), + ( + 160072, + 160019, + 1530, + '1969-01-01 00:00:00.000000', + 250, + 2518, + 30000, + 5 + ), + ( + 160073, + 160055, + 1655, + '1959-01-01 00:00:00.000000', + 250, + 1600, + 30000, + 1 + ), + ( + 160074, + 160056, + 1659, + '1971-01-01 00:00:00.000000', + 250, + 2544, + 32100, + 1 + ), + ( + 160075, + 160057, + 1670, + '1959-01-01 00:00:00.000000', + 125, + 2593, + 30000, + 1 + ), + ( + 160076, + 160063, + 2451, + '1960-01-01 00:00:00.000000', + 0, + 889, + 30000, + 6 + ), + ( + 160077, + 160064, + 2459, + '1970-01-01 00:00:00.000000', + 250, + 1506, + 30000, + 14 + ), + ( + 160078, + 160065, + 2462, + '1964-01-01 00:00:00.000000', + 0, + 7810, + 30000, + 18 + ), + ( + 160079, + 160051, + 2488, + '1964-01-01 00:00:00.000000', + 250, + 1214, + 30000, + 2 + ), + ( + 160080, + 160054, + 2489, + '1971-01-01 00:00:00.000000', + 125, + 1506, + 30000, + 2 + ), + ( + 160081, + 160066, + 2491, + '1961-01-01 00:00:00.000000', + 60, + 6094, + 30000, + 3 + ), + ( + 160082, + 160067, + 2521, + '1969-01-01 00:00:00.000000', + 0, + 7685, + 30000, + 17 + ), + ( + 160083, + 160068, + 2523, + '1964-01-01 00:00:00.000000', + 30, + 2357, + 30000, + 4 + ), + ( + 160084, + 160069, + 2524, + '1969-01-01 00:00:00.000000', + 30, + 2435, + 30000, + 4 + ), + ( + 160085, + 160070, + 2536, + '1967-01-01 00:00:00.000000', + 125, + 2504, + 30000, + 7 + ), + ( + 160086, + 160071, + 2537, + '1967-01-01 00:00:00.000000', + 125, + 1803, + 30000, + 7 + ), + ( + 160087, + 160048, + 444, + '1966-01-01 00:00:00.000000', + 125, + 2682, + 30000, + 5 + ), + ( + 160088, + 160072, + 2539, + '1969-01-01 00:00:00.000000', + 0, + 5721, + 30000, + 5 + ), + ( + 160089, + 160073, + 2550, + '1957-01-01 00:00:00.000000', + 125, + 1272, + 30000, + 21 + ), + ( + 160090, + 160074, + 2551, + '1959-01-01 00:00:00.000000', + 125, + 1424, + 30000, + 21 + ), + ( + 160091, + 160075, + 2552, + '1964-01-01 00:00:00.000000', + 60, + 1530, + 30000, + 21 + ), + ( + 160092, + 160076, + 2553, + '1964-01-01 00:00:00.000000', + 125, + 1293, + 30000, + 8 + ), + ( + 160093, + 160077, + 2554, + '1966-01-01 00:00:00.000000', + 125, + 1431, + 30000, + 8 + ), + ( + 160094, + 160078, + 2555, + '1956-01-01 00:00:00.000000', + 125, + 1326, + 30000, + 9 + ), + ( + 160095, + 160079, + 2556, + '1964-01-01 00:00:00.000000', + 60, + 1598, + 30000, + 9 + ), + ( + 160096, + 160081, + 2617, + '1969-01-01 00:00:00.000000', + 0, + 19673, + 30000, + 17 + ), + ( + 160097, + 160080, + 2618, + '1969-01-01 00:00:00.000000', + 0, + 30739, + 30000, + 17 + ), + ( + 160098, + 160082, + 2770, + '1971-01-01 00:00:00.000000', + 125, + 2510, + 30000, + 14 + ), + ( + 180001, + 180001, + 102, + '1955-01-01 00:00:00.000000', + 1000, + 137, + 30000, + 6 + ), + ( + 180002, + 180002, + 103, + '1965-01-01 00:00:00.000000', + 1000, + 135, + 30000, + 5 + ), + ( + 180003, + 180017, + 881, + '1971-01-01 00:00:00.000000', + 125, + 186, + 30000, + 6 + ), + ( + 180004, + 180019, + 1408, + '1990-01-01 00:00:00.000000', + 60, + 435, + 30000, + 6 + ), + ( + 180005, + 180020, + 1409, + '1990-01-01 00:00:00.000000', + 30, + 270, + 30000, + 6 + ), + ( + 180006, + 180021, + 1423, + '1990-01-01 00:00:00.000000', + 30, + 1053, + 30000, + 6 + ), + ( + 180007, + 180018, + 1407, + '1990-01-01 00:00:00.000000', + 125, + 226, + 30000, + 6 + ), + ( + 180008, + 180022, + 1431, + '1990-01-01 00:00:00.000000', + 60, + 312, + 30000, + 6 + ), + ( + 180009, + 180023, + 1432, + '1990-01-01 00:00:00.000000', + 60, + 316, + 30000, + 5 + ), + ( + 180010, + 180003, + 1874, + '1967-01-01 00:00:00.000000', + 1000, + 184, + 30000, + 7 + ), + ( + 180011, + 180004, + 1875, + '1961-01-01 00:00:00.000000', + 1000, + 186, + 30000, + 8 + ), + ( + 180012, + 180005, + 1876, + '1950-01-01 00:00:00.000000', + 1000, + 136, + 30000, + 9 + ), + ( + 180013, + 180006, + 1877, + '1965-01-01 00:00:00.000000', + 1000, + 177, + 30000, + 5 + ), + ( + 180014, + 180007, + 1878, + '1970-01-01 00:00:00.000000', + 1000, + 180, + 30000, + 6 + ), + ( + 180015, + 180008, + 1879, + '1958-01-01 00:00:00.000000', + 250, + 179, + 30000, + 1 + ), + ( + 180016, + 180009, + 1880, + '1964-01-01 00:00:00.000000', + 500, + 180, + 30000, + 2 + ), + ( + 180017, + 180010, + 1881, + '1958-01-01 00:00:00.000000', + 1000, + 136, + 30000, + 3 + ), + ( + 180018, + 180011, + 1882, + '1964-01-01 00:00:00.000000', + 1000, + 128, + 30000, + 15 + ), + ( + 180019, + 180012, + 1883, + '1932-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 10 + ), + ( + 180020, + 180013, + 1884, + '1970-01-01 00:00:00.000000', + 500, + 178, + 30000, + 12 + ), + ( + 180021, + 180014, + 1885, + '1968-01-01 00:00:00.000000', + 1000, + 135, + 30000, + 11 + ), + ( + 180022, + 180015, + 1886, + '1966-01-01 00:00:00.000000', + 1000, + 165, + 30000, + 14 + ), + ( + 180023, + 180016, + 1887, + '1955-01-01 00:00:00.000000', + 1000, + 135, + 30000, + 13 + ), + ( + 180024, + 180024, + 1888, + '1968-01-01 00:00:00.000000', + 125, + 177, + 30000, + 11 + ), + ( + 180025, + 180025, + 1889, + '1965-01-01 00:00:00.000000', + 1000, + 137, + 30000, + 12 + ), + ( + 180026, + 180026, + 1890, + '1968-01-01 00:00:00.000000', + 1000, + 185, + 30000, + 12 + ), + ( + 180027, + 180027, + 1891, + '1955-01-01 00:00:00.000000', + 250, + 177, + 30000, + 13 + ), + ( + 180028, + 180028, + 1892, + '1959-01-01 00:00:00.000000', + 125, + 185, + 30000, + 13 + ), + ( + 180029, + 180029, + 1893, + '1969-01-01 00:00:00.000000', + 125, + 215, + 30000, + 13 + ), + ( + 180030, + 180030, + 1894, + '1970-01-01 00:00:00.000000', + 1000, + 183, + 30000, + 4 + ), + ( + 180031, + 180031, + 1895, + '1970-01-01 00:00:00.000000', + 125, + 179, + 30000, + 3 + ), + ( + 180032, + 180032, + 1896, + '1965-01-01 00:00:00.000000', + 30, + 215, + 30000, + 3 + ), + ( + 180033, + 180033, + 1897, + '1968-01-01 00:00:00.000000', + 500, + 222, + 30000, + 3 + ), + ( + 180034, + 180034, + 1898, + '1970-01-01 00:00:00.000000', + 60, + 220, + 30000, + 4 + ), + ( + 180035, + 180035, + 1899, + '1965-01-01 00:00:00.000000', + 125, + 179, + 30000, + 3 + ), + ( + 180036, + 180036, + 1900, + '1958-01-01 00:00:00.000000', + 1000, + 136, + 30000, + 1 + ), + ( + 180037, + 180037, + 1901, + '1964-01-01 00:00:00.000000', + 30, + 212, + 30000, + 18 + ), + ( + 180038, + 180038, + 1902, + '1964-01-01 00:00:00.000000', + 1000, + 135, + 30000, + 2 + ), + ( + 180039, + 180039, + 1903, + '1987-01-01 00:00:00.000000', + 30, + 267, + 30000, + 5 + ), + ( + 180040, + 180040, + 1904, + '1987-01-01 00:00:00.000000', + 30, + 1202, + 30000, + 5 + ), + ( + 180041, + 180041, + 1905, + '1987-01-01 00:00:00.000000', + 30, + 265, + 30000, + 4 + ), + ( + 180042, + 180042, + 1906, + '1987-01-01 00:00:00.000000', + 60, + 312, + 30000, + 4 + ), + ( + 180043, + 180043, + 1907, + '1987-01-01 00:00:00.000000', + 30, + 267, + 30000, + 3 + ), + ( + 180044, + 180044, + 1908, + '1987-01-01 00:00:00.000000', + 60, + 314, + 30000, + 3 + ), + ( + 180045, + 180045, + 1909, + '1987-01-01 00:00:00.000000', + 30, + 267, + 30000, + 1 + ), + ( + 180046, + 180046, + 1910, + '1987-01-01 00:00:00.000000', + 30, + 265, + 30000, + 2 + ), + ( + 180047, + 180047, + 1911, + '1987-01-01 00:00:00.000000', + 60, + 314, + 30000, + 1 + ), + ( + 180048, + 180048, + 1912, + '1987-01-01 00:00:00.000000', + 60, + 312, + 30000, + 2 + ), + ( + 180049, + 180049, + 2043, + '1953-01-01 00:00:00.000000', + 1000, + 177, + 30000, + 21 + ), + ( + 180050, + 180050, + 2091, + '1961-01-01 00:00:00.000000', + 125, + 162, + 30000, + 3 + ), + ( + 180051, + 180033, + 2095, + '1968-01-01 00:00:00.000000', + 125, + 222, + 30000, + 3 + ), + ( + 180052, + 180051, + 2097, + '1964-01-01 00:00:00.000000', + 125, + 226, + 30000, + 4 + ), + ( + 180053, + 180052, + 2461, + '1966-01-01 00:00:00.000000', + 125, + 157, + 30000, + 14 + ), + ( + 180054, + 180036, + 2466, + '1964-01-01 00:00:00.000000', + 0, + 136, + 30000, + 18 + ), + ( + 180055, + 180053, + 2477, + '1940-01-01 00:00:00.000000', + 1000, + 140, + 30000, + 20 + ), + ( + 180056, + 180054, + 2501, + '1970-01-01 00:00:00.000000', + 1000, + 183, + 30000, + 16 + ), + ( + 180057, + 180055, + 2502, + '1971-01-01 00:00:00.000000', + 125, + 573, + 30000, + 16 + ), + ( + 180058, + 180056, + 2513, + '1968-01-01 00:00:00.000000', + 1000, + 137, + 30000, + 17 + ), + ( + 180059, + 180057, + 2514, + '1969-01-01 00:00:00.000000', + 125, + 212, + 30000, + 17 + ), + ( + 180060, + 180058, + 2515, + '1970-01-01 00:00:00.000000', + 0, + 934, + 30000, + 17 + ), + ( + 180061, + 180059, + 2530, + '1954-01-01 00:00:00.000000', + 125, + 166, + 30000, + 15 + ), + ( + 180062, + 180060, + 2545, + '1958-01-01 00:00:00.000000', + 1000, + 179, + 30000, + 19 + ), + ( + 180063, + 180061, + 2645, + '1955-01-21 00:00:00.000000', + 250, + 566, + 30000, + 21 + ), + ( + 180064, + 180062, + 2646, + '1968-01-21 00:00:00.000000', + 250, + 469, + 30000, + 8 + ), + ( + 180065, + 180063, + 2647, + '1968-01-21 00:00:00.000000', + 250, + 471, + 30000, + 7 + ), + ( + 180066, + 180064, + 2648, + '1947-01-18 00:00:00.000000', + 250, + 275, + 30000, + 20 + ), + ( + 180067, + 180065, + 2649, + '1955-02-14 00:00:00.000000', + 250, + 330, + 30000, + 9 + ), + ( + 180068, + 180066, + 2654, + '1959-02-18 00:00:00.000000', + 250, + 471, + 30000, + 19 + ), + ( + 180069, + 180067, + 2655, + '1965-03-21 00:00:00.000000', + 60, + 648, + 30000, + 18 + ), + ( + 180070, + 180068, + 2656, + '1939-04-16 00:00:00.000000', + 250, + 255, + 30000, + 10 + ), + ( + 180071, + 180069, + 2657, + '1968-05-16 00:00:00.000000', + 250, + 469, + 30000, + 11 + ), + ( + 180072, + 180070, + 2658, + '1968-05-16 00:00:00.000000', + 250, + 565, + 30000, + 12 + ), + ( + 180073, + 180076, + 2849, + '1957-01-01 00:00:00.000000', + 125, + 234, + 30000, + 15 + ), + ( + 180074, + 180075, + 2848, + '1957-01-01 00:00:00.000000', + 125, + 518, + 30000, + 15 + ), + ( + 180075, + 180074, + 2847, + '1957-01-01 00:00:00.000000', + 125, + 233, + 30000, + 15 + ), + ( + 180076, + 180071, + 2851, + '1957-01-01 00:00:00.000000', + 250, + 199, + 30000, + 15 + ), + ( + 180077, + 180072, + 2852, + '1957-01-01 00:00:00.000000', + 125, + 166, + 30000, + 15 + ), + ( + 180078, + 180073, + 2853, + '1957-01-01 00:00:00.000000', + 60, + 230, + 30000, + 15 + ), + ( + 180079, + 180077, + 2845, + '1957-01-01 00:00:00.000000', + 1000, + 171, + 30000, + 15 + ), + ( + 180080, + 180078, + 2846, + '1957-01-01 00:00:00.000000', + 250, + 195, + 30000, + 15 + ), + ( + 180081, + 180079, + 2977, + '1965-01-01 00:00:00.000000', + 250, + 469, + 30000, + 4 + ), + ( + 180082, + 180087, + 2985, + '1965-01-01 00:00:00.000000', + 250, + 566, + 30000, + 21 + ), + ( + 180083, + 180088, + 2986, + '1965-01-01 00:00:00.000000', + 60, + 597, + 30000, + 21 + ), + ( + 180084, + 180089, + 2987, + '1965-01-01 00:00:00.000000', + 250, + 484, + 30000, + 21 + ), + ( + 180085, + 180084, + 2982, + '1965-01-01 00:00:00.000000', + 250, + 597, + 30000, + 21 + ), + ( + 180086, + 180081, + 2979, + '1965-01-01 00:00:00.000000', + 250, + 597, + 30000, + 4 + ), + ( + 180087, + 180082, + 2980, + '1965-01-01 00:00:00.000000', + 125, + 329, + 30000, + 21 + ), + ( + 180088, + 180085, + 2983, + '1965-01-01 00:00:00.000000', + 500, + 566, + 30000, + 21 + ), + ( + 180089, + 180086, + 2984, + '1965-01-01 00:00:00.000000', + 250, + 566, + 30000, + 21 + ), + ( + 180090, + 180080, + 2978, + '1965-01-01 00:00:00.000000', + 125, + 752, + 30000, + 4 + ), + ( + 180091, + 180083, + 2981, + '1965-01-01 00:00:00.000000', + 125, + 888, + 30000, + 21 + ), + ( + 180092, + 180091, + 3067, + '1966-01-01 00:00:00.000000', + 125, + 500, + 30000, + 2 + ), + ( + 180093, + 180093, + 3069, + '1966-01-01 00:00:00.000000', + 60, + 717, + 30000, + 2 + ), + ( + 180094, + 180092, + 3068, + '1966-01-01 00:00:00.000000', + 125, + 345, + 30000, + 2 + ), + ( + 180095, + 180090, + 3066, + '1966-01-01 00:00:00.000000', + 250, + 216, + 30000, + 2 + ), + ( + 180096, + 180094, + 3104, + '1966-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 13 + ), + ( + 180097, + 180095, + 3105, + '1966-01-01 00:00:00.000000', + 60, + 1851, + 30000, + 13 + ), + ( + 180098, + 180096, + 3106, + '1966-01-01 00:00:00.000000', + 125, + 1506, + 30000, + 13 + ), + ( + 180099, + 180149, + 3362, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 12 + ), + ( + 180100, + 180130, + 3346, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 19 + ), + ( + 180101, + 180157, + 3370, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 1 + ), + ( + 180102, + 180141, + 3354, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 14 + ), + ( + 180103, + 180165, + 3378, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 3 + ), + ( + 180104, + 180117, + 3330, + '1967-01-01 00:00:00.000000', + 125, + 1157, + 30000, + 18 + ), + ( + 180105, + 180125, + 3338, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 9 + ), + ( + 180106, + 180173, + 3386, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 5 + ), + ( + 180107, + 180109, + 3322, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 17 + ), + ( + 180108, + 180101, + 3314, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 16 + ), + ( + 180109, + 180172, + 3385, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 5 + ), + ( + 180110, + 180148, + 3361, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 12 + ), + ( + 180111, + 180108, + 3321, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 17 + ), + ( + 180112, + 180100, + 3313, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 16 + ), + ( + 180113, + 180156, + 3369, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 1 + ), + ( + 180114, + 180129, + 3345, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 19 + ), + ( + 180115, + 180140, + 3353, + '1967-01-01 00:00:00.000000', + 500, + 255, + 30000, + 14 + ), + ( + 180116, + 180124, + 3337, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 9 + ), + ( + 180117, + 180116, + 3329, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 18 + ), + ( + 180118, + 180164, + 3377, + '1967-01-01 00:00:00.000000', + 500, + 1255, + 30000, + 3 + ), + ( + 180119, + 180120, + 3333, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 18 + ), + ( + 180120, + 180160, + 3373, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 1 + ), + ( + 180121, + 180133, + 3349, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 19 + ), + ( + 180122, + 180144, + 3357, + '1967-01-01 00:00:00.000000', + 0, + 3877, + 30000, + 14 + ), + ( + 180123, + 180112, + 3325, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 17 + ), + ( + 180124, + 180168, + 3381, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 3 + ), + ( + 180125, + 180104, + 3317, + '1967-01-01 00:00:00.000000', + 0, + 5818, + 30000, + 16 + ), + ( + 180126, + 180128, + 3341, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 9 + ), + ( + 180127, + 180176, + 3389, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 5 + ), + ( + 180128, + 180152, + 3365, + '1967-01-01 00:00:00.000000', + 0, + 5137, + 30000, + 12 + ), + ( + 180129, + 180158, + 3371, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 1 + ), + ( + 180130, + 180174, + 3387, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 5 + ), + ( + 180131, + 180102, + 3315, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 16 + ), + ( + 180132, + 180142, + 3355, + '1967-01-01 00:00:00.000000', + 125, + 580, + 30000, + 14 + ), + ( + 180133, + 180110, + 3323, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 17 + ), + ( + 180134, + 180131, + 3347, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 19 + ), + ( + 180135, + 180150, + 3363, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 12 + ), + ( + 180136, + 180118, + 3331, + '1967-01-01 00:00:00.000000', + 30, + 1580, + 30000, + 18 + ), + ( + 180137, + 180166, + 3379, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 3 + ), + ( + 180138, + 180126, + 3339, + '1967-01-01 00:00:00.000000', + 125, + 1580, + 30000, + 9 + ), + ( + 180139, + 180151, + 3364, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 12 + ), + ( + 180140, + 180175, + 3388, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 5 + ), + ( + 180141, + 180143, + 3356, + '1967-01-01 00:00:00.000000', + 125, + 317, + 30000, + 14 + ), + ( + 180142, + 180159, + 3372, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 1 + ), + ( + 180143, + 180132, + 3348, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 19 + ), + ( + 180144, + 180127, + 3340, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 9 + ), + ( + 180145, + 180111, + 3324, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 17 + ), + ( + 180146, + 180119, + 3332, + '1967-01-01 00:00:00.000000', + 30, + 1577, + 30000, + 18 + ), + ( + 180147, + 180167, + 3380, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 3 + ), + ( + 180148, + 180103, + 3316, + '1967-01-01 00:00:00.000000', + 125, + 1577, + 30000, + 16 + ), + ( + 180149, + 180154, + 3367, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 1 + ), + ( + 180150, + 180170, + 3383, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 5 + ), + ( + 180151, + 180162, + 3375, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 3 + ), + ( + 180152, + 180122, + 3335, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 9 + ), + ( + 180153, + 180098, + 3311, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 16 + ), + ( + 180154, + 180146, + 3359, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 12 + ), + ( + 180155, + 180106, + 3319, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 17 + ), + ( + 180156, + 180114, + 3327, + '1967-01-01 00:00:00.000000', + 30, + 1384, + 30000, + 18 + ), + ( + 180157, + 180138, + 3351, + '1967-01-01 00:00:00.000000', + 250, + 384, + 30000, + 14 + ), + ( + 180158, + 180135, + 3343, + '1967-01-01 00:00:00.000000', + 250, + 1384, + 30000, + 19 + ), + ( + 180159, + 180097, + 3310, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 16 + ), + ( + 180160, + 180105, + 3318, + '1967-01-01 00:00:00.000000', + 500, + 1157, + 30000, + 17 + ), + ( + 180161, + 180113, + 3326, + '1967-01-01 00:00:00.000000', + 350, + 1389, + 30000, + 18 + ), + ( + 180162, + 180121, + 3334, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 9 + ), + ( + 180163, + 180153, + 3366, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 1 + ), + ( + 180164, + 180134, + 3342, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 19 + ), + ( + 180165, + 180145, + 3358, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 12 + ), + ( + 180166, + 180161, + 3374, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 3 + ), + ( + 180167, + 180137, + 3350, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 14 + ), + ( + 180168, + 180169, + 3382, + '1967-01-01 00:00:00.000000', + 500, + 1389, + 30000, + 5 + ), + ( + 180169, + 180155, + 3368, + '1967-01-01 00:00:00.000000', + 125, + 1587, + 30000, + 1 + ), + ( + 180170, + 180099, + 3312, + '1967-01-01 00:00:00.000000', + 150, + 1587, + 30000, + 16 + ), + ( + 180171, + 180171, + 3384, + '1967-01-01 00:00:00.000000', + 150, + 1587, + 30000, + 5 + ), + ( + 180172, + 180163, + 3376, + '1967-01-01 00:00:00.000000', + 150, + 1587, + 30000, + 3 + ), + ( + 180173, + 180107, + 3320, + '1967-01-01 00:00:00.000000', + 150, + 1587, + 30000, + 17 + ), + ( + 180174, + 180139, + 3352, + '1967-01-01 00:00:00.000000', + 150, + 387, + 30000, + 14 + ), + ( + 180175, + 180115, + 3328, + '1967-01-01 00:00:00.000000', + 30, + 1587, + 30000, + 18 + ), + ( + 180176, + 180136, + 3344, + '1967-01-01 00:00:00.000000', + 125, + 1704, + 30000, + 19 + ), + ( + 180177, + 180123, + 3336, + '1967-01-01 00:00:00.000000', + 125, + 1587, + 30000, + 9 + ), + ( + 180178, + 180147, + 3360, + '1967-01-01 00:00:00.000000', + 125, + 1587, + 30000, + 12 + ), + ( + 190001, + 190001, + 104, + '1968-01-01 00:00:00.000000', + 125, + 185, + 30000, + 4 + ), + ( + 190002, + 190002, + 105, + '1965-01-01 00:00:00.000000', + 250, + 208, + 30000, + 3 + ), + ( + 190003, + 190003, + 106, + '1961-01-01 00:00:00.000000', + 500, + 180, + 30000, + 3 + ), + ( + 190004, + 190004, + 107, + '1969-01-01 00:00:00.000000', + 125, + 163, + 30000, + 13 + ), + ( + 190005, + 190005, + 2650, + '1967-01-01 00:00:00.000000', + 125, + 116, + 30000, + 9 + ), + ( + 190006, + 190006, + 417, + '1961-01-01 00:00:00.000000', + 1000, + 96, + 30000, + 13 + ), + ( + 190007, + 190021, + 1384, + '1990-01-01 00:00:00.000000', + 500, + 185, + 30000, + 4 + ), + ( + 190008, + 190022, + 1389, + '1990-01-01 00:00:00.000000', + 125, + 242, + 30000, + 4 + ), + ( + 190009, + 190023, + 1734, + '1990-01-01 00:00:00.000000', + 250, + 214, + 30000, + 4 + ), + ( + 190010, + 190024, + 1735, + '1990-01-01 00:00:00.000000', + 250, + 205, + 30000, + 4 + ), + ( + 190011, + 190025, + 1395, + '1990-01-01 00:00:00.000000', + 0, + 1511, + 30000, + 3 + ), + ( + 190012, + 190007, + 1820, + '1967-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 7 + ), + ( + 190013, + 190008, + 1821, + '1953-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 21 + ), + ( + 190014, + 190009, + 1822, + '1959-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 9 + ), + ( + 190015, + 190010, + 1823, + '1958-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 5 + ), + ( + 190016, + 190011, + 1824, + '1955-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 6 + ), + ( + 190017, + 190012, + 1825, + '1958-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 1 + ), + ( + 190018, + 190013, + 1826, + '1964-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 2 + ), + ( + 190019, + 190014, + 1827, + '1958-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 3 + ), + ( + 190020, + 190015, + 1828, + '1964-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 4 + ), + ( + 190021, + 190016, + 1829, + '1932-01-01 00:00:00.000000', + 1000, + 81, + 30000, + 10 + ), + ( + 190022, + 190017, + 1830, + '1970-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 12 + ), + ( + 190023, + 190018, + 1831, + '1968-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 11 + ), + ( + 190024, + 190019, + 1832, + '1968-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 14 + ), + ( + 190025, + 190020, + 1833, + '1955-01-01 00:00:00.000000', + 1000, + 163, + 30000, + 13 + ), + ( + 190026, + 190026, + 1834, + '1965-01-01 00:00:00.000000', + 0, + 227, + 30000, + 3 + ), + ( + 190027, + 190027, + 1835, + '1968-01-01 00:00:00.000000', + 500, + 180, + 30000, + 3 + ), + ( + 190028, + 190028, + 1836, + '1971-01-01 00:00:00.000000', + 500, + 180, + 30000, + 17 + ), + ( + 190029, + 190029, + 1837, + '1969-01-01 00:00:00.000000', + 0, + 203, + 30000, + 17 + ), + ( + 190030, + 190030, + 1838, + '1969-01-01 00:00:00.000000', + 125, + 193, + 30000, + 17 + ), + ( + 190031, + 190031, + 1839, + '1964-01-01 00:00:00.000000', + 500, + 187, + 30000, + 1 + ), + ( + 190032, + 190032, + 1840, + '1987-01-01 00:00:00.000000', + 500, + 185, + 30000, + 6 + ), + ( + 190033, + 190033, + 1841, + '1987-01-01 00:00:00.000000', + 500, + 208, + 30000, + 5 + ), + ( + 190034, + 190039, + 1842, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 6 + ), + ( + 190035, + 190038, + 1843, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 5 + ), + ( + 190036, + 190037, + 1844, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 7 + ), + ( + 190037, + 190036, + 1845, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 12 + ), + ( + 190038, + 190035, + 1846, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 13 + ), + ( + 190039, + 190034, + 1847, + '1987-01-01 00:00:00.000000', + 250, + 234, + 30000, + 3 + ), + ( + 190040, + 190045, + 1848, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 13 + ), + ( + 190041, + 190044, + 1849, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 12 + ), + ( + 190042, + 190043, + 1850, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 3 + ), + ( + 190043, + 190042, + 1851, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 6 + ), + ( + 190044, + 190041, + 1852, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 5 + ), + ( + 190045, + 190040, + 1853, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 7 + ), + ( + 190046, + 190046, + 1854, + '1987-01-01 00:00:00.000000', + 250, + 222, + 30000, + 6 + ), + ( + 190047, + 190047, + 1855, + '1999-01-01 00:00:00.000000', + 0, + 1511, + 30000, + 7 + ), + ( + 190048, + 190048, + 1856, + '1999-01-01 00:00:00.000000', + 0, + 1511, + 30000, + 5 + ), + ( + 190049, + 190049, + 1857, + '1999-01-01 00:00:00.000000', + 0, + 1402, + 30000, + 6 + ), + ( + 190050, + 190065, + 1858, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 13 + ), + ( + 190051, + 190064, + 1859, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 1 + ), + ( + 190052, + 190063, + 1860, + '1999-01-01 00:00:00.000000', + 500, + 185, + 30000, + 4 + ), + ( + 190053, + 190062, + 1861, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 3 + ), + ( + 190054, + 190061, + 1862, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 5 + ), + ( + 190055, + 190060, + 1863, + '1999-01-01 00:00:00.000000', + 500, + 185, + 30000, + 6 + ), + ( + 190056, + 190059, + 1864, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 5 + ), + ( + 190057, + 190058, + 1865, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 6 + ), + ( + 190058, + 190057, + 1866, + '1999-01-01 00:00:00.000000', + 250, + 252, + 30000, + 5 + ), + ( + 190059, + 190056, + 1867, + '1999-01-01 00:00:00.000000', + 250, + 252, + 30000, + 6 + ), + ( + 190060, + 190055, + 1868, + '1999-01-01 00:00:00.000000', + 250, + 252, + 30000, + 4 + ), + ( + 190061, + 190054, + 1869, + '1999-01-01 00:00:00.000000', + 500, + 201, + 30000, + 5 + ), + ( + 190062, + 190053, + 1870, + '1999-01-01 00:00:00.000000', + 500, + 185, + 30000, + 6 + ), + ( + 190063, + 190052, + 1871, + '1999-01-01 00:00:00.000000', + 500, + 185, + 30000, + 4 + ), + ( + 190064, + 190051, + 1872, + '1999-01-01 00:00:00.000000', + 125, + 216, + 30000, + 5 + ), + ( + 190065, + 190050, + 1873, + '1999-01-01 00:00:00.000000', + 125, + 195, + 30000, + 6 + ), + ( + 190066, + 190066, + 2054, + '1970-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 6 + ), + ( + 190067, + 190067, + 2058, + '1961-01-01 00:00:00.000000', + 500, + 146, + 30000, + 19 + ), + ( + 190068, + 190068, + 2460, + '1966-01-01 00:00:00.000000', + 1000, + 127, + 30000, + 14 + ), + ( + 190069, + 190069, + 2464, + '1964-01-01 00:00:00.000000', + 30, + 189, + 30000, + 18 + ), + ( + 190070, + 190012, + 2465, + '1964-01-01 00:00:00.000000', + 0, + 163, + 30000, + 18 + ), + ( + 190071, + 190070, + 187, + '1940-01-01 00:00:00.000000', + 1000, + 127, + 30000, + 20 + ), + ( + 190072, + 190071, + 2481, + '1967-01-01 00:00:00.000000', + 1000, + 96, + 30000, + 8 + ), + ( + 190073, + 190072, + 2499, + '1970-01-01 00:00:00.000000', + 1000, + 133, + 30000, + 16 + ), + ( + 190074, + 190073, + 2500, + '1971-01-01 00:00:00.000000', + 125, + 160, + 30000, + 16 + ), + ( + 190075, + 190074, + 2512, + '1968-01-01 00:00:00.000000', + 1000, + 170, + 30000, + 17 + ), + ( + 190076, + 190075, + 2522, + '1964-01-01 00:00:00.000000', + 125, + 153, + 30000, + 4 + ), + ( + 190077, + 190076, + 2532, + '1954-01-01 00:00:00.000000', + 1000, + 125, + 30000, + 15 + ), + ( + 190078, + 190077, + 2533, + '1954-01-01 00:00:00.000000', + 125, + 124, + 30000, + 15 + ), + ( + 190079, + 190078, + 2653, + '1964-01-01 00:00:00.000000', + 125, + 146, + 30000, + 21 + ), + ( + 190080, + 190079, + 2652, + '1964-01-01 00:00:00.000000', + 250, + 133, + 30000, + 8 + ), + ( + 190081, + 190080, + 2651, + '1955-01-01 00:00:00.000000', + 250, + 133, + 30000, + 20 + ), + ( + 190082, + 190081, + 2644, + '1965-01-01 00:00:00.000000', + 500, + 133, + 30000, + 19 + ), + ( + 190083, + 190082, + 2643, + '1990-01-01 00:00:00.000000', + 500, + 208, + 30000, + 19 + ), + ( + 190084, + 190083, + 2642, + '1990-01-01 00:00:00.000000', + 30, + 252, + 30000, + 2 + ), + ( + 190085, + 190084, + 2641, + '1990-01-01 00:00:00.000000', + 30, + 261, + 30000, + 18 + ), + ( + 190086, + 190085, + 2640, + '1990-01-01 00:00:00.000000', + 30, + 231, + 30000, + 18 + ), + ( + 190087, + 190086, + 2639, + '0190-01-01 00:00:00.000000', + 0, + 1511, + 30000, + 18 + ), + ( + 190088, + 190087, + 2638, + '1990-01-01 00:00:00.000000', + 250, + 261, + 30000, + 18 + ), + ( + 190089, + 190088, + 2637, + '1990-01-01 00:00:00.000000', + 250, + 133, + 30000, + 10 + ), + ( + 190090, + 190089, + 2636, + '1965-01-01 00:00:00.000000', + 250, + 180, + 30000, + 11 + ), + ( + 190091, + 190098, + 2862, + '1957-01-01 00:00:00.000000', + 250, + 147, + 30000, + 15 + ), + ( + 190092, + 190095, + 2859, + '1957-01-01 00:00:00.000000', + 250, + 176, + 30000, + 15 + ), + ( + 190093, + 190097, + 2861, + '1957-01-01 00:00:00.000000', + 125, + 124, + 30000, + 15 + ), + ( + 190094, + 190096, + 2860, + '1957-01-01 00:00:00.000000', + 125, + 195, + 30000, + 15 + ), + ( + 190095, + 190094, + 2858, + '1957-01-01 00:00:00.000000', + 125, + 177, + 30000, + 15 + ), + ( + 190096, + 190093, + 2857, + '1957-01-01 00:00:00.000000', + 250, + 164, + 30000, + 15 + ), + ( + 190097, + 190090, + 2854, + '1957-01-01 00:00:00.000000', + 250, + 160, + 30000, + 15 + ), + ( + 190098, + 190091, + 2855, + '1957-01-01 00:00:00.000000', + 125, + 177, + 30000, + 15 + ), + ( + 190099, + 190092, + 2856, + '1957-01-01 00:00:00.000000', + 250, + 177, + 30000, + 15 + ), + ( + 190100, + 190099, + 2966, + '1965-01-01 00:00:00.000000', + 500, + 133, + 30000, + 21 + ), + ( + 190101, + 190101, + 2968, + '1965-01-01 00:00:00.000000', + 250, + 151, + 30000, + 21 + ), + ( + 190102, + 190102, + 2969, + '1965-01-01 00:00:00.000000', + 60, + 202, + 30000, + 21 + ), + ( + 190103, + 190103, + 2970, + '1965-01-01 00:00:00.000000', + 125, + 162, + 30000, + 21 + ), + ( + 190104, + 190104, + 2971, + '1965-01-01 00:00:00.000000', + 125, + 222, + 30000, + 21 + ), + ( + 190105, + 190109, + 2976, + '1965-01-01 00:00:00.000000', + 250, + 178, + 30000, + 4 + ), + ( + 190106, + 190100, + 2967, + '1965-01-01 00:00:00.000000', + 125, + 139, + 30000, + 21 + ), + ( + 190107, + 190106, + 2973, + '1965-01-01 00:00:00.000000', + 250, + 166, + 30000, + 21 + ), + ( + 190108, + 190105, + 2972, + '1965-01-01 00:00:00.000000', + 250, + 162, + 30000, + 21 + ), + ( + 190109, + 190107, + 2974, + '1965-01-01 00:00:00.000000', + 60, + 214, + 30000, + 21 + ), + ( + 190110, + 190108, + 2975, + '1965-01-01 00:00:00.000000', + 60, + 252, + 30000, + 4 + ), + ( + 190111, + 190112, + 3062, + '1966-01-01 00:00:00.000000', + 125, + 193, + 30000, + 2 + ), + ( + 190112, + 190114, + 3065, + '1966-01-01 00:00:00.000000', + 125, + 169, + 30000, + 2 + ), + ( + 190113, + 190113, + 3063, + '1966-01-01 00:00:00.000000', + 125, + 252, + 30000, + 2 + ), + ( + 190114, + 190110, + 3060, + '1966-01-01 00:00:00.000000', + 500, + 139, + 30000, + 2 + ), + ( + 190115, + 190111, + 3061, + '1966-01-01 00:00:00.000000', + 250, + 162, + 30000, + 2 + ), + ( + 190116, + 190115, + 3064, + '1966-01-01 00:00:00.000000', + 250, + 151, + 30000, + 2 + ), + ( + 190117, + 190116, + 3101, + '1966-01-01 00:00:00.000000', + 250, + 173, + 30000, + 13 + ), + ( + 190118, + 190117, + 3102, + '1966-01-01 00:00:00.000000', + 125, + 175, + 30000, + 13 + ), + ( + 190119, + 190118, + 3103, + '1966-01-01 00:00:00.000000', + 125, + 252, + 30000, + 13 + ), + ( + 190120, + 190172, + 3184, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 3 + ), + ( + 190121, + 190159, + 3171, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 12 + ), + ( + 190122, + 190167, + 3179, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 1 + ), + ( + 190123, + 190135, + 3147, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 9 + ), + ( + 190124, + 190146, + 3155, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 19 + ), + ( + 190125, + 190131, + 3143, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 18 + ), + ( + 190126, + 190154, + 3166, + '1967-01-01 00:00:00.000000', + 500, + 185, + 30000, + 14 + ), + ( + 190127, + 190166, + 3178, + '1967-01-01 00:00:00.000000', + 500, + 145, + 30000, + 1 + ), + ( + 190128, + 190158, + 3170, + '1967-01-01 00:00:00.000000', + 500, + 145, + 30000, + 12 + ), + ( + 190129, + 190145, + 3154, + '1967-01-01 00:00:00.000000', + 500, + 145, + 30000, + 19 + ), + ( + 190130, + 190171, + 3183, + '1967-01-01 00:00:00.000000', + 500, + 145, + 30000, + 3 + ), + ( + 190131, + 190153, + 3165, + '1967-01-01 00:00:00.000000', + 500, + 145, + 30000, + 14 + ), + ( + 190132, + 190157, + 3169, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 14 + ), + ( + 190133, + 190170, + 3182, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 1 + ), + ( + 190134, + 190149, + 3158, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 19 + ), + ( + 190135, + 190175, + 3187, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 3 + ), + ( + 190136, + 190162, + 3174, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 12 + ), + ( + 190137, + 190130, + 3142, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 17 + ), + ( + 190138, + 190138, + 3150, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 9 + ), + ( + 190139, + 190134, + 3146, + '1967-01-01 00:00:00.000000', + 0, + 211, + 30000, + 18 + ), + ( + 190140, + 190124, + 3136, + '1967-01-01 00:00:00.000000', + 0, + 1366, + 30000, + 16 + ), + ( + 190141, + 190173, + 3185, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 3 + ), + ( + 190142, + 190168, + 3180, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 1 + ), + ( + 190143, + 190128, + 3140, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 17 + ), + ( + 190144, + 190132, + 3144, + '1967-01-01 00:00:00.000000', + 60, + 189, + 30000, + 18 + ), + ( + 190145, + 190147, + 3156, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 19 + ), + ( + 190146, + 190122, + 3134, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 16 + ), + ( + 190147, + 190136, + 3148, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 9 + ), + ( + 190148, + 190155, + 3167, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 14 + ), + ( + 190149, + 190160, + 3172, + '1967-01-01 00:00:00.000000', + 125, + 175, + 30000, + 12 + ), + ( + 190150, + 190174, + 3186, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 3 + ), + ( + 190151, + 190148, + 3157, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 19 + ), + ( + 190152, + 190156, + 3168, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 14 + ), + ( + 190153, + 190169, + 3181, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 1 + ), + ( + 190154, + 190161, + 3173, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 12 + ), + ( + 190155, + 190137, + 3149, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 9 + ), + ( + 190156, + 190123, + 3135, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 16 + ), + ( + 190157, + 190133, + 3145, + '1967-01-01 00:00:00.000000', + 60, + 281, + 30000, + 18 + ), + ( + 190158, + 190129, + 3141, + '1967-01-01 00:00:00.000000', + 125, + 231, + 30000, + 17 + ), + ( + 190159, + 190143, + 3160, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 19 + ), + ( + 190160, + 190164, + 3176, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 1 + ), + ( + 190161, + 190140, + 3152, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 9 + ), + ( + 190162, + 190151, + 3163, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 14 + ), + ( + 190163, + 190120, + 3132, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 16 + ), + ( + 190164, + 190126, + 3138, + '1967-01-01 00:00:00.000000', + 500, + 157, + 30000, + 17 + ), + ( + 190165, + 190139, + 3151, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 9 + ), + ( + 190166, + 190119, + 3131, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 16 + ), + ( + 190167, + 190125, + 3137, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 17 + ), + ( + 190168, + 190142, + 3159, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 19 + ), + ( + 190169, + 190163, + 3175, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 1 + ), + ( + 190170, + 190150, + 3162, + '1967-01-01 00:00:00.000000', + 500, + 166, + 30000, + 14 + ), + ( + 190171, + 190141, + 3153, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 9 + ), + ( + 190172, + 190165, + 3177, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 1 + ), + ( + 190173, + 190144, + 3161, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 19 + ), + ( + 190174, + 190152, + 3164, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 14 + ), + ( + 190175, + 190127, + 3139, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 17 + ), + ( + 190176, + 190121, + 3133, + '1967-01-01 00:00:00.000000', + 250, + 231, + 30000, + 16 + ), + ( + 200001, + 200001, + 1623, + '1932-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 3 + ), + ( + 200002, + 200006, + 490, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 6 + ), + ( + 200003, + 200003, + 491, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 5 + ), + ( + 200004, + 200002, + 518, + '1955-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 4 + ), + ( + 200005, + 200008, + 882, + '1958-01-01 00:00:00.000000', + 125, + 126, + 30000, + 3 + ), + ( + 200006, + 200009, + 1460, + '1966-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 2 + ), + ( + 200007, + 200010, + 1461, + '1969-01-01 00:00:00.000000', + 125, + 297, + 30000, + 14 + ), + ( + 200008, + 200011, + 1516, + '1963-01-01 00:00:00.000000', + 0, + 1915, + 30000, + 19 + ), + ( + 200009, + 200012, + 1582, + '1969-01-01 00:00:00.000000', + 250, + 71, + 30000, + 13 + ), + ( + 200010, + 200005, + 1615, + '1965-01-01 00:00:00.000000', + 0, + 231, + 30000, + 3 + ), + ( + 200011, + 200013, + 1473, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 4 + ), + ( + 200012, + 200014, + 1629, + '1969-01-01 00:00:00.000000', + 125, + 71, + 30000, + 17 + ), + ( + 200013, + 200007, + 1678, + '1999-01-01 00:00:00.000000', + 250, + 175, + 30000, + 15 + ), + ( + 200014, + 200015, + 1683, + '1968-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 1 + ), + ( + 200015, + 200004, + 1471, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 3 + ), + ( + 200016, + 200016, + 1763, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 7 + ), + ( + 200017, + 200017, + 1764, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 8 + ), + ( + 200018, + 200018, + 1765, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 9 + ), + ( + 200019, + 200019, + 1766, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 10 + ), + ( + 200020, + 200020, + 1767, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 12 + ), + ( + 200021, + 200021, + 1768, + '1968-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 11 + ), + ( + 200022, + 200022, + 1769, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 14 + ), + ( + 200023, + 200023, + 1770, + '1999-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 13 + ), + ( + 200024, + 200024, + 1771, + '1999-01-01 00:00:00.000000', + 1000, + 64, + 30000, + 6 + ), + ( + 200025, + 200025, + 1772, + '1999-01-01 00:00:00.000000', + 250, + 297, + 30000, + 7 + ), + ( + 200026, + 200026, + 1773, + '1999-01-01 00:00:00.000000', + 125, + 414, + 30000, + 7 + ), + ( + 200027, + 200027, + 1774, + '1999-01-01 00:00:00.000000', + 500, + 64, + 30000, + 13 + ), + ( + 200028, + 200028, + 1775, + '1999-01-01 00:00:00.000000', + 1000, + 64, + 30000, + 3 + ), + ( + 200029, + 200029, + 1776, + '1999-01-01 00:00:00.000000', + 1000, + 64, + 30000, + 1 + ), + ( + 200030, + 200030, + 1777, + '1999-01-01 00:00:00.000000', + 125, + 350, + 30000, + 19 + ), + ( + 200031, + 200031, + 1778, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 4 + ), + ( + 200032, + 200032, + 1779, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 6 + ), + ( + 200033, + 200033, + 1780, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 5 + ), + ( + 200034, + 200034, + 1781, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 7 + ), + ( + 200035, + 200035, + 1782, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 12 + ), + ( + 200036, + 200036, + 1783, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 6 + ), + ( + 200037, + 200037, + 1784, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 5 + ), + ( + 200038, + 200038, + 1785, + '1999-01-01 00:00:00.000000', + 125, + 193, + 30000, + 1 + ), + ( + 200039, + 200039, + 1786, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 1 + ), + ( + 200040, + 200040, + 1787, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 7 + ), + ( + 200041, + 200041, + 1788, + '1999-01-01 00:00:00.000000', + 125, + 297, + 30000, + 12 + ), + ( + 200042, + 200042, + 1963, + '1957-01-01 00:00:00.000000', + 125, + 217, + 30000, + 15 + ), + ( + 200043, + 200043, + 2024, + '1966-01-01 00:00:00.000000', + 250, + 278, + 30000, + 3 + ), + ( + 200044, + 200044, + 2025, + '1966-01-01 00:00:00.000000', + 250, + 125, + 30000, + 3 + ), + ( + 200045, + 200045, + 2026, + '1959-01-01 00:00:00.000000', + 125, + 142, + 30000, + 1 + ), + ( + 200046, + 200046, + 2040, + '1965-01-01 00:00:00.000000', + 1000, + 64, + 30000, + 5 + ), + ( + 200047, + 200047, + 2052, + '1967-01-01 00:00:00.000000', + 250, + 153, + 30000, + 6 + ), + ( + 200048, + 200048, + 2056, + '1958-01-01 00:00:00.000000', + 250, + 126, + 30000, + 19 + ), + ( + 200049, + 200049, + 2057, + '1959-01-01 00:00:00.000000', + 125, + 414, + 30000, + 19 + ), + ( + 200050, + 200050, + 2059, + '1963-01-01 00:00:00.000000', + 250, + 153, + 30000, + 19 + ), + ( + 200051, + 200051, + 2063, + '1970-01-01 00:00:00.000000', + 250, + 193, + 30000, + 5 + ), + ( + 200052, + 200052, + 2066, + '1966-01-01 00:00:00.000000', + 250, + 193, + 30000, + 12 + ), + ( + 200053, + 200053, + 2075, + '1959-01-01 00:00:00.000000', + 125, + 71, + 30000, + 18 + ), + ( + 200054, + 200054, + 2104, + '1969-01-01 00:00:00.000000', + 250, + 64, + 30000, + 4 + ), + ( + 200055, + 200015, + 2463, + '1964-01-01 00:00:00.000000', + 0, + 54, + 30000, + 18 + ), + ( + 200056, + 200055, + 2475, + '1940-01-01 00:00:00.000000', + 1000, + 40, + 30000, + 20 + ), + ( + 200057, + 200056, + 2483, + '1953-01-01 00:00:00.000000', + 250, + 114, + 30000, + 21 + ), + ( + 200058, + 200057, + 2484, + '1953-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 21 + ), + ( + 200059, + 200058, + 2485, + '1955-01-01 00:00:00.000000', + 125, + 183, + 30000, + 21 + ), + ( + 200060, + 200059, + 2486, + '1956-01-01 00:00:00.000000', + 125, + 333, + 30000, + 21 + ), + ( + 200061, + 200060, + 2490, + '1964-01-01 00:00:00.000000', + 250, + 64, + 30000, + 2 + ), + ( + 200062, + 200061, + 2497, + '1970-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 16 + ), + ( + 200063, + 200062, + 2498, + '1971-01-01 00:00:00.000000', + 250, + 64, + 30000, + 16 + ), + ( + 200064, + 200063, + 2510, + '1968-01-01 00:00:00.000000', + 1000, + 54, + 30000, + 17 + ), + ( + 200065, + 200064, + 2511, + '1970-01-01 00:00:00.000000', + 250, + 64, + 30000, + 17 + ), + ( + 200066, + 200065, + 2531, + '1954-01-01 00:00:00.000000', + 1000, + 50, + 30000, + 15 + ), + ( + 200067, + 200066, + 2627, + '1990-01-01 00:00:00.000000', + 500, + 183, + 30000, + 8 + ), + ( + 200068, + 200068, + 2626, + '1990-01-01 00:00:00.000000', + 250, + 183, + 30000, + 20 + ), + ( + 200069, + 200067, + 2625, + '1990-01-01 00:00:00.000000', + 500, + 64, + 30000, + 20 + ), + ( + 200070, + 200069, + 2624, + '1990-01-01 00:00:00.000000', + 500, + 183, + 30000, + 9 + ), + ( + 200071, + 200070, + 2623, + '1990-01-01 00:00:00.000000', + 60, + 249, + 30000, + 18 + ), + ( + 200072, + 200071, + 2622, + '1990-01-01 00:00:00.000000', + 125, + 167, + 30000, + 18 + ), + ( + 200073, + 200072, + 2620, + '1990-01-01 00:00:00.000000', + 500, + 183, + 30000, + 10 + ), + ( + 200074, + 200073, + 2621, + '1990-01-01 00:00:00.000000', + 250, + 333, + 30000, + 10 + ), + ( + 200075, + 200074, + 2619, + '1990-01-01 00:00:00.000000', + 500, + 183, + 30000, + 11 + ), + ( + 200076, + 200075, + 2659, + '1998-01-01 00:00:00.000000', + 0, + 489, + 30000, + 6 + ), + ( + 200077, + 200076, + 2835, + '1957-01-01 00:00:00.000000', + 125, + 133, + 30000, + 15 + ), + ( + 200078, + 200079, + 2838, + '1957-01-01 00:00:00.000000', + 125, + 137, + 30000, + 15 + ), + ( + 200079, + 200080, + 2839, + '1957-01-01 00:00:00.000000', + 125, + 146, + 30000, + 15 + ), + ( + 200080, + 200077, + 2836, + '1957-01-01 00:00:00.000000', + 125, + 151, + 30000, + 15 + ), + ( + 200081, + 200078, + 2837, + '1957-01-01 00:00:00.000000', + 125, + 156, + 30000, + 15 + ), + ( + 200082, + 200081, + 2840, + '1957-01-01 00:00:00.000000', + 125, + 228, + 30000, + 15 + ), + ( + 200083, + 200083, + 2842, + '1957-01-01 00:00:00.000000', + 60, + 243, + 30000, + 15 + ), + ( + 200084, + 200084, + 2843, + '1957-01-01 00:00:00.000000', + 60, + 268, + 30000, + 15 + ), + ( + 200085, + 200082, + 2841, + '1957-01-01 00:00:00.000000', + 60, + 286, + 30000, + 15 + ), + ( + 200086, + 200085, + 2844, + '1957-01-01 00:00:00.000000', + 60, + 295, + 30000, + 15 + ), + ( + 200087, + 200086, + 2904, + '1964-01-01 00:00:00.000000', + 500, + 185, + 30000, + 6 + ), + ( + 200088, + 200087, + 2905, + '1964-01-01 00:00:00.000000', + 250, + 197, + 30000, + 6 + ), + ( + 200089, + 200094, + 2902, + '1964-01-01 00:00:00.000000', + 250, + 244, + 30000, + 6 + ), + ( + 200090, + 200093, + 2903, + '1964-01-01 00:00:00.000000', + 125, + 260, + 30000, + 6 + ), + ( + 200091, + 200088, + 2906, + '1964-01-01 00:00:00.000000', + 250, + 210, + 30000, + 6 + ), + ( + 200092, + 200089, + 2907, + '1964-01-01 00:00:00.000000', + 125, + 278, + 30000, + 6 + ), + ( + 200093, + 200090, + 2908, + '1964-01-01 00:00:00.000000', + 125, + 327, + 30000, + 6 + ), + ( + 200094, + 200091, + 2909, + '1964-01-01 00:00:00.000000', + 60, + 349, + 30000, + 6 + ), + ( + 200095, + 200092, + 2910, + '1964-01-01 00:00:00.000000', + 60, + 385, + 30000, + 6 + ), + ( + 200096, + 200095, + 2900, + '1964-01-01 00:00:00.000000', + 250, + 181, + 30000, + 6 + ), + ( + 200097, + 200096, + 2901, + '1964-01-01 00:00:00.000000', + 250, + 205, + 30000, + 6 + ), + ( + 200098, + 200112, + 2955, + '1965-01-01 00:00:00.000000', + 250, + 204, + 30000, + 21 + ), + ( + 200099, + 200101, + 2946, + '1965-01-01 00:00:00.000000', + 500, + 244, + 30000, + 4 + ), + ( + 200100, + 200097, + 2941, + '1965-01-01 00:00:00.000000', + 250, + 260, + 30000, + 4 + ), + ( + 200101, + 200110, + 2954, + '1965-01-01 00:00:00.000000', + 125, + 260, + 30000, + 21 + ), + ( + 200102, + 200102, + 2947, + '1965-01-01 00:00:00.000000', + 125, + 269, + 30000, + 4 + ), + ( + 200103, + 200111, + 2956, + '1965-01-01 00:00:00.000000', + 125, + 297, + 30000, + 21 + ), + ( + 200104, + 200103, + 2948, + '1965-01-01 00:00:00.000000', + 60, + 328, + 30000, + 4 + ), + ( + 200105, + 200098, + 2942, + '1965-01-01 00:00:00.000000', + 60, + 350, + 30000, + 4 + ), + ( + 200106, + 200121, + 2965, + '1965-01-01 00:00:00.000000', + 250, + 54, + 30000, + 21 + ), + ( + 200107, + 200120, + 2964, + '1965-01-01 00:00:00.000000', + 500, + 71, + 30000, + 21 + ), + ( + 200108, + 200117, + 2961, + '1965-01-01 00:00:00.000000', + 125, + 139, + 30000, + 21 + ), + ( + 200109, + 200107, + 2953, + '1965-01-01 00:00:00.000000', + 250, + 153, + 30000, + 4 + ), + ( + 200110, + 200116, + 2960, + '1965-01-01 00:00:00.000000', + 250, + 114, + 30000, + 21 + ), + ( + 200111, + 200108, + 2952, + '1965-01-01 00:00:00.000000', + 250, + 114, + 30000, + 4 + ), + ( + 200112, + 200118, + 2962, + '1965-01-01 00:00:00.000000', + 250, + 114, + 30000, + 21 + ), + ( + 200113, + 200119, + 2963, + '1965-01-01 00:00:00.000000', + 125, + 139, + 30000, + 21 + ), + ( + 200114, + 200106, + 2951, + '1965-01-01 00:00:00.000000', + 250, + 114, + 30000, + 4 + ), + ( + 200115, + 200115, + 2959, + '1965-01-01 00:00:00.000000', + 500, + 181, + 30000, + 21 + ), + ( + 200116, + 200100, + 2944, + '1965-01-01 00:00:00.000000', + 250, + 181, + 30000, + 4 + ), + ( + 200117, + 200113, + 2957, + '1965-01-01 00:00:00.000000', + 250, + 193, + 30000, + 21 + ), + ( + 200118, + 200104, + 2949, + '1965-01-01 00:00:00.000000', + 250, + 161, + 30000, + 4 + ), + ( + 200119, + 200114, + 2958, + '1965-01-01 00:00:00.000000', + 125, + 166, + 30000, + 21 + ), + ( + 200120, + 200109, + 2945, + '1965-01-01 00:00:00.000000', + 125, + 212, + 30000, + 4 + ), + ( + 200121, + 200099, + 2943, + '1965-01-01 00:00:00.000000', + 125, + 226, + 30000, + 4 + ), + ( + 200122, + 200105, + 2950, + '1965-01-01 00:00:00.000000', + 60, + 195, + 30000, + 4 + ), + ( + 200123, + 200132, + 3059, + '1966-01-01 00:00:00.000000', + 250, + 64, + 30000, + 2 + ), + ( + 200124, + 200122, + 3050, + '1966-01-01 00:00:00.000000', + 250, + 126, + 30000, + 2 + ), + ( + 200125, + 200130, + 3049, + '1966-01-01 00:00:00.000000', + 500, + 156, + 30000, + 2 + ), + ( + 200126, + 200131, + 3048, + '1966-01-01 00:00:00.000000', + 125, + 278, + 30000, + 2 + ), + ( + 200127, + 200133, + 3055, + '1966-01-01 00:00:00.000000', + 500, + 277, + 30000, + 2 + ), + ( + 200128, + 200134, + 3056, + '1966-01-01 00:00:00.000000', + 125, + 385, + 30000, + 2 + ), + ( + 200129, + 200135, + 3057, + '1966-01-01 00:00:00.000000', + 60, + 455, + 30000, + 2 + ), + ( + 200130, + 200136, + 3058, + '1966-01-01 00:00:00.000000', + 0, + 587, + 30000, + 2 + ), + ( + 200131, + 200124, + 3052, + '1966-01-01 00:00:00.000000', + 500, + 114, + 30000, + 2 + ), + ( + 200132, + 200126, + 3054, + '1966-01-01 00:00:00.000000', + 250, + 114, + 30000, + 2 + ), + ( + 200133, + 200123, + 3051, + '1966-01-01 00:00:00.000000', + 250, + 114, + 30000, + 2 + ), + ( + 200134, + 200125, + 3053, + '1966-01-01 00:00:00.000000', + 125, + 126, + 30000, + 2 + ), + ( + 200135, + 200127, + 3045, + '1966-01-01 00:00:00.000000', + 250, + 161, + 30000, + 2 + ), + ( + 200136, + 200128, + 3046, + '1966-01-01 00:00:00.000000', + 125, + 183, + 30000, + 2 + ), + ( + 200137, + 200129, + 3047, + '1966-01-01 00:00:00.000000', + 60, + 236, + 30000, + 2 + ), + ( + 200138, + 200147, + 3096, + '1966-01-01 00:00:00.000000', + 500, + 252, + 30000, + 13 + ), + ( + 200139, + 200148, + 3097, + '1966-01-01 00:00:00.000000', + 125, + 297, + 30000, + 13 + ), + ( + 200140, + 200149, + 3098, + '1966-01-01 00:00:00.000000', + 125, + 350, + 30000, + 13 + ), + ( + 200141, + 200150, + 3099, + '1966-01-01 00:00:00.000000', + 60, + 414, + 30000, + 13 + ), + ( + 200142, + 200151, + 3100, + '1966-01-01 00:00:00.000000', + 0, + 489, + 30000, + 13 + ), + ( + 200143, + 200137, + 3090, + '1966-01-01 00:00:00.000000', + 500, + 114, + 30000, + 13 + ), + ( + 200144, + 200140, + 3086, + '1966-01-01 00:00:00.000000', + 500, + 114, + 30000, + 13 + ), + ( + 200145, + 200138, + 3089, + '1966-01-01 00:00:00.000000', + 250, + 114, + 30000, + 13 + ), + ( + 200146, + 200141, + 3087, + '1966-01-01 00:00:00.000000', + 125, + 114, + 30000, + 13 + ), + ( + 200147, + 200139, + 3088, + '1966-01-01 00:00:00.000000', + 60, + 139, + 30000, + 13 + ), + ( + 200148, + 200142, + 3091, + '1966-01-01 00:00:00.000000', + 500, + 151, + 30000, + 13 + ), + ( + 200149, + 200145, + 3092, + '1966-01-01 00:00:00.000000', + 500, + 172, + 30000, + 13 + ), + ( + 200150, + 200143, + 3093, + '1966-01-01 00:00:00.000000', + 250, + 195, + 30000, + 13 + ), + ( + 200151, + 200144, + 3094, + '1966-01-01 00:00:00.000000', + 125, + 275, + 30000, + 13 + ), + ( + 200152, + 200146, + 3095, + '1966-01-01 00:00:00.000000', + 60, + 314, + 30000, + 13 + ), + ( + 200153, + 200161, + 3127, + '1966-01-01 00:00:00.000000', + 500, + 252, + 30000, + 5 + ), + ( + 200154, + 200162, + 3128, + '1966-01-01 00:00:00.000000', + 250, + 385, + 30000, + 5 + ), + ( + 200155, + 200163, + 3129, + '1966-01-01 00:00:00.000000', + 125, + 455, + 30000, + 5 + ), + ( + 200156, + 200164, + 3130, + '1966-01-01 00:00:00.000000', + 0, + 587, + 30000, + 5 + ), + ( + 200157, + 200152, + 3118, + '1966-01-01 00:00:00.000000', + 500, + 139, + 30000, + 5 + ), + ( + 200158, + 200153, + 3119, + '1966-01-01 00:00:00.000000', + 250, + 139, + 30000, + 5 + ), + ( + 200159, + 200154, + 3120, + '1966-01-01 00:00:00.000000', + 250, + 139, + 30000, + 5 + ), + ( + 200160, + 200155, + 3121, + '1966-01-01 00:00:00.000000', + 125, + 153, + 30000, + 5 + ), + ( + 200161, + 200156, + 3122, + '1966-01-01 00:00:00.000000', + 125, + 153, + 30000, + 5 + ), + ( + 200162, + 200157, + 3123, + '1966-01-01 00:00:00.000000', + 500, + 205, + 30000, + 5 + ), + ( + 200163, + 200158, + 3124, + '1966-01-01 00:00:00.000000', + 250, + 226, + 30000, + 5 + ), + ( + 200164, + 200159, + 3125, + '1966-01-01 00:00:00.000000', + 150, + 293, + 30000, + 5 + ), + ( + 200165, + 200160, + 3126, + '1966-01-01 00:00:00.000000', + 60, + 376, + 30000, + 5 + ), + ( + 200166, + 200175, + 3486, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 3 + ), + ( + 200167, + 200176, + 3488, + '1967-01-01 00:00:00.000000', + 125, + 350, + 30000, + 3 + ), + ( + 200168, + 200177, + 3489, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 3 + ), + ( + 200169, + 200177, + 3490, + '1967-01-01 00:00:00.000000', + 1, + 455, + 30000, + 3 + ), + ( + 200170, + 200178, + 3490, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 3 + ), + ( + 200171, + 200167, + 3478, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 3 + ), + ( + 200172, + 200165, + 3476, + '1967-01-01 00:00:00.000000', + 250, + 139, + 30000, + 3 + ), + ( + 200173, + 200168, + 3479, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 3 + ), + ( + 200174, + 200169, + 3480, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 3 + ), + ( + 200175, + 200166, + 3477, + '1967-01-01 00:00:00.000000', + 250, + 139, + 30000, + 3 + ), + ( + 200176, + 200170, + 3481, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 3 + ), + ( + 200177, + 200171, + 3482, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 3 + ), + ( + 200178, + 200172, + 3483, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 3 + ), + ( + 200179, + 200173, + 3484, + '1967-01-01 00:00:00.000000', + 125, + 293, + 30000, + 3 + ), + ( + 200180, + 200174, + 3485, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 3 + ), + ( + 200181, + 200183, + 3500, + '1967-01-01 00:00:00.000000', + 250, + 252, + 30000, + 1 + ), + ( + 200182, + 200184, + 3501, + '1967-01-01 00:00:00.000000', + 125, + 385, + 30000, + 1 + ), + ( + 200183, + 200185, + 3502, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 1 + ), + ( + 200184, + 200178, + 3503, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 1 + ), + ( + 200185, + 200189, + 3493, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 1 + ), + ( + 200186, + 200187, + 3491, + '1967-01-01 00:00:00.000000', + 250, + 139, + 30000, + 1 + ), + ( + 200187, + 200190, + 3494, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 1 + ), + ( + 200188, + 200188, + 3492, + '1967-01-01 00:00:00.000000', + 125, + 153, + 30000, + 1 + ), + ( + 200189, + 200191, + 3495, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 1 + ), + ( + 200190, + 200179, + 3496, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 1 + ), + ( + 200191, + 200180, + 3497, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 1 + ), + ( + 200192, + 200181, + 3498, + '1967-01-01 00:00:00.000000', + 125, + 266, + 30000, + 1 + ), + ( + 200193, + 200182, + 3499, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 1 + ), + ( + 200194, + 200201, + 3513, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 12 + ), + ( + 200195, + 200202, + 3514, + '1967-01-01 00:00:00.000000', + 125, + 350, + 30000, + 12 + ), + ( + 200196, + 200203, + 3515, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 12 + ), + ( + 200197, + 200204, + 3516, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 12 + ), + ( + 200198, + 200194, + 3506, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 12 + ), + ( + 200199, + 200192, + 3504, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 12 + ), + ( + 200200, + 200195, + 3507, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 12 + ), + ( + 200201, + 200193, + 3505, + '1967-01-01 00:00:00.000000', + 125, + 153, + 30000, + 12 + ), + ( + 200202, + 200196, + 3508, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 12 + ), + ( + 200203, + 200197, + 3509, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 12 + ), + ( + 200204, + 200198, + 3510, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 12 + ), + ( + 200205, + 200199, + 3511, + '1967-01-01 00:00:00.000000', + 125, + 266, + 30000, + 12 + ), + ( + 200206, + 200200, + 3512, + '1967-01-01 00:00:00.000000', + 60, + 345, + 30000, + 12 + ), + ( + 200207, + 200215, + 3527, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 14 + ), + ( + 200208, + 200216, + 3528, + '1967-01-01 00:00:00.000000', + 250, + 297, + 30000, + 14 + ), + ( + 200209, + 200217, + 3529, + '1967-01-01 00:00:00.000000', + 125, + 350, + 30000, + 14 + ), + ( + 200210, + 200218, + 3530, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 14 + ), + ( + 200211, + 200219, + 3531, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 14 + ), + ( + 200212, + 200207, + 3519, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 14 + ), + ( + 200213, + 200205, + 3517, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 14 + ), + ( + 200214, + 200208, + 3520, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 14 + ), + ( + 200215, + 200206, + 3518, + '1967-01-01 00:00:00.000000', + 125, + 153, + 30000, + 14 + ), + ( + 200216, + 200209, + 3521, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 14 + ), + ( + 200217, + 200210, + 3522, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 14 + ), + ( + 200218, + 200211, + 3523, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 14 + ), + ( + 200219, + 200212, + 3524, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 14 + ), + ( + 200220, + 200213, + 3525, + '1967-01-01 00:00:00.000000', + 125, + 266, + 30000, + 14 + ), + ( + 200221, + 200214, + 3526, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 14 + ), + ( + 200222, + 200228, + 3540, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 19 + ), + ( + 200223, + 200229, + 3541, + '1967-01-01 00:00:00.000000', + 125, + 297, + 30000, + 19 + ), + ( + 200224, + 200230, + 3542, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 19 + ), + ( + 200225, + 200221, + 3533, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 19 + ), + ( + 200226, + 200220, + 3532, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 19 + ), + ( + 200227, + 200141, + 3534, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 19 + ), + ( + 200228, + 200223, + 3535, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 19 + ), + ( + 200229, + 200224, + 3536, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 19 + ), + ( + 200230, + 200225, + 3537, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 19 + ), + ( + 200231, + 200226, + 3538, + '1967-01-01 00:00:00.000000', + 125, + 266, + 30000, + 19 + ), + ( + 200232, + 200227, + 3539, + '1967-01-01 00:00:00.000000', + 60, + 345, + 30000, + 19 + ), + ( + 200233, + 200236, + 3548, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 9 + ), + ( + 200234, + 200237, + 3549, + '1967-01-01 00:00:00.000000', + 250, + 297, + 30000, + 9 + ), + ( + 200235, + 200238, + 3550, + '1967-01-01 00:00:00.000000', + 125, + 350, + 30000, + 9 + ), + ( + 200236, + 200239, + 3551, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 9 + ), + ( + 200237, + 200240, + 3552, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 9 + ), + ( + 200238, + 200231, + 3543, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 9 + ), + ( + 200239, + 200234, + 3547, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 9 + ), + ( + 200240, + 200232, + 3544, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 9 + ), + ( + 200241, + 200235, + 3546, + '1967-01-01 00:00:00.000000', + 250, + 153, + 30000, + 9 + ), + ( + 200242, + 200233, + 3545, + '1967-01-01 00:00:00.000000', + 125, + 114, + 30000, + 9 + ), + ( + 200243, + 200241, + 3553, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 9 + ), + ( + 200244, + 200242, + 3554, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 9 + ), + ( + 200245, + 200243, + 3555, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 9 + ), + ( + 200246, + 200244, + 3556, + '1967-01-01 00:00:00.000000', + 125, + 293, + 30000, + 9 + ), + ( + 200247, + 200245, + 3557, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 9 + ), + ( + 200248, + 200251, + 3563, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 18 + ), + ( + 200249, + 200252, + 3564, + '1967-01-01 00:00:00.000000', + 250, + 297, + 30000, + 18 + ), + ( + 200250, + 200253, + 3565, + '1967-01-01 00:00:00.000000', + 150, + 385, + 30000, + 18 + ), + ( + 200251, + 200254, + 3566, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 18 + ), + ( + 200252, + 200255, + 3567, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 18 + ), + ( + 200253, + 200246, + 3558, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 18 + ), + ( + 200254, + 200249, + 3561, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 18 + ), + ( + 200255, + 200250, + 3562, + '1967-01-01 00:00:00.000000', + 250, + 153, + 30000, + 18 + ), + ( + 200256, + 200247, + 3559, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 18 + ), + ( + 200257, + 200248, + 3560, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 18 + ), + ( + 200258, + 200256, + 3568, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 18 + ), + ( + 200259, + 200257, + 3569, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 18 + ), + ( + 200260, + 200258, + 3570, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 18 + ), + ( + 200261, + 200259, + 3571, + '1967-01-01 00:00:00.000000', + 125, + 293, + 30000, + 18 + ), + ( + 200262, + 200260, + 3572, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 18 + ), + ( + 200263, + 200266, + 3578, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 17 + ), + ( + 200264, + 200267, + 3579, + '1967-01-01 00:00:00.000000', + 250, + 297, + 30000, + 17 + ), + ( + 200265, + 200268, + 3580, + '1967-01-01 00:00:00.000000', + 150, + 385, + 30000, + 17 + ), + ( + 200266, + 200269, + 3581, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 17 + ), + ( + 200267, + 200270, + 3582, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 17 + ), + ( + 200268, + 200261, + 3573, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 17 + ), + ( + 200269, + 200264, + 3576, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 17 + ), + ( + 200270, + 200262, + 3574, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 17 + ), + ( + 200271, + 200265, + 3577, + '1967-01-01 00:00:00.000000', + 125, + 153, + 30000, + 17 + ), + ( + 200272, + 200263, + 3575, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 17 + ), + ( + 200273, + 200271, + 3583, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 17 + ), + ( + 200274, + 200272, + 3584, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 17 + ), + ( + 200275, + 200273, + 3585, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 17 + ), + ( + 200276, + 200274, + 3586, + '1967-01-01 00:00:00.000000', + 125, + 293, + 30000, + 17 + ), + ( + 200277, + 200275, + 3587, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 17 + ), + ( + 200278, + 200281, + 3593, + '1967-01-01 00:00:00.000000', + 500, + 252, + 30000, + 16 + ), + ( + 200279, + 200282, + 3594, + '1967-01-01 00:00:00.000000', + 250, + 297, + 30000, + 16 + ), + ( + 200280, + 200268, + 3595, + '1967-01-01 00:00:00.000000', + 125, + 385, + 30000, + 16 + ), + ( + 200281, + 200284, + 3596, + '1967-01-01 00:00:00.000000', + 125, + 455, + 30000, + 16 + ), + ( + 200282, + 200285, + 3597, + '1967-01-01 00:00:00.000000', + 0, + 538, + 30000, + 16 + ), + ( + 200283, + 200276, + 3588, + '1967-01-01 00:00:00.000000', + 500, + 114, + 30000, + 16 + ), + ( + 200284, + 200279, + 3591, + '1967-01-01 00:00:00.000000', + 500, + 153, + 30000, + 16 + ), + ( + 200285, + 200277, + 3589, + '1967-01-01 00:00:00.000000', + 250, + 114, + 30000, + 16 + ), + ( + 200286, + 200280, + 3592, + '1967-01-01 00:00:00.000000', + 125, + 153, + 30000, + 16 + ), + ( + 200287, + 200278, + 3590, + '1967-01-01 00:00:00.000000', + 125, + 126, + 30000, + 16 + ), + ( + 200288, + 200286, + 3598, + '1967-01-01 00:00:00.000000', + 500, + 181, + 30000, + 16 + ), + ( + 200289, + 200287, + 3599, + '1967-01-01 00:00:00.000000', + 500, + 193, + 30000, + 16 + ), + ( + 200290, + 200288, + 3600, + '1967-01-01 00:00:00.000000', + 250, + 226, + 30000, + 16 + ), + ( + 200291, + 200289, + 3601, + '1967-01-01 00:00:00.000000', + 125, + 293, + 30000, + 16 + ), + ( + 200292, + 200290, + 3602, + '1967-01-01 00:00:00.000000', + 125, + 345, + 30000, + 16 + ), + ( + 230001, + 230001, + 193, + '1954-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230002, + 230002, + 413, + '1940-01-01 00:00:00.000000', + 500, + 130, + 30000, + 0 + ), + ( + 230003, + 230003, + 414, + '1966-01-01 00:00:00.000000', + 250, + 552, + 30000, + 0 + ), + ( + 230004, + 230004, + 415, + '1958-01-01 00:00:00.000000', + 0, + 1062, + 30000, + 0 + ), + ( + 230005, + 230005, + 416, + '1971-01-01 00:00:00.000000', + 0, + 1049, + 30000, + 0 + ), + ( + 230006, + 230006, + 2686, + '1995-01-01 00:00:00.000000', + 125, + 651, + 30000, + 0 + ), + ( + 230007, + 230027, + 3728, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230008, + 230012, + 3714, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230009, + 230023, + 3724, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230010, + 230037, + 3739, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230011, + 230017, + 3719, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230012, + 230018, + 3720, + '1970-01-01 00:00:00.000000', + 150, + 1054, + 30000, + 0 + ), + ( + 230013, + 230026, + 3727, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230014, + 230016, + 3718, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230015, + 230036, + 3738, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230016, + 230011, + 3713, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230017, + 230022, + 3723, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230018, + 230030, + 3732, + '1970-01-01 00:00:00.000000', + 1000, + 169, + 30000, + 0 + ), + ( + 230019, + 230021, + 3722, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230020, + 230019, + 3731, + '1970-01-01 00:00:00.000000', + 1000, + 169, + 30000, + 0 + ), + ( + 230021, + 230029, + 3730, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230022, + 230028, + 3729, + '1970-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230023, + 230025, + 3726, + '1970-01-01 00:00:00.000000', + 250, + 552, + 30000, + 0 + ), + ( + 230024, + 230035, + 3737, + '1970-01-01 00:00:00.000000', + 100, + 1054, + 30000, + 0 + ), + ( + 230025, + 230034, + 3736, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230026, + 230014, + 3716, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230027, + 230008, + 3706, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230028, + 230015, + 3717, + '1970-01-01 00:00:00.000000', + 250, + 1054, + 30000, + 0 + ), + ( + 230029, + 230033, + 3735, + '1970-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230030, + 230013, + 3715, + '1970-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230031, + 230007, + 3705, + '1970-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230032, + 230024, + 3725, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230033, + 230020, + 3721, + '1970-01-01 00:00:00.000000', + 1000, + 242, + 30000, + 0 + ), + ( + 230034, + 230010, + 3712, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230035, + 230009, + 3711, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 230036, + 230032, + 3734, + '1970-01-01 00:00:00.000000', + 500, + 552, + 30000, + 0 + ), + ( + 230037, + 230031, + 3733, + '1970-01-01 00:00:00.000000', + 750, + 242, + 30000, + 0 + ), + ( + 240001, + 240001, + 194, + '1949-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 240002, + 240002, + 410, + '1969-01-01 00:00:00.000000', + 60, + 1224, + 30000, + 0 + ), + ( + 240003, + 240003, + 411, + '1960-01-01 00:00:00.000000', + 500, + 124, + 30000, + 0 + ), + ( + 240004, + 240004, + 412, + '1960-01-01 00:00:00.000000', + 60, + 624, + 30000, + 0 + ), + ( + 240005, + 240005, + 453, + '1960-01-01 00:00:00.000000', + 250, + 673, + 30000, + 0 + ), + ( + 240006, + 240006, + 454, + '1966-01-01 00:00:00.000000', + 125, + 772, + 30000, + 0 + ), + ( + 240007, + 240008, + 1467, + '1995-01-01 00:00:00.000000', + 0, + 1471, + 30000, + 0 + ), + ( + 240008, + 240007, + 1466, + '1995-01-01 00:00:00.000000', + 60, + 821, + 30000, + 0 + ), + ( + 240009, + 240011, + 2694, + '1995-01-01 00:00:00.000000', + 30, + 1471, + 30000, + 0 + ), + ( + 240010, + 240010, + 2695, + '1995-01-01 00:00:00.000000', + 60, + 821, + 30000, + 0 + ), + ( + 240011, + 240009, + 2696, + '1995-01-01 00:00:00.000000', + 60, + 968, + 30000, + 0 + ), + ( + 240012, + 240027, + 3695, + '1970-01-01 00:00:00.000000', + 500, + 1018, + 30000, + 0 + ), + ( + 240013, + 240033, + 3701, + '1970-01-01 00:00:00.000000', + 500, + 1018, + 30000, + 0 + ), + ( + 240014, + 240015, + 3683, + '1970-01-01 00:00:00.000000', + 500, + 1018, + 30000, + 0 + ), + ( + 240015, + 240021, + 3689, + '1970-01-01 00:00:00.000000', + 500, + 1018, + 30000, + 0 + ), + ( + 240016, + 240023, + 3691, + '1970-01-01 00:00:00.000000', + 150, + 722, + 30000, + 0 + ), + ( + 240017, + 240023, + 3697, + '1970-01-01 00:00:00.000000', + 150, + 722, + 30000, + 0 + ), + ( + 240018, + 240017, + 3685, + '1970-01-01 00:00:00.000000', + 150, + 722, + 30000, + 0 + ), + ( + 240019, + 240025, + 3693, + '1970-01-01 00:00:00.000000', + 500, + 1116, + 30000, + 0 + ), + ( + 240020, + 240019, + 3687, + '1970-01-01 00:00:00.000000', + 500, + 1116, + 30000, + 0 + ), + ( + 240021, + 240013, + 3681, + '1970-01-01 00:00:00.000000', + 500, + 1116, + 30000, + 0 + ), + ( + 240022, + 240031, + 3699, + '1970-01-01 00:00:00.000000', + 500, + 1116, + 30000, + 0 + ), + ( + 240023, + 240014, + 3682, + '1970-01-01 00:00:00.000000', + 500, + 321, + 30000, + 0 + ), + ( + 240024, + 240032, + 3700, + '1970-01-01 00:00:00.000000', + 500, + 321, + 30000, + 0 + ), + ( + 240025, + 240026, + 3694, + '1970-01-01 00:00:00.000000', + 500, + 321, + 30000, + 0 + ), + ( + 240026, + 240020, + 3688, + '1970-01-01 00:00:00.000000', + 500, + 321, + 30000, + 0 + ), + ( + 240027, + 240016, + 3684, + '1970-01-01 00:00:00.000000', + 250, + 177, + 30000, + 0 + ), + ( + 240028, + 240022, + 3690, + '1970-01-01 00:00:00.000000', + 250, + 177, + 30000, + 0 + ), + ( + 240029, + 240028, + 3696, + '1970-01-01 00:00:00.000000', + 250, + 177, + 30000, + 0 + ), + ( + 240030, + 240024, + 3692, + '1970-01-01 00:00:00.000000', + 1000, + 419, + 30000, + 0 + ), + ( + 240031, + 240030, + 3698, + '1970-01-01 00:00:00.000000', + 1000, + 419, + 30000, + 0 + ), + ( + 240032, + 240012, + 3680, + '1970-01-01 00:00:00.000000', + 1000, + 419, + 30000, + 0 + ), + ( + 240033, + 240018, + 3686, + '1970-01-01 00:00:00.000000', + 1000, + 419, + 30000, + 0 + ), + ( + 250001, + 250001, + 1444, + '1950-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250002, + 250002, + 165, + '1940-01-01 00:00:00.000000', + 500, + 174, + 30000, + 0 + ), + ( + 250003, + 250003, + 1043, + '1940-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250004, + 250004, + 451, + '1970-01-01 00:00:00.000000', + 30, + 474, + 30000, + 0 + ), + ( + 250005, + 250005, + 467, + '1969-01-01 00:00:00.000000', + 60, + 977, + 30000, + 0 + ), + ( + 250006, + 250006, + 1739, + '1958-01-01 00:00:00.000000', + 125, + 474, + 30000, + 0 + ), + ( + 250007, + 250007, + 468, + '1958-01-01 00:00:00.000000', + 60, + 974, + 30000, + 0 + ), + ( + 250008, + 250008, + 469, + '1965-01-01 00:00:00.000000', + 60, + 480, + 30000, + 0 + ), + ( + 250009, + 250030, + 3759, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250010, + 250029, + 3758, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250011, + 250011, + 3743, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250012, + 250014, + 3746, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250013, + 250028, + 3761, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250014, + 250020, + 3750, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250015, + 250027, + 3760, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250016, + 250019, + 3749, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250017, + 250015, + 3742, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250018, + 250013, + 3745, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250019, + 250026, + 3757, + '1970-01-01 00:00:00.000000', + 500, + 174, + 30000, + 0 + ), + ( + 250020, + 250022, + 3753, + '1970-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250021, + 250016, + 3752, + '1970-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250022, + 250021, + 3751, + '1970-01-01 00:00:00.000000', + 750, + 179, + 30000, + 0 + ), + ( + 250023, + 250018, + 3748, + '1970-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 250024, + 250024, + 3755, + '1970-01-01 00:00:00.000000', + 100, + 1367, + 30000, + 0 + ), + ( + 250025, + 250010, + 3741, + '1970-01-01 00:00:00.000000', + 500, + 670, + 30000, + 0 + ), + ( + 250026, + 250009, + 3740, + '1970-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250027, + 250012, + 3744, + '1970-01-01 00:00:00.000000', + 1000, + 174, + 30000, + 0 + ), + ( + 250028, + 250017, + 3747, + '1970-01-01 00:00:00.000000', + 500, + 179, + 30000, + 0 + ), + ( + 250029, + 250025, + 3756, + '1970-01-01 00:00:00.000000', + 500, + 174, + 30000, + 0 + ), + ( + 250030, + 250023, + 3754, + '1970-01-01 00:00:00.000000', + 750, + 179, + 30000, + 0 + ), + ( + 280001, + 280001, + 108, + '1968-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 3 + ), + ( + 280002, + 280002, + 109, + '1965-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 5 + ), + ( + 280003, + 280003, + 110, + '1958-01-01 00:00:00.000000', + 1000, + 179, + 30000, + 2 + ), + ( + 280004, + 280004, + 438, + '1970-01-01 00:00:00.000000', + 125, + 500, + 30000, + 17 + ), + ( + 280005, + 280006, + 437, + '1964-01-01 00:00:00.000000', + 60, + 845, + 30000, + 19 + ), + ( + 280006, + 280005, + 436, + '1964-01-01 00:00:00.000000', + 125, + 447, + 30000, + 5 + ), + ( + 280007, + 280007, + 488, + '1999-01-01 00:00:00.000000', + 30, + 3431, + 30000, + 6 + ), + ( + 280008, + 280008, + 1288, + '1968-01-01 00:00:00.000000', + 125, + 456, + 30000, + 3 + ), + ( + 280009, + 280010, + 1671, + '1962-01-01 00:00:00.000000', + 60, + 845, + 30000, + 1 + ), + ( + 280010, + 280011, + 1684, + '1970-01-01 00:00:00.000000', + 125, + 516, + 30000, + 14 + ), + ( + 280011, + 280012, + 1685, + '1996-01-01 00:00:00.000000', + 30, + 2037, + 30000, + 5 + ), + ( + 280012, + 280009, + 1295, + '1965-01-01 00:00:00.000000', + 30, + 1811, + 30000, + 3 + ), + ( + 280013, + 280013, + 1935, + '1967-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 7 + ), + ( + 280014, + 280014, + 1936, + '1961-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 8 + ), + ( + 280015, + 280015, + 1937, + '1949-01-01 00:00:00.000000', + 500, + 403, + 30000, + 9 + ), + ( + 280016, + 280016, + 1938, + '1955-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 6 + ), + ( + 280017, + 280017, + 1939, + '1958-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 1 + ), + ( + 280018, + 280018, + 1940, + '1964-01-01 00:00:00.000000', + 1000, + 179, + 30000, + 4 + ), + ( + 280019, + 280019, + 1941, + '1932-01-01 00:00:00.000000', + 125, + 179, + 30000, + 10 + ), + ( + 280020, + 280020, + 1942, + '1965-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 12 + ), + ( + 280021, + 280021, + 1943, + '1968-01-01 00:00:00.000000', + 1000, + 179, + 30000, + 11 + ), + ( + 280022, + 280022, + 1944, + '1959-01-01 00:00:00.000000', + 1000, + 179, + 30000, + 14 + ), + ( + 280023, + 280023, + 1945, + '1955-01-01 00:00:00.000000', + 1000, + 149, + 30000, + 13 + ), + ( + 280024, + 280024, + 1946, + '1957-01-01 00:00:00.000000', + 125, + 179, + 30000, + 6 + ), + ( + 280025, + 280025, + 1947, + '1968-01-01 00:00:00.000000', + 125, + 456, + 30000, + 7 + ), + ( + 280026, + 280026, + 1948, + '1969-01-01 00:00:00.000000', + 60, + 1510, + 30000, + 7 + ), + ( + 280027, + 280027, + 1949, + '1970-01-01 00:00:00.000000', + 250, + 132, + 30000, + 12 + ), + ( + 280028, + 280028, + 1950, + '1967-01-01 00:00:00.000000', + 125, + 486, + 30000, + 13 + ), + ( + 280029, + 280029, + 1951, + '1959-01-01 00:00:00.000000', + 125, + 486, + 30000, + 13 + ), + ( + 280030, + 280030, + 1952, + '1957-01-01 00:00:00.000000', + 125, + 107, + 30000, + 15 + ), + ( + 280031, + 280031, + 1953, + '1968-01-01 00:00:00.000000', + 125, + 456, + 30000, + 3 + ), + ( + 280032, + 280032, + 1954, + '1969-01-01 00:00:00.000000', + 30, + 1509, + 30000, + 17 + ), + ( + 280033, + 280033, + 1955, + '1962-01-01 00:00:00.000000', + 60, + 1510, + 30000, + 1 + ), + ( + 280034, + 280034, + 1956, + '1967-01-01 00:00:00.000000', + 500, + 132, + 30000, + 1 + ), + ( + 280035, + 280035, + 1957, + '1964-01-01 00:00:00.000000', + 60, + 638, + 30000, + 1 + ), + ( + 280036, + 280036, + 1958, + '1964-01-01 00:00:00.000000', + 125, + 456, + 30000, + 1 + ), + ( + 280037, + 280037, + 1959, + '1970-01-01 00:00:00.000000', + 125, + 213, + 30000, + 2 + ), + ( + 280038, + 280038, + 2053, + '1970-01-01 00:00:00.000000', + 125, + 516, + 30000, + 6 + ), + ( + 280039, + 280039, + 2073, + '1959-01-01 00:00:00.000000', + 125, + 486, + 30000, + 13 + ), + ( + 280040, + 280008, + 2090, + '1961-01-01 00:00:00.000000', + 125, + 456, + 30000, + 3 + ), + ( + 280041, + 280040, + 2105, + '1969-01-01 00:00:00.000000', + 125, + 516, + 30000, + 4 + ), + ( + 280042, + 280041, + 2470, + '1964-01-01 00:00:00.000000', + 30, + 500, + 30000, + 18 + ), + ( + 280043, + 280042, + 2471, + '1964-01-01 00:00:00.000000', + 0, + 119, + 30000, + 18 + ), + ( + 280044, + 280043, + 2479, + '1940-01-01 00:00:00.000000', + 125, + 74, + 30000, + 20 + ), + ( + 280045, + 280044, + 2487, + '1953-01-01 00:00:00.000000', + 125, + 119, + 30000, + 21 + ), + ( + 280046, + 280045, + 2505, + '1970-01-01 00:00:00.000000', + 1000, + 149, + 30000, + 16 + ), + ( + 280047, + 280046, + 2519, + '1968-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 17 + ), + ( + 280048, + 280047, + 2520, + '1970-01-01 00:00:00.000000', + 30, + 456, + 30000, + 17 + ), + ( + 280049, + 280048, + 2525, + '1964-01-01 00:00:00.000000', + 125, + 492, + 30000, + 4 + ), + ( + 280050, + 280049, + 2535, + '1954-01-01 00:00:00.000000', + 1000, + 107, + 30000, + 15 + ), + ( + 280051, + 280050, + 2548, + '1958-01-01 00:00:00.000000', + 1000, + 119, + 30000, + 19 + ), + ( + 280052, + 280051, + 2557, + '1959-01-01 00:00:00.000000', + 125, + 456, + 30000, + 19 + ), + ( + 280053, + 280052, + 2558, + '1970-01-01 00:00:00.000000', + 125, + 456, + 30000, + 16 + ), + ( + 280054, + 280053, + 2579, + '1955-02-15 00:00:00.000000', + 60, + 486, + 30000, + 21 + ), + ( + 280055, + 280054, + 2580, + '1947-01-17 00:00:00.000000', + 60, + 411, + 30000, + 20 + ), + ( + 280056, + 280055, + 2581, + '1969-02-22 00:00:00.000000', + 500, + 617, + 30000, + 8 + ), + ( + 280057, + 280056, + 2582, + '1969-02-22 00:00:00.000000', + 30, + 1931, + 30000, + 8 + ), + ( + 280058, + 280057, + 2583, + '1959-03-21 00:00:00.000000', + 250, + 575, + 30000, + 9 + ), + ( + 280059, + 280058, + 2584, + '1940-02-16 00:00:00.000000', + 250, + 516, + 30000, + 10 + ), + ( + 280060, + 280059, + 2585, + '1969-04-11 00:00:00.000000', + 250, + 516, + 30000, + 11 + ), + ( + 280061, + 280061, + 2668, + '1995-01-01 00:00:00.000000', + 30, + 2052, + 30000, + 19 + ), + ( + 280062, + 280062, + 2669, + '1995-01-01 00:00:00.000000', + 30, + 2082, + 30000, + 17 + ), + ( + 280063, + 280060, + 2670, + '1995-01-01 00:00:00.000000', + 30, + 2052, + 30000, + 13 + ), + ( + 280064, + 280063, + 2757, + '1970-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 14 + ), + ( + 280065, + 280064, + 2758, + '1962-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 21 + ), + ( + 280066, + 280065, + 2759, + '1962-06-16 00:00:00.000000', + 30, + 1886, + 30000, + 20 + ), + ( + 280067, + 280066, + 2760, + '1962-06-16 00:00:00.000000', + 30, + 1886, + 30000, + 9 + ), + ( + 280068, + 280067, + 2761, + '1962-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 6 + ), + ( + 280069, + 280068, + 2762, + '1967-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 2 + ), + ( + 280070, + 280069, + 2763, + '1962-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 10 + ), + ( + 280071, + 280070, + 2764, + '1965-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 4 + ), + ( + 280072, + 280071, + 2765, + '1962-06-16 00:00:00.000000', + 30, + 1738, + 30000, + 15 + ), + ( + 280073, + 280072, + 2766, + '1971-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 16 + ), + ( + 280074, + 280073, + 2767, + '1970-06-16 00:00:00.000000', + 30, + 1931, + 30000, + 11 + ), + ( + 280075, + 280074, + 2768, + '1969-06-16 00:00:00.000000', + 30, + 1886, + 30000, + 12 + ), + ( + 280076, + 280075, + 2769, + '1967-06-16 00:00:00.000000', + 30, + 1886, + 30000, + 18 + ), + ( + 280077, + 280076, + 2818, + '1957-01-01 00:00:00.000000', + 500, + 410, + 30000, + 15 + ), + ( + 280078, + 280082, + 2824, + '1957-01-01 00:00:00.000000', + 125, + 439, + 30000, + 15 + ), + ( + 280079, + 280083, + 2825, + '1957-01-01 00:00:00.000000', + 125, + 828, + 30000, + 15 + ), + ( + 280080, + 280077, + 2819, + '1957-01-01 00:00:00.000000', + 500, + 403, + 30000, + 15 + ), + ( + 280081, + 280078, + 2820, + '1957-01-01 00:00:00.000000', + 125, + 774, + 30000, + 15 + ), + ( + 280082, + 280079, + 2821, + '1957-01-01 00:00:00.000000', + 60, + 1399, + 30000, + 15 + ), + ( + 280083, + 280080, + 2822, + '1957-01-01 00:00:00.000000', + 60, + 1538, + 30000, + 15 + ), + ( + 280084, + 280081, + 2823, + '1957-01-01 00:00:00.000000', + 30, + 2253, + 30000, + 15 + ), + ( + 280085, + 280084, + 2826, + '1957-01-01 00:00:00.000000', + 30, + 2299, + 30000, + 15 + ), + ( + 280086, + 280090, + 2898, + '1964-01-01 00:00:00.000000', + 30, + 2926, + 30000, + 6 + ), + ( + 280087, + 280089, + 2897, + '1964-01-01 00:00:00.000000', + 500, + 141, + 30000, + 6 + ), + ( + 280088, + 280088, + 2896, + '1964-01-01 00:00:00.000000', + 125, + 738, + 30000, + 6 + ), + ( + 280089, + 280087, + 2893, + '1964-01-01 00:00:00.000000', + 30, + 2434, + 30000, + 6 + ), + ( + 280090, + 280086, + 2894, + '1964-01-01 00:00:00.000000', + 30, + 2514, + 30000, + 6 + ), + ( + 280091, + 280091, + 2899, + '1964-01-01 00:00:00.000000', + 500, + 238, + 30000, + 6 + ), + ( + 280092, + 280085, + 2895, + '1964-01-01 00:00:00.000000', + 30, + 4342, + 30000, + 6 + ), + ( + 280093, + 280092, + 3026, + '1964-01-01 00:00:00.000000', + 500, + 964, + 30000, + 4 + ), + ( + 280094, + 280096, + 3030, + '1964-01-01 00:00:00.000000', + 250, + 755, + 30000, + 21 + ), + ( + 280095, + 280095, + 3031, + '1964-01-01 00:00:00.000000', + 250, + 527, + 30000, + 21 + ), + ( + 280096, + 280097, + 3029, + '1964-01-01 00:00:00.000000', + 60, + 3272, + 30000, + 21 + ), + ( + 280097, + 280094, + 3032, + '1964-01-01 00:00:00.000000', + 250, + 725, + 30000, + 4 + ), + ( + 280098, + 280098, + 3028, + '1964-01-01 00:00:00.000000', + 125, + 2979, + 30000, + 21 + ), + ( + 280099, + 280093, + 3027, + '1964-01-01 00:00:00.000000', + 60, + 6361, + 30000, + 4 + ), + ( + 280100, + 280099, + 3073, + '1966-01-01 00:00:00.000000', + 500, + 141, + 30000, + 2 + ), + ( + 280101, + 280100, + 3078, + '1966-01-01 00:00:00.000000', + 250, + 948, + 30000, + 2 + ), + ( + 280102, + 280104, + 3076, + '1966-01-01 00:00:00.000000', + 125, + 3054, + 30000, + 2 + ), + ( + 280103, + 280102, + 3074, + '1966-01-01 00:00:00.000000', + 250, + 274, + 30000, + 2 + ), + ( + 280104, + 280103, + 3075, + '1966-01-01 00:00:00.000000', + 250, + 785, + 30000, + 2 + ), + ( + 280105, + 280105, + 3077, + '1966-01-01 00:00:00.000000', + 0, + 4326, + 30000, + 2 + ), + ( + 280106, + 280101, + 3079, + '1966-01-01 00:00:00.000000', + 0, + 4924, + 30000, + 2 + ), + ( + 280107, + 280106, + 3109, + '1966-01-01 00:00:00.000000', + 500, + 205, + 30000, + 13 + ), + ( + 280108, + 280107, + 3110, + '1966-01-01 00:00:00.000000', + 250, + 284, + 30000, + 13 + ), + ( + 280109, + 280109, + 3112, + '1966-01-01 00:00:00.000000', + 0, + 4342, + 30000, + 13 + ), + ( + 280110, + 280108, + 3111, + '1966-01-01 00:00:00.000000', + 125, + 2660, + 30000, + 13 + ), + ( + 280111, + 280160, + 3238, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 1 + ), + ( + 280112, + 280153, + 3231, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 12 + ), + ( + 280113, + 280124, + 3202, + '1967-01-01 00:00:00.000000', + 500, + 74, + 30000, + 18 + ), + ( + 280114, + 280110, + 3188, + '1967-01-01 00:00:00.000000', + 500, + 77, + 30000, + 16 + ), + ( + 280115, + 280176, + 3254, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 5 + ), + ( + 280116, + 280131, + 3209, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 9 + ), + ( + 280117, + 280120, + 3201, + '1967-01-01 00:00:00.000000', + 500, + 74, + 30000, + 17 + ), + ( + 280118, + 280142, + 3223, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 19 + ), + ( + 280119, + 280168, + 3246, + '1967-01-01 00:00:00.000000', + 500, + 89, + 30000, + 3 + ), + ( + 280120, + 280146, + 3224, + '1967-01-01 00:00:00.000000', + 500, + 119, + 30000, + 14 + ), + ( + 280121, + 280169, + 3247, + '1967-01-01 00:00:00.000000', + 500, + 207, + 30000, + 3 + ), + ( + 280122, + 280177, + 3255, + '1967-01-01 00:00:00.000000', + 500, + 207, + 30000, + 5 + ), + ( + 280123, + 280132, + 3210, + '1967-01-01 00:00:00.000000', + 500, + 177, + 30000, + 9 + ), + ( + 280124, + 280125, + 3203, + '1967-01-01 00:00:00.000000', + 250, + 147, + 30000, + 18 + ), + ( + 280125, + 280154, + 3232, + '1967-01-01 00:00:00.000000', + 500, + 177, + 30000, + 12 + ), + ( + 280126, + 280147, + 3225, + '1967-01-01 00:00:00.000000', + 500, + 207, + 30000, + 14 + ), + ( + 280127, + 280111, + 3189, + '1967-01-01 00:00:00.000000', + 500, + 219, + 30000, + 16 + ), + ( + 280128, + 280161, + 3239, + '1967-01-01 00:00:00.000000', + 500, + 177, + 30000, + 1 + ), + ( + 280129, + 280129, + 3207, + '1967-01-01 00:00:00.000000', + 125, + 3563, + 30000, + 18 + ), + ( + 280130, + 280137, + 3215, + '1967-01-01 00:00:00.000000', + 250, + 749, + 30000, + 9 + ), + ( + 280131, + 280151, + 3229, + '1967-01-01 00:00:00.000000', + 125, + 2580, + 30000, + 14 + ), + ( + 280132, + 280158, + 3236, + '1967-01-01 00:00:00.000000', + 125, + 2580, + 30000, + 12 + ), + ( + 280133, + 280166, + 3244, + '1967-01-01 00:00:00.000000', + 125, + 2580, + 30000, + 1 + ), + ( + 280134, + 280148, + 3226, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 14 + ), + ( + 280135, + 280155, + 3233, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 12 + ), + ( + 280136, + 280112, + 3192, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 16 + ), + ( + 280137, + 280178, + 3256, + '1967-01-01 00:00:00.000000', + 250, + 700, + 30000, + 5 + ), + ( + 280138, + 280170, + 3248, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 3 + ), + ( + 280139, + 280121, + 3197, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 17 + ), + ( + 280140, + 280143, + 3222, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 19 + ), + ( + 280141, + 280162, + 3240, + '1967-01-01 00:00:00.000000', + 250, + 662, + 30000, + 1 + ), + ( + 280142, + 280133, + 3211, + '1967-01-01 00:00:00.000000', + 250, + 681, + 30000, + 9 + ), + ( + 280143, + 280171, + 3249, + '1967-01-01 00:00:00.000000', + 125, + 2454, + 30000, + 3 + ), + ( + 280144, + 280122, + 3196, + '1967-01-01 00:00:00.000000', + 125, + 2454, + 30000, + 17 + ), + ( + 280145, + 280163, + 3241, + '1967-01-01 00:00:00.000000', + 125, + 2454, + 30000, + 1 + ), + ( + 280146, + 280179, + 3257, + '1967-01-01 00:00:00.000000', + 125, + 2424, + 30000, + 5 + ), + ( + 280147, + 280144, + 3221, + '1967-01-01 00:00:00.000000', + 125, + 2454, + 30000, + 19 + ), + ( + 280148, + 280128, + 3206, + '1967-01-01 00:00:00.000000', + 250, + 837, + 30000, + 18 + ), + ( + 280149, + 280159, + 3237, + '1967-01-01 00:00:00.000000', + 0, + 4294, + 30000, + 12 + ), + ( + 280150, + 280152, + 3230, + '1967-01-01 00:00:00.000000', + 0, + 4294, + 30000, + 14 + ), + ( + 280151, + 280167, + 3245, + '1967-01-01 00:00:00.000000', + 0, + 4294, + 30000, + 1 + ), + ( + 280152, + 280136, + 3214, + '1967-01-01 00:00:00.000000', + 0, + 5421, + 30000, + 9 + ), + ( + 280153, + 280139, + 3217, + '1967-01-01 00:00:00.000000', + 125, + 1886, + 30000, + 19 + ), + ( + 280154, + 280182, + 3260, + '1967-01-01 00:00:00.000000', + 125, + 1886, + 30000, + 5 + ), + ( + 280155, + 280165, + 3243, + '1967-01-01 00:00:00.000000', + 250, + 580, + 30000, + 1 + ), + ( + 280156, + 280150, + 3228, + '1967-01-01 00:00:00.000000', + 250, + 580, + 30000, + 14 + ), + ( + 280157, + 280157, + 3235, + '1967-01-01 00:00:00.000000', + 250, + 580, + 30000, + 12 + ), + ( + 280158, + 280127, + 3205, + '1967-01-01 00:00:00.000000', + 250, + 123, + 30000, + 18 + ), + ( + 280159, + 280135, + 3213, + '1967-01-01 00:00:00.000000', + 125, + 3058, + 30000, + 9 + ), + ( + 280160, + 280113, + 3191, + '1967-01-01 00:00:00.000000', + 250, + 711, + 30000, + 16 + ), + ( + 280161, + 280173, + 3251, + '1967-01-01 00:00:00.000000', + 250, + 744, + 30000, + 3 + ), + ( + 280162, + 280119, + 3200, + '1967-01-01 00:00:00.000000', + 250, + 711, + 30000, + 17 + ), + ( + 280163, + 280183, + 3261, + '1967-01-01 00:00:00.000000', + 60, + 3058, + 30000, + 5 + ), + ( + 280164, + 280140, + 3218, + '1967-01-01 00:00:00.000000', + 60, + 3058, + 30000, + 19 + ), + ( + 280165, + 280181, + 3259, + '1967-01-01 00:00:00.000000', + 250, + 563, + 30000, + 5 + ), + ( + 280166, + 280138, + 3216, + '1967-01-01 00:00:00.000000', + 250, + 563, + 30000, + 19 + ), + ( + 280167, + 280174, + 3252, + '1967-01-01 00:00:00.000000', + 125, + 2890, + 30000, + 3 + ), + ( + 280168, + 280117, + 3199, + '1967-01-01 00:00:00.000000', + 125, + 2837, + 30000, + 17 + ), + ( + 280169, + 280116, + 3193, + '1967-01-01 00:00:00.000000', + 125, + 2837, + 30000, + 16 + ), + ( + 280170, + 280130, + 3208, + '1967-01-01 00:00:00.000000', + 0, + 6897, + 30000, + 18 + ), + ( + 280171, + 280149, + 3227, + '1967-01-01 00:00:00.000000', + 0, + 2837, + 30000, + 14 + ), + ( + 280172, + 280156, + 3234, + '1967-01-01 00:00:00.000000', + 0, + 2837, + 30000, + 12 + ), + ( + 280173, + 280145, + 3220, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 19 + ), + ( + 280174, + 280180, + 3258, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 5 + ), + ( + 280175, + 280164, + 3242, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 1 + ), + ( + 280176, + 280114, + 3190, + '1967-01-01 00:00:00.000000', + 0, + 2837, + 30000, + 16 + ), + ( + 280177, + 280134, + 3212, + '1967-01-01 00:00:00.000000', + 0, + 2837, + 30000, + 9 + ), + ( + 280178, + 280172, + 3250, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 3 + ), + ( + 280179, + 280123, + 3195, + '1967-01-01 00:00:00.000000', + 0, + 4740, + 30000, + 17 + ), + ( + 280180, + 280126, + 3204, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 18 + ), + ( + 280181, + 280115, + 3194, + '1967-01-01 00:00:00.000000', + 0, + 5079, + 30000, + 16 + ), + ( + 280182, + 280118, + 3198, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 17 + ), + ( + 280183, + 280175, + 3253, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 3 + ), + ( + 280184, + 280184, + 3262, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 5 + ), + ( + 280185, + 280141, + 3219, + '1967-01-01 00:00:00.000000', + 0, + 4723, + 30000, + 19 + ), + ( + 290001, + 290001, + 111, + '1999-01-01 00:00:00.000000', + 1000, + 44, + 30000, + 0 + ), + ( + 290002, + 290002, + 112, + '1999-01-01 00:00:00.000000', + 1000, + 91, + 30000, + 0 + ), + ( + 290003, + 290003, + 113, + '1999-01-01 00:00:00.000000', + 1000, + 37, + 30000, + 0 + ), + ( + 290004, + 290004, + 114, + '1999-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 0 + ), + ( + 290005, + 290007, + 489, + '1999-01-01 00:00:00.000000', + 0, + 1101, + 30000, + 0 + ), + ( + 290006, + 290006, + 1737, + '1999-01-01 00:00:00.000000', + 60, + 433, + 30000, + 0 + ), + ( + 290007, + 290005, + 1736, + '1999-01-01 00:00:00.000000', + 125, + 164, + 30000, + 0 + ), + ( + 290008, + 290008, + 2671, + '1995-01-01 00:00:00.000000', + 30, + 543, + 30000, + 0 + ), + ( + 290009, + 290009, + 2672, + '1975-01-01 00:00:00.000000', + 60, + 106, + 30000, + 0 + ), + ( + 290010, + 290029, + 3670, + '1970-01-01 00:00:00.000000', + 500, + 106, + 30000, + 0 + ), + ( + 290011, + 290034, + 3674, + '1970-01-01 00:00:00.000000', + 500, + 135, + 30000, + 0 + ), + ( + 290012, + 290024, + 3665, + '1970-01-01 00:00:00.000000', + 500, + 88, + 30000, + 0 + ), + ( + 290013, + 290030, + 3671, + '1970-01-01 00:00:00.000000', + 400, + 160, + 30000, + 0 + ), + ( + 290014, + 290035, + 3675, + '1970-01-01 00:00:00.000000', + 400, + 207, + 30000, + 0 + ), + ( + 290015, + 290018, + 3652, + '1970-01-01 00:00:00.000000', + 750, + 110, + 30000, + 0 + ), + ( + 290016, + 290010, + 3651, + '1970-01-01 00:00:00.000000', + 1000, + 37, + 30000, + 0 + ), + ( + 290017, + 290025, + 3666, + '1970-01-01 00:00:00.000000', + 400, + 131, + 30000, + 0 + ), + ( + 290018, + 290021, + 3659, + '1970-01-01 00:00:00.000000', + 500, + 136, + 30000, + 0 + ), + ( + 290019, + 290014, + 3658, + '1970-01-01 00:00:00.000000', + 1000, + 44, + 30000, + 0 + ), + ( + 290020, + 290036, + 3676, + '1970-01-01 00:00:00.000000', + 250, + 327, + 30000, + 0 + ), + ( + 290021, + 290019, + 3654, + '1970-01-01 00:00:00.000000', + 500, + 170, + 30000, + 0 + ), + ( + 290022, + 290011, + 3653, + '1970-01-01 00:00:00.000000', + 1000, + 37, + 30000, + 0 + ), + ( + 290023, + 290026, + 3667, + '1970-01-01 00:00:00.000000', + 250, + 203, + 30000, + 0 + ), + ( + 290024, + 290022, + 3661, + '1970-01-01 00:00:00.000000', + 500, + 211, + 30000, + 0 + ), + ( + 290025, + 290015, + 3660, + '1970-01-01 00:00:00.000000', + 1000, + 44, + 30000, + 0 + ), + ( + 290026, + 290032, + 3672, + '1970-01-01 00:00:00.000000', + 150, + 373, + 30000, + 0 + ), + ( + 290027, + 290037, + 3677, + '1970-01-01 00:00:00.000000', + 100, + 495, + 30000, + 0 + ), + ( + 290028, + 290013, + 3656, + '1970-01-01 00:00:00.000000', + 250, + 361, + 30000, + 0 + ), + ( + 290029, + 290012, + 3655, + '1970-01-01 00:00:00.000000', + 500, + 37, + 30000, + 0 + ), + ( + 290030, + 290027, + 3668, + '1970-01-01 00:00:00.000000', + 150, + 304, + 30000, + 0 + ), + ( + 290031, + 290023, + 3663, + '1970-01-01 00:00:00.000000', + 250, + 315, + 30000, + 0 + ), + ( + 290032, + 290016, + 3662, + '1970-01-01 00:00:00.000000', + 500, + 44, + 30000, + 0 + ), + ( + 290033, + 290033, + 3673, + '1970-01-01 00:00:00.000000', + 0, + 533, + 30000, + 0 + ), + ( + 290034, + 290038, + 3678, + '1970-01-01 00:00:00.000000', + 0, + 711, + 30000, + 0 + ), + ( + 290035, + 290013, + 3657, + '1970-01-01 00:00:00.000000', + 0, + 361, + 30000, + 0 + ), + ( + 290036, + 290028, + 3669, + '1970-01-01 00:00:00.000000', + 0, + 433, + 30000, + 0 + ), + ( + 290037, + 290017, + 3664, + '1970-01-01 00:00:00.000000', + 0, + 450, + 30000, + 0 + ), + ( + 290038, + 290031, + 3679, + '1970-01-01 00:00:00.000000', + 250, + 249, + 30000, + 0 + ), + ( + 300001, + 300001, + 115, + '1999-01-01 00:00:00.000000', + 1000, + 49, + 30000, + 0 + ), + ( + 300002, + 300002, + 116, + '1999-01-01 00:00:00.000000', + 500, + 89, + 30000, + 0 + ), + ( + 300003, + 300004, + 445, + '1970-01-01 00:00:00.000000', + 125, + 49, + 30000, + 0 + ), + ( + 300004, + 300007, + 463, + '1999-01-01 00:00:00.000000', + 125, + 291, + 30000, + 0 + ), + ( + 300005, + 300005, + 461, + '1999-01-01 00:00:00.000000', + 60, + 301, + 30000, + 0 + ), + ( + 300006, + 300006, + 462, + '1999-01-01 00:00:00.000000', + 60, + 311, + 30000, + 0 + ), + ( + 300007, + 300010, + 466, + '1999-01-01 00:00:00.000000', + 0, + 386, + 30000, + 0 + ), + ( + 300008, + 300008, + 464, + '1999-01-01 00:00:00.000000', + 0, + 296, + 30000, + 0 + ), + ( + 300009, + 300009, + 465, + '1999-01-01 00:00:00.000000', + 0, + 311, + 30000, + 0 + ), + ( + 300010, + 300003, + 1184, + '1967-01-01 00:00:00.000000', + 60, + 49, + 30000, + 0 + ), + ( + 300011, + 300011, + 1738, + '1965-01-01 00:00:00.000000', + 60, + 296, + 30000, + 0 + ), + ( + 310001, + 310001, + 117, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310002, + 310002, + 118, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310003, + 310003, + 119, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310004, + 310004, + 120, + '1999-01-01 00:00:00.000000', + 500, + 150, + 30000, + 0 + ), + ( + 310005, + 310006, + 447, + '1969-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310006, + 310005, + 446, + '1969-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310007, + 310008, + 449, + '1970-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310008, + 310007, + 448, + '1970-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310009, + 310009, + 450, + '1973-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310010, + 310010, + 450, + '1973-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310011, + 310022, + 481, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310012, + 310023, + 482, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310013, + 310021, + 480, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310014, + 310024, + 483, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310015, + 310025, + 484, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310016, + 310026, + 485, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310017, + 310027, + 486, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310018, + 310028, + 487, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310019, + 310011, + 470, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310020, + 310012, + 471, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310021, + 310013, + 472, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310022, + 310014, + 473, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310023, + 310015, + 474, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310024, + 310016, + 475, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310025, + 310017, + 476, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310026, + 310018, + 477, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310027, + 310019, + 478, + '1999-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 310028, + 310020, + 479, + '1999-01-01 00:00:00.000000', + 500, + 25, + 30000, + 0 + ), + ( + 310029, + 310029, + 1035, + '1969-01-01 00:00:00.000000', + 500, + 50, + 30000, + 0 + ), + ( + 320001, + 320001, + 155, + '1965-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 3 + ), + ( + 320002, + 320002, + 1284, + '1999-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 5 + ), + ( + 320003, + 320003, + 1044, + '1999-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 2 + ), + ( + 320004, + 320004, + 1045, + '1999-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 1 + ), + ( + 320005, + 320005, + 420, + '1970-01-01 00:00:00.000000', + 500, + 502, + 30000, + 5 + ), + ( + 320006, + 320006, + 884, + '1970-01-01 00:00:00.000000', + 500, + 331, + 30000, + 3 + ), + ( + 320007, + 320043, + 883, + '1970-01-01 00:00:00.000000', + 250, + 397, + 30000, + 17 + ), + ( + 320008, + 320078, + 1282, + '1962-01-01 00:00:00.000000', + 250, + 502, + 30000, + 2 + ), + ( + 320009, + 320077, + 1283, + '1957-01-01 00:00:00.000000', + 500, + 331, + 30000, + 5 + ), + ( + 320010, + 320079, + 1285, + '1963-01-01 00:00:00.000000', + 500, + 346, + 30000, + 19 + ), + ( + 320011, + 320080, + 1286, + '1970-01-01 00:00:00.000000', + 500, + 221, + 30000, + 3 + ), + ( + 320012, + 320081, + 1287, + '1965-01-01 00:00:00.000000', + 0, + 2412, + 30000, + 18 + ), + ( + 320013, + 320082, + 1289, + '1962-01-01 00:00:00.000000', + 125, + 811, + 30000, + 1 + ), + ( + 320014, + 320083, + 1350, + '1990-01-01 00:00:00.000000', + 125, + 1058, + 30000, + 7 + ), + ( + 320015, + 320084, + 1351, + '1990-01-01 00:00:00.000000', + 500, + 450, + 30000, + 7 + ), + ( + 320016, + 320085, + 1352, + '1990-01-01 00:00:00.000000', + 125, + 1159, + 30000, + 7 + ), + ( + 320017, + 320086, + 1353, + '1990-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 7 + ), + ( + 320018, + 320007, + 1354, + '1967-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 7 + ), + ( + 320019, + 320008, + 1355, + '1961-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 8 + ), + ( + 320020, + 320009, + 1356, + '1955-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 6 + ), + ( + 320021, + 320010, + 1357, + '1955-01-01 00:00:00.000000', + 125, + 212, + 30000, + 9 + ), + ( + 320022, + 320011, + 1358, + '1964-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 4 + ), + ( + 320023, + 320012, + 1420, + '1932-01-01 00:00:00.000000', + 125, + 212, + 30000, + 10 + ), + ( + 320024, + 320013, + 1421, + '1965-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 12 + ), + ( + 320025, + 320014, + 1422, + '1968-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 11 + ), + ( + 320026, + 320015, + 1425, + '1959-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 14 + ), + ( + 320027, + 320016, + 1424, + '1955-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 13 + ), + ( + 320028, + 320017, + 1426, + '1956-01-01 00:00:00.000000', + 500, + 361, + 30000, + 6 + ), + ( + 320029, + 320018, + 1427, + '1967-01-01 00:00:00.000000', + 500, + 395, + 30000, + 6 + ), + ( + 320030, + 320019, + 1428, + '1970-01-01 00:00:00.000000', + 500, + 331, + 30000, + 6 + ), + ( + 320031, + 320020, + 1433, + '1965-01-01 00:00:00.000000', + 500, + 395, + 30000, + 5 + ), + ( + 320032, + 320021, + 1434, + '1970-01-01 00:00:00.000000', + 500, + 361, + 30000, + 5 + ), + ( + 320033, + 320022, + 1435, + '1961-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 21 + ), + ( + 320034, + 320023, + 1436, + '1969-01-01 00:00:00.000000', + 250, + 415, + 30000, + 7 + ), + ( + 320035, + 320024, + 1437, + '1968-01-01 00:00:00.000000', + 500, + 331, + 30000, + 11 + ), + ( + 320036, + 320025, + 1438, + '1968-01-01 00:00:00.000000', + 500, + 470, + 30000, + 11 + ), + ( + 320037, + 320026, + 1439, + '1970-01-01 00:00:00.000000', + 500, + 470, + 30000, + 12 + ), + ( + 320038, + 320027, + 1440, + '1969-01-01 00:00:00.000000', + 500, + 378, + 30000, + 13 + ), + ( + 320039, + 320028, + 1441, + '1968-01-01 00:00:00.000000', + 500, + 378, + 30000, + 13 + ), + ( + 320040, + 320029, + 1442, + '1957-01-01 00:00:00.000000', + 500, + 208, + 30000, + 15 + ), + ( + 320041, + 320030, + 1443, + '1957-01-01 00:00:00.000000', + 500, + 411, + 30000, + 4 + ), + ( + 320042, + 320031, + 1445, + '1964-01-01 00:00:00.000000', + 500, + 430, + 30000, + 3 + ), + ( + 320043, + 320032, + 1446, + '1965-01-01 00:00:00.000000', + 15, + 1218, + 30000, + 3 + ), + ( + 320044, + 320033, + 1447, + '1966-01-01 00:00:00.000000', + 250, + 811, + 30000, + 3 + ), + ( + 320045, + 320034, + 1448, + '1961-01-01 00:00:00.000000', + 500, + 502, + 30000, + 3 + ), + ( + 320046, + 320035, + 1449, + '1961-01-01 00:00:00.000000', + 15, + 6019, + 30000, + 17 + ), + ( + 320047, + 320036, + 1450, + '1968-01-01 00:00:00.000000', + 500, + 231, + 30000, + 1 + ), + ( + 320048, + 320037, + 1451, + '1969-01-01 00:00:00.000000', + 500, + 331, + 30000, + 1 + ), + ( + 320049, + 320038, + 1452, + '1960-01-01 00:00:00.000000', + 250, + 585, + 30000, + 1 + ), + ( + 320050, + 320039, + 1453, + '1960-01-01 00:00:00.000000', + 250, + 535, + 30000, + 1 + ), + ( + 320051, + 320040, + 1454, + '1969-01-01 00:00:00.000000', + 250, + 364, + 30000, + 1 + ), + ( + 320052, + 320041, + 1456, + '1970-01-01 00:00:00.000000', + 500, + 331, + 30000, + 2 + ), + ( + 320053, + 320042, + 1457, + '1970-01-01 00:00:00.000000', + 500, + 231, + 30000, + 14 + ), + ( + 320054, + 320044, + 1458, + '1966-01-01 00:00:00.000000', + 250, + 397, + 30000, + 14 + ), + ( + 320055, + 320045, + 1462, + '1999-01-01 00:00:00.000000', + 60, + 450, + 30000, + 10 + ), + ( + 320056, + 320046, + 1463, + '1999-01-01 00:00:00.000000', + 60, + 411, + 30000, + 9 + ), + ( + 320057, + 320047, + 1127, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 5 + ), + ( + 320058, + 320048, + 1128, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 6 + ), + ( + 320059, + 320049, + 1129, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 1 + ), + ( + 320060, + 320050, + 1130, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 2 + ), + ( + 320061, + 320051, + 1131, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 3 + ), + ( + 320062, + 320052, + 1132, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 4 + ), + ( + 320063, + 320053, + 1133, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 12 + ), + ( + 320064, + 320054, + 1134, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 11 + ), + ( + 320065, + 320055, + 1135, + '1999-01-01 00:00:00.000000', + 60, + 411, + 30000, + 18 + ), + ( + 320066, + 320056, + 1136, + '1999-01-01 00:00:00.000000', + 60, + 1107, + 30000, + 13 + ), + ( + 320067, + 320057, + 1138, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 5 + ), + ( + 320068, + 320058, + 1139, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 6 + ), + ( + 320069, + 320059, + 1140, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 1 + ), + ( + 320070, + 320060, + 1141, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 2 + ), + ( + 320071, + 320061, + 1142, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 3 + ), + ( + 320072, + 320062, + 1143, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 4 + ), + ( + 320073, + 320063, + 1144, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 12 + ), + ( + 320074, + 320064, + 1145, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 11 + ), + ( + 320075, + 320065, + 1146, + '1999-01-01 00:00:00.000000', + 0, + 212, + 30000, + 18 + ), + ( + 320076, + 320066, + 1147, + '1999-01-01 00:00:00.000000', + 500, + 450, + 30000, + 13 + ), + ( + 320077, + 320067, + 1148, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 5 + ), + ( + 320078, + 320068, + 1149, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 6 + ), + ( + 320079, + 320069, + 1150, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 1 + ), + ( + 320080, + 320070, + 1151, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 2 + ), + ( + 320081, + 320071, + 1152, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 3 + ), + ( + 320082, + 320072, + 1153, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 4 + ), + ( + 320083, + 320073, + 1154, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 12 + ), + ( + 320084, + 320074, + 1155, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 11 + ), + ( + 320085, + 320075, + 1156, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 13 + ), + ( + 320086, + 320076, + 1157, + '1999-01-01 00:00:00.000000', + 125, + 1107, + 30000, + 13 + ), + ( + 320087, + 320088, + 1789, + '1970-01-01 00:00:00.000000', + 500, + 331, + 30000, + 4 + ), + ( + 320088, + 320087, + 1790, + '1970-01-01 00:00:00.000000', + 250, + 811, + 30000, + 4 + ), + ( + 320089, + 320036, + 2035, + '1967-01-01 00:00:00.000000', + 500, + 231, + 30000, + 1 + ), + ( + 320090, + 320089, + 2074, + '1959-01-01 00:00:00.000000', + 500, + 331, + 30000, + 13 + ), + ( + 320091, + 320090, + 2080, + '1962-01-01 00:00:00.000000', + 250, + 811, + 30000, + 13 + ), + ( + 320092, + 320091, + 2473, + '1940-01-01 00:00:00.000000', + 125, + 212, + 30000, + 20 + ), + ( + 320093, + 320092, + 2492, + '1970-01-01 00:00:00.000000', + 125, + 212, + 30000, + 16 + ), + ( + 320094, + 320093, + 2493, + '1971-01-01 00:00:00.000000', + 60, + 331, + 30000, + 16 + ), + ( + 320095, + 320094, + 2506, + '1968-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 17 + ), + ( + 320096, + 320095, + 2507, + '1970-01-01 00:00:00.000000', + 125, + 231, + 30000, + 17 + ), + ( + 320097, + 320096, + 2526, + '1970-01-01 00:00:00.000000', + 2, + 451, + 30000, + 4 + ), + ( + 320098, + 320097, + 2527, + '1954-01-01 00:00:00.000000', + 1000, + 191, + 30000, + 15 + ), + ( + 320099, + 320098, + 2528, + '1957-01-01 00:00:00.000000', + 30, + 311, + 30000, + 15 + ), + ( + 320100, + 320099, + 2540, + '1958-01-01 00:00:00.000000', + 1000, + 212, + 30000, + 19 + ), + ( + 320101, + 320100, + 2541, + '1959-01-01 00:00:00.000000', + 125, + 331, + 30000, + 19 + ), + ( + 320102, + 320103, + 2573, + '1971-04-17 00:00:00.000000', + 500, + 331, + 30000, + 8 + ), + ( + 320103, + 320101, + 2571, + '1955-02-18 00:00:00.000000', + 500, + 331, + 30000, + 21 + ), + ( + 320104, + 320102, + 2572, + '1958-03-02 00:00:00.000000', + 250, + 811, + 30000, + 21 + ), + ( + 320105, + 320104, + 2574, + '1947-02-20 00:00:00.000000', + 60, + 331, + 30000, + 20 + ), + ( + 320106, + 320106, + 2691, + '1995-01-01 00:00:00.000000', + 125, + 1058, + 30000, + 14 + ), + ( + 320107, + 320105, + 2692, + '1995-01-01 00:00:00.000000', + 250, + 1058, + 30000, + 14 + ), + ( + 320108, + 320107, + 2773, + '1969-01-01 00:00:00.000000', + 250, + 331, + 30000, + 14 + ), + ( + 320109, + 320110, + 2806, + '1957-01-01 00:00:00.000000', + 500, + 387, + 30000, + 15 + ), + ( + 320110, + 320111, + 2809, + '1957-01-01 00:00:00.000000', + 500, + 325, + 30000, + 15 + ), + ( + 320111, + 320114, + 2812, + '1957-01-01 00:00:00.000000', + 500, + 295, + 30000, + 15 + ), + ( + 320112, + 320113, + 2807, + '1957-01-01 00:00:00.000000', + 500, + 311, + 30000, + 15 + ), + ( + 320113, + 320112, + 2810, + '1957-01-01 00:00:00.000000', + 500, + 325, + 30000, + 15 + ), + ( + 320114, + 320116, + 2808, + '1957-01-01 00:00:00.000000', + 125, + 763, + 30000, + 15 + ), + ( + 320115, + 320117, + 2811, + '1957-01-01 00:00:00.000000', + 125, + 799, + 30000, + 15 + ), + ( + 320116, + 320108, + 2804, + '1957-01-01 00:00:00.000000', + 1000, + 191, + 30000, + 15 + ), + ( + 320117, + 320118, + 2814, + '1957-01-01 00:00:00.000000', + 250, + 461, + 30000, + 15 + ), + ( + 320118, + 320109, + 2805, + '1957-01-01 00:00:00.000000', + 1000, + 191, + 30000, + 15 + ), + ( + 320119, + 320115, + 2813, + '1957-01-01 00:00:00.000000', + 1000, + 189, + 30000, + 15 + ), + ( + 320120, + 320121, + 2817, + '1957-01-01 00:00:00.000000', + 125, + 452, + 30000, + 15 + ), + ( + 320121, + 320120, + 2816, + '1957-01-01 00:00:00.000000', + 250, + 457, + 30000, + 15 + ), + ( + 320122, + 320119, + 2815, + '1957-01-01 00:00:00.000000', + 250, + 461, + 30000, + 15 + ), + ( + 320123, + 320132, + 2889, + '1964-01-01 00:00:00.000000', + 60, + 976, + 30000, + 6 + ), + ( + 320124, + 320126, + 2883, + '1964-01-01 00:00:00.000000', + 500, + 233, + 30000, + 6 + ), + ( + 320125, + 320134, + 2891, + '1964-01-01 00:00:00.000000', + 125, + 929, + 30000, + 6 + ), + ( + 320126, + 320133, + 2890, + '1964-01-01 00:00:00.000000', + 125, + 888, + 30000, + 6 + ), + ( + 320127, + 320128, + 2885, + '1964-01-01 00:00:00.000000', + 250, + 512, + 30000, + 6 + ), + ( + 320128, + 320131, + 2888, + '1964-01-01 00:00:00.000000', + 125, + 848, + 30000, + 6 + ), + ( + 320129, + 320125, + 2882, + '1964-01-01 00:00:00.000000', + 500, + 331, + 30000, + 6 + ), + ( + 320130, + 320124, + 2881, + '1964-01-01 00:00:00.000000', + 500, + 210, + 30000, + 6 + ), + ( + 320131, + 320123, + 2880, + '1964-01-01 00:00:00.000000', + 250, + 331, + 30000, + 6 + ), + ( + 320132, + 320135, + 2892, + '1964-01-01 00:00:00.000000', + 250, + 346, + 30000, + 6 + ), + ( + 320133, + 320127, + 2884, + '1964-01-01 00:00:00.000000', + 500, + 231, + 30000, + 6 + ), + ( + 320134, + 320129, + 2886, + '1964-01-01 00:00:00.000000', + 125, + 888, + 30000, + 6 + ), + ( + 320135, + 320122, + 2879, + '1964-01-01 00:00:00.000000', + 125, + 811, + 30000, + 6 + ), + ( + 320136, + 320130, + 2887, + '1964-01-01 00:00:00.000000', + 125, + 848, + 30000, + 6 + ), + ( + 320137, + 320139, + 2920, + '1965-01-01 00:00:00.000000', + 500, + 221, + 30000, + 21 + ), + ( + 320138, + 320152, + 2933, + '1965-01-01 00:00:00.000000', + 250, + 331, + 30000, + 4 + ), + ( + 320139, + 320155, + 2936, + '1965-01-01 00:00:00.000000', + 250, + 933, + 30000, + 4 + ), + ( + 320140, + 320146, + 2926, + '1965-01-01 00:00:00.000000', + 125, + 848, + 30000, + 21 + ), + ( + 320141, + 320156, + 2937, + '1965-01-01 00:00:00.000000', + 60, + 1069, + 30000, + 4 + ), + ( + 320142, + 320145, + 2927, + '1965-01-01 00:00:00.000000', + 60, + 929, + 30000, + 21 + ), + ( + 320143, + 320138, + 2919, + '1965-01-01 00:00:00.000000', + 500, + 243, + 30000, + 21 + ), + ( + 320144, + 320154, + 2935, + '1965-01-01 00:00:00.000000', + 250, + 976, + 30000, + 4 + ), + ( + 320145, + 320157, + 2938, + '1965-01-01 00:00:00.000000', + 125, + 848, + 30000, + 4 + ), + ( + 320146, + 320149, + 2930, + '1965-01-01 00:00:00.000000', + 500, + 331, + 30000, + 4 + ), + ( + 320147, + 320148, + 2929, + '1965-01-01 00:00:00.000000', + 500, + 212, + 30000, + 4 + ), + ( + 320148, + 320151, + 2932, + '1965-01-01 00:00:00.000000', + 500, + 331, + 30000, + 4 + ), + ( + 320149, + 320150, + 2931, + '1965-01-01 00:00:00.000000', + 500, + 212, + 30000, + 4 + ), + ( + 320150, + 320136, + 2917, + '1965-01-01 00:00:00.000000', + 500, + 210, + 30000, + 21 + ), + ( + 320151, + 320137, + 2918, + '1965-01-01 00:00:00.000000', + 500, + 212, + 30000, + 21 + ), + ( + 320152, + 320153, + 2934, + '1965-01-01 00:00:00.000000', + 125, + 929, + 30000, + 4 + ), + ( + 320153, + 320159, + 2940, + '1965-01-01 00:00:00.000000', + 60, + 976, + 30000, + 4 + ), + ( + 320154, + 320141, + 2922, + '1965-01-01 00:00:00.000000', + 500, + 346, + 30000, + 21 + ), + ( + 320155, + 320140, + 2921, + '1965-01-01 00:00:00.000000', + 500, + 243, + 30000, + 21 + ), + ( + 320156, + 320143, + 2924, + '1965-01-01 00:00:00.000000', + 125, + 811, + 30000, + 21 + ), + ( + 320157, + 320158, + 2939, + '1965-01-01 00:00:00.000000', + 60, + 929, + 30000, + 4 + ), + ( + 320158, + 320142, + 2923, + '1965-01-01 00:00:00.000000', + 125, + 563, + 30000, + 21 + ), + ( + 320159, + 320144, + 2925, + '1965-01-01 00:00:00.000000', + 125, + 888, + 30000, + 21 + ), + ( + 320160, + 320147, + 2928, + '1965-01-01 00:00:00.000000', + 60, + 1069, + 30000, + 21 + ), + ( + 320161, + 320166, + 3042, + '1966-01-01 00:00:00.000000', + 60, + 933, + 30000, + 2 + ), + ( + 320162, + 320167, + 3043, + '1966-01-01 00:00:00.000000', + 250, + 212, + 30000, + 2 + ), + ( + 320163, + 320168, + 3044, + '1966-01-01 00:00:00.000000', + 250, + 848, + 30000, + 2 + ), + ( + 320164, + 320165, + 3041, + '1966-01-01 00:00:00.000000', + 50, + 976, + 30000, + 2 + ), + ( + 320165, + 320161, + 3037, + '1966-01-01 00:00:00.000000', + 125, + 346, + 30000, + 2 + ), + ( + 320166, + 320163, + 3039, + '1966-01-01 00:00:00.000000', + 250, + 848, + 30000, + 2 + ), + ( + 320167, + 320160, + 3036, + '1966-01-01 00:00:00.000000', + 500, + 346, + 30000, + 2 + ), + ( + 320168, + 320162, + 3038, + '1966-01-01 00:00:00.000000', + 250, + 848, + 30000, + 2 + ), + ( + 320169, + 320164, + 3040, + '1966-01-01 00:00:00.000000', + 0, + 1069, + 30000, + 2 + ), + ( + 320170, + 320172, + 3083, + '1966-01-01 00:00:00.000000', + 60, + 1022, + 30000, + 13 + ), + ( + 320171, + 320171, + 3082, + '1966-01-01 00:00:00.000000', + 125, + 976, + 30000, + 13 + ), + ( + 320172, + 320169, + 3080, + '1966-01-01 00:00:00.000000', + 30, + 1114, + 30000, + 13 + ), + ( + 320173, + 320173, + 3084, + '1966-01-01 00:00:00.000000', + 125, + 848, + 30000, + 13 + ), + ( + 320174, + 320170, + 3081, + '1966-01-01 00:00:00.000000', + 125, + 848, + 30000, + 13 + ), + ( + 320175, + 320174, + 3085, + '1966-01-01 00:00:00.000000', + 60, + 397, + 30000, + 13 + ), + ( + 320176, + 320178, + 3116, + '1966-01-01 00:00:00.000000', + 125, + 933, + 30000, + 5 + ), + ( + 320177, + 320175, + 3113, + '1966-01-01 00:00:00.000000', + 125, + 397, + 30000, + 5 + ), + ( + 320178, + 320179, + 3117, + '1966-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 5 + ), + ( + 320179, + 320176, + 3114, + '1966-01-01 00:00:00.000000', + 250, + 848, + 30000, + 5 + ), + ( + 320180, + 320177, + 3115, + '1966-01-01 00:00:00.000000', + 125, + 976, + 30000, + 5 + ), + ( + 320181, + 320184, + 3394, + '1967-01-01 00:00:00.000000', + 125, + 811, + 30000, + 3 + ), + ( + 320182, + 320183, + 3393, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 3 + ), + ( + 320183, + 320180, + 3391, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 3 + ), + ( + 320184, + 320180, + 3390, + '1967-01-01 00:00:00.000000', + 125, + 346, + 30000, + 3 + ), + ( + 320185, + 320182, + 3392, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 3 + ), + ( + 320186, + 320185, + 3395, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 3 + ), + ( + 320187, + 320186, + 3396, + '1967-01-01 00:00:00.000000', + 125, + 888, + 30000, + 1 + ), + ( + 320188, + 320187, + 3397, + '1967-01-01 00:00:00.000000', + 0, + 1022, + 30000, + 1 + ), + ( + 320189, + 320161, + 3400, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 1 + ), + ( + 320190, + 320190, + 3401, + '1967-01-01 00:00:00.000000', + 250, + 848, + 30000, + 1 + ), + ( + 320191, + 320192, + 3403, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 1 + ), + ( + 320192, + 320193, + 3402, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 1 + ), + ( + 320193, + 320188, + 3399, + '1967-01-01 00:00:00.000000', + 0, + 397, + 30000, + 1 + ), + ( + 320194, + 320189, + 3398, + '1967-01-01 00:00:00.000000', + 0, + 976, + 30000, + 1 + ), + ( + 320195, + 320197, + 3407, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 12 + ), + ( + 320196, + 320198, + 3408, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 12 + ), + ( + 320197, + 320201, + 3411, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 12 + ), + ( + 320198, + 320202, + 3412, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 12 + ), + ( + 320199, + 320194, + 3404, + '1967-01-01 00:00:00.000000', + 500, + 221, + 30000, + 12 + ), + ( + 320200, + 320200, + 3410, + '1967-01-01 00:00:00.000000', + 125, + 811, + 30000, + 12 + ), + ( + 320201, + 320195, + 3405, + '1967-01-01 00:00:00.000000', + 500, + 221, + 30000, + 12 + ), + ( + 320202, + 320199, + 3409, + '1967-01-01 00:00:00.000000', + 0, + 1022, + 30000, + 12 + ), + ( + 320203, + 320196, + 3406, + '1967-01-01 00:00:00.000000', + 0, + 474, + 30000, + 12 + ), + ( + 320204, + 320205, + 3414, + '1967-01-01 00:00:00.000000', + 0, + 397, + 30000, + 19 + ), + ( + 320205, + 320206, + 3419, + '1967-01-01 00:00:00.000000', + 0, + 933, + 30000, + 19 + ), + ( + 320206, + 320210, + 3417, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 19 + ), + ( + 320207, + 320213, + 3421, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 19 + ), + ( + 320208, + 320207, + 3422, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 19 + ), + ( + 320209, + 320203, + 3413, + '1967-01-01 00:00:00.000000', + 252, + 331, + 30000, + 19 + ), + ( + 320210, + 320212, + 3420, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 19 + ), + ( + 320211, + 320211, + 3418, + '1967-01-01 00:00:00.000000', + 0, + 1022, + 30000, + 19 + ), + ( + 320212, + 320208, + 3423, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 19 + ), + ( + 320213, + 320209, + 3416, + '1967-01-01 00:00:00.000000', + 0, + 434, + 30000, + 19 + ), + ( + 320214, + 320204, + 3415, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 19 + ), + ( + 320215, + 320220, + 3431, + '1967-01-01 00:00:00.000000', + 125, + 976, + 30000, + 14 + ), + ( + 320216, + 320221, + 3432, + '1967-01-01 00:00:00.000000', + 0, + 1114, + 30000, + 14 + ), + ( + 320217, + 320216, + 3426, + '1967-01-01 00:00:00.000000', + 250, + 888, + 30000, + 14 + ), + ( + 320218, + 320217, + 3427, + '1967-01-01 00:00:00.000000', + 0, + 415, + 30000, + 14 + ), + ( + 320219, + 320218, + 3428, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 14 + ), + ( + 320220, + 320215, + 3425, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 14 + ), + ( + 320221, + 320219, + 3430, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 14 + ), + ( + 320222, + 320222, + 3429, + '1967-01-01 00:00:00.000000', + 0, + 1166, + 30000, + 14 + ), + ( + 320223, + 320214, + 3424, + '1967-01-01 00:00:00.000000', + 0, + 1022, + 30000, + 14 + ), + ( + 320224, + 320226, + 3436, + '1967-01-01 00:00:00.000000', + 250, + 361, + 30000, + 9 + ), + ( + 320225, + 320230, + 3440, + '1967-01-01 00:00:00.000000', + 250, + 848, + 30000, + 9 + ), + ( + 320226, + 320234, + 3444, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 9 + ), + ( + 320227, + 320235, + 3445, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 9 + ), + ( + 320228, + 320224, + 3434, + '1967-01-01 00:00:00.000000', + 500, + 331, + 30000, + 9 + ), + ( + 320229, + 320223, + 3433, + '1967-01-01 00:00:00.000000', + 500, + 263, + 30000, + 9 + ), + ( + 320230, + 320229, + 3439, + '1967-01-01 00:00:00.000000', + 250, + 811, + 30000, + 9 + ), + ( + 320231, + 320228, + 3438, + '1967-01-01 00:00:00.000000', + 125, + 415, + 30000, + 9 + ), + ( + 320232, + 320233, + 3443, + '1967-01-01 00:00:00.000000', + 125, + 892, + 30000, + 9 + ), + ( + 320233, + 320225, + 3435, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 9 + ), + ( + 320234, + 320231, + 3441, + '1967-01-01 00:00:00.000000', + 125, + 976, + 30000, + 9 + ), + ( + 320235, + 320232, + 3442, + '1967-01-01 00:00:00.000000', + 0, + 1022, + 30000, + 9 + ), + ( + 320236, + 320227, + 3437, + '1967-01-01 00:00:00.000000', + 0, + 378, + 30000, + 9 + ), + ( + 320237, + 320236, + 3446, + '1967-01-01 00:00:00.000000', + 0, + 1114, + 30000, + 9 + ), + ( + 320238, + 320246, + 3456, + '1967-01-01 00:00:00.000000', + 60, + 888, + 30000, + 18 + ), + ( + 320239, + 320245, + 3455, + '1967-01-01 00:00:00.000000', + 0, + 929, + 30000, + 18 + ), + ( + 320240, + 320242, + 3452, + '1967-01-01 00:00:00.000000', + 125, + 848, + 30000, + 18 + ), + ( + 320241, + 320238, + 3448, + '1967-01-01 00:00:00.000000', + 125, + 346, + 30000, + 18 + ), + ( + 320242, + 320237, + 3447, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 18 + ), + ( + 320243, + 320239, + 3449, + '1967-01-01 00:00:00.000000', + 125, + 346, + 30000, + 18 + ), + ( + 320244, + 320240, + 3450, + '1967-01-01 00:00:00.000000', + 125, + 361, + 30000, + 18 + ), + ( + 320245, + 320243, + 3453, + '1967-01-01 00:00:00.000000', + 125, + 888, + 30000, + 18 + ), + ( + 320246, + 320241, + 3451, + '1967-01-01 00:00:00.000000', + 0, + 361, + 30000, + 18 + ), + ( + 320247, + 320244, + 3454, + '1967-01-01 00:00:00.000000', + 60, + 929, + 30000, + 18 + ), + ( + 320248, + 320248, + 3463, + '1967-01-01 00:00:00.000000', + 250, + 848, + 30000, + 17 + ), + ( + 320249, + 320250, + 3465, + '1967-01-01 00:00:00.000000', + 0, + 1114, + 30000, + 17 + ), + ( + 320250, + 320252, + 3459, + '1967-01-01 00:00:00.000000', + 125, + 1022, + 30000, + 17 + ), + ( + 320251, + 320251, + 3458, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 17 + ), + ( + 320252, + 320247, + 3457, + '1967-01-01 00:00:00.000000', + 500, + 346, + 30000, + 17 + ), + ( + 320253, + 320249, + 3464, + '1967-01-01 00:00:00.000000', + 125, + 976, + 30000, + 17 + ), + ( + 320254, + 320254, + 3461, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 17 + ), + ( + 320255, + 320253, + 3460, + '1967-01-01 00:00:00.000000', + 0, + 453, + 30000, + 17 + ), + ( + 320256, + 320255, + 3462, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 17 + ), + ( + 320257, + 320259, + 3468, + '1967-01-01 00:00:00.000000', + 250, + 848, + 30000, + 16 + ), + ( + 320258, + 320257, + 3467, + '1967-01-01 00:00:00.000000', + 0, + 434, + 30000, + 16 + ), + ( + 320259, + 320258, + 3469, + '1967-01-01 00:00:00.000000', + 0, + 1069, + 30000, + 16 + ), + ( + 320260, + 320260, + 3470, + '1967-01-01 00:00:00.000000', + 0, + 1065, + 30000, + 16 + ), + ( + 320261, + 320265, + 3475, + '1967-01-01 00:00:00.000000', + 125, + 933, + 30000, + 16 + ), + ( + 320262, + 320261, + 3471, + '1967-01-01 00:00:00.000000', + 500, + 361, + 30000, + 16 + ), + ( + 320263, + 320263, + 3473, + '1967-01-01 00:00:00.000000', + 250, + 848, + 30000, + 16 + ), + ( + 320264, + 320256, + 3466, + '1967-01-01 00:00:00.000000', + 250, + 346, + 30000, + 16 + ), + ( + 320265, + 320262, + 3472, + '1967-01-01 00:00:00.000000', + 0, + 453, + 30000, + 16 + ), + ( + 320266, + 320264, + 3474, + '1967-01-01 00:00:00.000000', + 0, + 1114, + 30000, + 16 + ), + ( + 330001, + 330001, + 156, + '1999-01-01 00:00:00.000000', + 1000, + 125, + 30000, + 0 + ), + ( + 330002, + 330002, + 157, + '1999-01-01 00:00:00.000000', + 125, + 771, + 30000, + 0 + ), + ( + 330003, + 330003, + 188, + '1999-01-01 00:00:00.000000', + 1000, + 50, + 30000, + 0 + ), + ( + 330004, + 330004, + 886, + '1967-01-01 00:00:00.000000', + 250, + 589, + 30000, + 0 + ), + ( + 330005, + 330005, + 434, + '1964-01-01 00:00:00.000000', + 1000, + 51, + 30000, + 0 + ), + ( + 330006, + 330006, + 452, + '1932-01-01 00:00:00.000000', + 1000, + 52, + 30000, + 0 + ), + ( + 330007, + 330007, + 455, + '1957-01-01 00:00:00.000000', + 1000, + 201, + 30000, + 0 + ), + ( + 330008, + 330008, + 458, + '1952-01-01 00:00:00.000000', + 500, + 521, + 30000, + 0 + ), + ( + 330009, + 330009, + 459, + '1950-01-01 00:00:00.000000', + 1000, + 110, + 30000, + 0 + ), + ( + 330010, + 330010, + 492, + '1999-01-01 00:00:00.000000', + 125, + 223, + 30000, + 0 + ), + ( + 330011, + 330011, + 493, + '1999-01-01 00:00:00.000000', + 250, + 726, + 30000, + 0 + ), + ( + 330012, + 330012, + 494, + '1999-01-01 00:00:00.000000', + 250, + 514, + 30000, + 0 + ), + ( + 330013, + 330013, + 517, + '1957-01-01 00:00:00.000000', + 125, + 527, + 30000, + 0 + ), + ( + 330014, + 330017, + 1290, + '1960-01-01 00:00:00.000000', + 125, + 1024, + 30000, + 0 + ), + ( + 330015, + 330019, + 1335, + '1990-01-01 00:00:00.000000', + 500, + 523, + 30000, + 0 + ), + ( + 330016, + 330015, + 885, + '1990-01-01 00:00:00.000000', + 1000, + 52, + 30000, + 0 + ), + ( + 330017, + 330016, + 1291, + '1963-01-01 00:00:00.000000', + 125, + 902, + 30000, + 0 + ), + ( + 330018, + 330020, + 1521, + '1965-01-01 00:00:00.000000', + 500, + 521, + 30000, + 0 + ), + ( + 330019, + 330018, + 1517, + '1965-01-01 00:00:00.000000', + 125, + 902, + 30000, + 0 + ), + ( + 330020, + 330021, + 1544, + '1965-01-01 00:00:00.000000', + 1000, + 250, + 30000, + 0 + ), + ( + 330021, + 330022, + 1600, + '1961-01-01 00:00:00.000000', + 125, + 989, + 30000, + 0 + ), + ( + 330022, + 330023, + 1609, + '1963-01-01 00:00:00.000000', + 15, + 1338, + 30000, + 0 + ), + ( + 330023, + 330024, + 1791, + '1963-01-01 00:00:00.000000', + 1000, + 185, + 30000, + 0 + ), + ( + 330024, + 330025, + 1792, + '1963-01-01 00:00:00.000000', + 1000, + 250, + 30000, + 0 + ), + ( + 330025, + 330026, + 1793, + '1963-01-01 00:00:00.000000', + 60, + 873, + 30000, + 0 + ), + ( + 330026, + 330027, + 1794, + '1963-01-01 00:00:00.000000', + 125, + 577, + 30000, + 0 + ), + ( + 330027, + 330028, + 1795, + '1963-01-01 00:00:00.000000', + 30, + 985, + 30000, + 0 + ), + ( + 330028, + 330029, + 1796, + '1963-01-01 00:00:00.000000', + 250, + 527, + 30000, + 0 + ), + ( + 330029, + 330030, + 1797, + '1963-01-01 00:00:00.000000', + 125, + 771, + 30000, + 0 + ), + ( + 330030, + 330031, + 1798, + '1963-01-01 00:00:00.000000', + 250, + 841, + 30000, + 0 + ), + ( + 330031, + 330032, + 1799, + '1963-01-01 00:00:00.000000', + 1000, + 250, + 30000, + 0 + ), + ( + 330032, + 330033, + 1800, + '1963-01-01 00:00:00.000000', + 60, + 1015, + 30000, + 0 + ), + ( + 330033, + 330034, + 1801, + '1963-01-01 00:00:00.000000', + 125, + 801, + 30000, + 0 + ), + ( + 330034, + 330035, + 1802, + '1963-01-01 00:00:00.000000', + 500, + 521, + 30000, + 0 + ), + ( + 330035, + 330036, + 1803, + '1963-01-01 00:00:00.000000', + 1000, + 357, + 30000, + 0 + ), + ( + 330036, + 330037, + 1804, + '1963-01-01 00:00:00.000000', + 500, + 521, + 30000, + 0 + ), + ( + 330037, + 330038, + 1805, + '1963-01-01 00:00:00.000000', + 500, + 521, + 30000, + 0 + ), + ( + 330038, + 330039, + 1806, + '1963-01-01 00:00:00.000000', + 125, + 682, + 30000, + 0 + ), + ( + 330039, + 330040, + 1807, + '1963-01-01 00:00:00.000000', + 125, + 864, + 30000, + 0 + ), + ( + 330040, + 330041, + 1808, + '1963-01-01 00:00:00.000000', + 15, + 1228, + 30000, + 0 + ), + ( + 330041, + 330042, + 1809, + '1963-01-01 00:00:00.000000', + 1000, + 118, + 30000, + 0 + ), + ( + 330042, + 330043, + 1810, + '1963-01-01 00:00:00.000000', + 1000, + 207, + 30000, + 0 + ), + ( + 330043, + 330044, + 1811, + '1963-01-01 00:00:00.000000', + 125, + 682, + 30000, + 0 + ), + ( + 330044, + 330045, + 1812, + '1963-01-01 00:00:00.000000', + 250, + 474, + 30000, + 0 + ), + ( + 330045, + 330046, + 1813, + '1963-01-01 00:00:00.000000', + 125, + 646, + 30000, + 0 + ), + ( + 330046, + 330047, + 1814, + '1963-01-01 00:00:00.000000', + 125, + 690, + 30000, + 0 + ), + ( + 330047, + 330048, + 1815, + '1963-01-01 00:00:00.000000', + 15, + 1445, + 30000, + 0 + ), + ( + 330048, + 330049, + 1816, + '1963-01-01 00:00:00.000000', + 15, + 1626, + 30000, + 0 + ), + ( + 330049, + 330050, + 1817, + '1963-01-01 00:00:00.000000', + 15, + 1746, + 30000, + 0 + ), + ( + 330050, + 330051, + 1818, + '1963-01-01 00:00:00.000000', + 0, + 1927, + 30000, + 0 + ), + ( + 330051, + 330052, + 1819, + '1963-01-01 00:00:00.000000', + 0, + 1807, + 30000, + 0 + ), + ( + 330052, + 330053, + 2033, + '1967-01-01 00:00:00.000000', + 1000, + 175, + 30000, + 0 + ), + ( + 330053, + 330054, + 2038, + '1962-01-01 00:00:00.000000', + 1000, + 384, + 30000, + 0 + ), + ( + 330054, + 330055, + 2044, + '1955-01-01 00:00:00.000000', + 1000, + 175, + 30000, + 0 + ), + ( + 330055, + 330056, + 2045, + '1956-01-01 00:00:00.000000', + 500, + 621, + 30000, + 0 + ), + ( + 330056, + 330057, + 2047, + '1956-01-01 00:00:00.000000', + 1000, + 384, + 30000, + 0 + ), + ( + 330057, + 330058, + 2049, + '1958-01-01 00:00:00.000000', + 250, + 526, + 30000, + 0 + ), + ( + 330058, + 330059, + 2064, + '1968-01-01 00:00:00.000000', + 1000, + 309, + 30000, + 0 + ), + ( + 330059, + 330060, + 2069, + '1959-01-01 00:00:00.000000', + 500, + 446, + 30000, + 0 + ), + ( + 330060, + 330061, + 2071, + '1960-01-01 00:00:00.000000', + 250, + 605, + 30000, + 0 + ), + ( + 330061, + 330062, + 2085, + '1957-01-01 00:00:00.000000', + 500, + 621, + 30000, + 0 + ), + ( + 330062, + 330063, + 2087, + '1961-01-01 00:00:00.000000', + 500, + 446, + 30000, + 0 + ), + ( + 330063, + 330064, + 2092, + '1961-01-01 00:00:00.000000', + 125, + 1138, + 30000, + 0 + ), + ( + 330064, + 330065, + 2093, + '1962-01-01 00:00:00.000000', + 30, + 1244, + 30000, + 0 + ), + ( + 330065, + 330066, + 2108, + '1959-01-01 00:00:00.000000', + 500, + 446, + 30000, + 0 + ), + ( + 330066, + 330067, + 2109, + '1959-01-01 00:00:00.000000', + 250, + 661, + 30000, + 0 + ), + ( + 330067, + 330068, + 2111, + '1959-01-01 00:00:00.000000', + 125, + 802, + 30000, + 0 + ), + ( + 330068, + 330069, + 2687, + '1995-01-01 00:00:00.000000', + 125, + 361, + 30000, + 0 + ), + ( + 330069, + 330070, + 2688, + '1995-01-01 00:00:00.000000', + 60, + 748, + 30000, + 0 + ), + ( + 330070, + 330072, + 2689, + '1995-01-01 00:00:00.000000', + 60, + 831, + 30000, + 0 + ), + ( + 330071, + 330071, + 2690, + '1995-01-01 00:00:00.000000', + 60, + 919, + 30000, + 0 + ), + ( + 330072, + 330073, + 2693, + '1995-01-01 00:00:00.000000', + 30, + 1124, + 30000, + 0 + ), + ( + 330073, + 330014, + 2756, + '1965-01-01 00:00:00.000000', + 125, + 771, + 30000, + 0 + ), + ( + 340001, + 340001, + 158, + '1999-01-01 00:00:00.000000', + 500, + 41, + 30000, + 0 + ), + ( + 340002, + 340002, + 1172, + '1999-01-01 00:00:00.000000', + 1000, + 56, + 30000, + 0 + ), + ( + 340003, + 340003, + 159, + '1999-01-01 00:00:00.000000', + 125, + 101, + 30000, + 0 + ), + ( + 340004, + 340004, + 160, + '1999-01-01 00:00:00.000000', + 0, + 201, + 30000, + 0 + ), + ( + 340005, + 340005, + 2351, + '2001-01-01 00:00:00.000000', + 500, + 101, + 30000, + 0 + ), + ( + 340006, + 340006, + 2680, + '1995-01-01 00:00:00.000000', + 125, + 126, + 30000, + 0 + ), + ( + 340007, + 340007, + 2681, + '1995-01-01 00:00:00.000000', + 125, + 126, + 30000, + 0 + ), + ( + 340008, + 340008, + 2682, + '1995-01-01 00:00:00.000000', + 125, + 126, + 30000, + 0 + ), + ( + 340009, + 340009, + 2683, + '1995-01-01 00:00:00.000000', + 500, + 81, + 30000, + 0 + ), + ( + 340010, + 340010, + 2684, + '1995-01-01 00:00:00.000000', + 500, + 81, + 30000, + 0 + ), + ( + 340011, + 340011, + 2685, + '1995-01-01 00:00:00.000000', + 500, + 81, + 30000, + 0 + ), + ( + 350001, + 350001, + 161, + '1999-01-01 00:00:00.000000', + 1000, + 4532, + 30000, + 0 + ), + ( + 350002, + 350002, + 162, + '1999-01-01 00:00:00.000000', + 500, + 5061, + 30000, + 0 + ), + ( + 350003, + 350003, + 409, + '1960-01-01 00:00:00.000000', + 250, + 5821, + 30000, + 0 + ), + ( + 350004, + 350004, + 460, + '1957-01-01 00:00:00.000000', + 125, + 6787, + 30000, + 0 + ), + ( + 350005, + 350005, + 497, + '1999-01-01 00:00:00.000000', + 0, + 12411, + 30000, + 0 + ), + ( + 350006, + 350006, + 2662, + '1965-01-01 00:00:00.000000', + 125, + 6787, + 30000, + 0 + ), + ( + 350007, + 350007, + 2663, + '1966-01-01 00:00:00.000000', + 125, + 7341, + 30000, + 0 + ), + ( + 350008, + 350008, + 2664, + '1967-01-01 00:00:00.000000', + 0, + 7940, + 30000, + 0 + ), + ( + 360001, + 360001, + 163, + '1999-01-01 00:00:00.000000', + 1000, + 5007, + 30000, + 0 + ), + ( + 360002, + 360002, + 164, + '1999-01-01 00:00:00.000000', + 75, + 8665, + 30000, + 0 + ), + ( + 360003, + 360005, + 507, + '1999-01-01 00:00:00.000000', + 0, + 16901, + 30000, + 0 + ), + ( + 360004, + 360003, + 505, + '1999-01-01 00:00:00.000000', + 80, + 8540, + 30000, + 0 + ), + ( + 360005, + 360006, + 508, + '1999-01-01 00:00:00.000000', + 90, + 8415, + 30000, + 0 + ), + ( + 360006, + 360004, + 506, + '1999-01-01 00:00:00.000000', + 0, + 13136, + 30000, + 0 + ), + ( + 1000001, + 1000001, + 166, + '1964-01-01 00:00:00.000000', + 1000, + 551, + 30000, + 15 + ), + ( + 1000002, + 1000002, + 887, + '1932-01-01 00:00:00.000000', + 250, + 646, + 30000, + 10 + ), + ( + 1000003, + 1000003, + 888, + '1942-01-01 00:00:00.000000', + 125, + 662, + 30000, + 10 + ), + ( + 1000004, + 1000004, + 889, + '1940-01-01 00:00:00.000000', + 125, + 717, + 30000, + 10 + ), + ( + 1000005, + 1000005, + 890, + '1963-01-01 00:00:00.000000', + 125, + 2587, + 30000, + 3 + ), + ( + 1000006, + 1000006, + 891, + '1969-01-01 00:00:00.000000', + 30, + 6203, + 30000, + 17 + ), + ( + 1000007, + 1000007, + 1046, + '1966-01-01 00:00:00.000000', + 500, + 1920, + 30000, + 14 + ), + ( + 1000008, + 1000008, + 1047, + '1967-01-01 00:00:00.000000', + 250, + 2041, + 30000, + 14 + ), + ( + 1000009, + 1000009, + 1048, + '1968-01-01 00:00:00.000000', + 125, + 2438, + 30000, + 14 + ), + ( + 1000010, + 1000010, + 1049, + '1968-01-01 00:00:00.000000', + 1000, + 900, + 30000, + 13 + ), + ( + 1000011, + 1000011, + 1022, + '1966-01-01 00:00:00.000000', + 30, + 3024, + 30000, + 18 + ), + ( + 1000012, + 1000012, + 1023, + '1968-01-01 00:00:00.000000', + 250, + 2116, + 30000, + 2 + ), + ( + 1000013, + 1000013, + 1050, + '1971-01-01 00:00:00.000000', + 250, + 1061, + 30000, + 2 + ), + ( + 1000014, + 1000014, + 1173, + '1968-01-01 00:00:00.000000', + 500, + 864, + 30000, + 11 + ), + ( + 1000015, + 1000015, + 1174, + '1957-01-01 00:00:00.000000', + 500, + 854, + 30000, + 6 + ), + ( + 1000016, + 1000016, + 1124, + '1964-01-01 00:00:00.000000', + 250, + 1095, + 30000, + 13 + ), + ( + 1000017, + 1000017, + 1125, + '1957-01-01 00:00:00.000000', + 125, + 2459, + 30000, + 12 + ), + ( + 1000018, + 1000018, + 1126, + '1967-01-01 00:00:00.000000', + 250, + 1175, + 30000, + 13 + ), + ( + 1000019, + 1000019, + 1175, + '1965-01-01 00:00:00.000000', + 60, + 2520, + 30000, + 5 + ), + ( + 1000020, + 1000020, + 1243, + '1935-01-01 00:00:00.000000', + 60, + 782, + 30000, + 10 + ), + ( + 1000021, + 1000021, + 1244, + '1955-01-01 00:00:00.000000', + 1000, + 648, + 30000, + 12 + ), + ( + 1000022, + 1000022, + 1245, + '1958-01-01 00:00:00.000000', + 500, + 832, + 30000, + 19 + ), + ( + 1000023, + 1000023, + 1246, + '1966-01-01 00:00:00.000000', + 60, + 2941, + 30000, + 5 + ), + ( + 1000024, + 1000024, + 1247, + '1967-01-01 00:00:00.000000', + 0, + 5423, + 30000, + 5 + ), + ( + 1000025, + 1000025, + 1248, + '1967-01-01 00:00:00.000000', + 30, + 4750, + 30000, + 5 + ), + ( + 1000026, + 1000026, + 1249, + '1957-01-01 00:00:00.000000', + 250, + 551, + 30000, + 15 + ), + ( + 1000027, + 1000027, + 1250, + '1970-01-01 00:00:00.000000', + 250, + 1418, + 30000, + 17 + ), + ( + 1000028, + 1000028, + 1251, + '1969-01-01 00:00:00.000000', + 125, + 1813, + 30000, + 17 + ), + ( + 1000029, + 1000029, + 1252, + '1972-01-01 00:00:00.000000', + 125, + 2157, + 30000, + 16 + ), + ( + 1000030, + 1000030, + 1253, + '1961-01-01 00:00:00.000000', + 500, + 928, + 30000, + 3 + ), + ( + 1000031, + 1000031, + 1255, + '1962-01-01 00:00:00.000000', + 125, + 2488, + 30000, + 3 + ), + ( + 1000032, + 1000032, + 1256, + '1964-01-01 00:00:00.000000', + 125, + 2967, + 30000, + 3 + ), + ( + 1000033, + 1000033, + 1254, + '1965-01-01 00:00:00.000000', + 0, + 10062, + 30000, + 3 + ), + ( + 1000034, + 1000034, + 1257, + '1968-01-01 00:00:00.000000', + 250, + 1639, + 30000, + 17 + ), + ( + 1000035, + 1000035, + 1258, + '1970-01-01 00:00:00.000000', + 125, + 2682, + 30000, + 17 + ), + ( + 1000037, + 1000037, + 1260, + '1959-01-01 00:00:00.000000', + 125, + 1987, + 30000, + 13 + ), + ( + 1000038, + 1000038, + 1261, + '1962-01-01 00:00:00.000000', + 125, + 2300, + 30000, + 1 + ), + ( + 1000039, + 1000039, + 1262, + '1962-01-01 00:00:00.000000', + 0, + 3911, + 30000, + 1 + ), + ( + 1000040, + 1000040, + 1337, + '1990-01-01 00:00:00.000000', + 60, + 4780, + 30000, + 6 + ), + ( + 1000041, + 1000041, + 1338, + '1990-01-01 00:00:00.000000', + 60, + 5214, + 30000, + 6 + ), + ( + 1000042, + 1000043, + 1339, + '1990-01-01 00:00:00.000000', + 60, + 5021, + 30000, + 6 + ), + ( + 1000043, + 1000042, + 1340, + '1990-01-01 00:00:00.000000', + 60, + 4587, + 30000, + 6 + ), + ( + 1000044, + 1000044, + 1341, + '1990-01-01 00:00:00.000000', + 60, + 5414, + 30000, + 5 + ), + ( + 1000045, + 1000045, + 1342, + '1990-01-01 00:00:00.000000', + 60, + 5414, + 30000, + 5 + ), + ( + 1000046, + 1000046, + 1343, + '1990-01-01 00:00:00.000000', + 60, + 5200, + 30000, + 5 + ), + ( + 1000047, + 1000047, + 1344, + '1990-01-01 00:00:00.000000', + 60, + 6008, + 30000, + 6 + ), + ( + 1000048, + 1000048, + 1499, + '1970-01-01 00:00:00.000000', + 125, + 995, + 30000, + 7 + ), + ( + 1000049, + 1000049, + 1573, + '1963-01-01 00:00:00.000000', + 125, + 2817, + 30000, + 13 + ), + ( + 1000050, + 1000050, + 1574, + '1963-01-01 00:00:00.000000', + 0, + 3511, + 30000, + 13 + ), + ( + 1000051, + 1000051, + 1580, + '1968-01-01 00:00:00.000000', + 250, + 2166, + 30000, + 13 + ), + ( + 1000052, + 1000052, + 1613, + '1965-01-01 00:00:00.000000', + 125, + 2806, + 30000, + 3 + ), + ( + 1000053, + 1000053, + 1624, + '1962-01-01 00:00:00.000000', + 125, + 2144, + 30000, + 3 + ), + ( + 1000054, + 1000054, + 1647, + '1969-01-01 00:00:00.000000', + 0, + 6385, + 30000, + 17 + ), + ( + 1000055, + 1000055, + 1675, + '1964-01-01 00:00:00.000000', + 60, + 3574, + 30000, + 1 + ), + ( + 1000057, + 1000057, + 1961, + '1963-01-01 00:00:00.000000', + 500, + 796, + 30000, + 19 + ), + ( + 1000058, + 1000058, + 1962, + '1971-01-01 00:00:00.000000', + 30, + 3601, + 30000, + 16 + ), + ( + 1000060, + 1000060, + 1965, + '1953-01-01 00:00:00.000000', + 500, + 773, + 30000, + 21 + ), + ( + 1000061, + 1000061, + 1966, + '1965-01-01 00:00:00.000000', + 60, + 1052, + 30000, + 4 + ), + ( + 1000063, + 1000063, + 1968, + '1971-01-01 00:00:00.000000', + 1000, + 898, + 30000, + 7 + ), + ( + 1000064, + 1000064, + 1969, + '1971-01-01 00:00:00.000000', + 1000, + 855, + 30000, + 8 + ), + ( + 1000065, + 1000065, + 1970, + '1968-01-01 00:00:00.000000', + 1000, + 853, + 30000, + 8 + ), + ( + 1000066, + 1000066, + 1971, + '1968-01-01 00:00:00.000000', + 125, + 1008, + 30000, + 8 + ), + ( + 1000067, + 1000067, + 1972, + '1949-01-01 00:00:00.000000', + 125, + 596, + 30000, + 9 + ), + ( + 1000068, + 1000068, + 1973, + '1959-01-01 00:00:00.000000', + 60, + 2074, + 30000, + 9 + ), + ( + 1000069, + 1000069, + 1974, + '1955-01-01 00:00:00.000000', + 500, + 837, + 30000, + 6 + ), + ( + 1000070, + 1000070, + 1975, + '1956-01-01 00:00:00.000000', + 500, + 835, + 30000, + 6 + ), + ( + 1000071, + 1000071, + 1976, + '1957-01-01 00:00:00.000000', + 500, + 1052, + 30000, + 6 + ), + ( + 1000072, + 1000072, + 1977, + '1961-01-01 00:00:00.000000', + 250, + 1226, + 30000, + 6 + ), + ( + 1000073, + 1000073, + 1978, + '1962-01-01 00:00:00.000000', + 125, + 2363, + 30000, + 6 + ), + ( + 1000074, + 1000074, + 1979, + '1968-01-01 00:00:00.000000', + 1000, + 863, + 30000, + 6 + ), + ( + 1000075, + 1000075, + 1980, + '1966-01-01 00:00:00.000000', + 500, + 1580, + 30000, + 5 + ), + ( + 1000076, + 1000076, + 1981, + '1969-01-01 00:00:00.000000', + 60, + 5530, + 30000, + 5 + ), + ( + 1000077, + 1000077, + 1982, + '1971-01-01 00:00:00.000000', + 125, + 2570, + 30000, + 5 + ), + ( + 1000078, + 1000078, + 1983, + '1968-01-01 00:00:00.000000', + 125, + 769, + 30000, + 11 + ), + ( + 1000079, + 1000079, + 1984, + '1969-01-01 00:00:00.000000', + 125, + 1355, + 30000, + 11 + ), + ( + 1000080, + 1000080, + 1985, + '1966-01-01 00:00:00.000000', + 500, + 869, + 30000, + 12 + ), + ( + 1000081, + 1000081, + 1986, + '1968-01-01 00:00:00.000000', + 1000, + 646, + 30000, + 12 + ), + ( + 1000082, + 1000017, + 1987, + '1968-01-01 00:00:00.000000', + 125, + 2459, + 30000, + 12 + ), + ( + 1000083, + 1000083, + 1988, + '1967-01-01 00:00:00.000000', + 250, + 1380, + 30000, + 12 + ), + ( + 1000084, + 1000084, + 1989, + '1966-01-01 00:00:00.000000', + 1000, + 873, + 30000, + 13 + ), + ( + 1000085, + 1000085, + 1990, + '1970-01-01 00:00:00.000000', + 500, + 971, + 30000, + 13 + ), + ( + 1000086, + 1000086, + 1991, + '1961-01-01 00:00:00.000000', + 125, + 2291, + 30000, + 13 + ), + ( + 1000087, + 1000129, + 2081, + '1962-01-01 00:00:00.000000', + 125, + 2854, + 30000, + 13 + ), + ( + 1000088, + 1000087, + 1992, + '1964-01-01 00:00:00.000000', + 125, + 2229, + 30000, + 13 + ), + ( + 1000089, + 1000088, + 1993, + '1965-01-01 00:00:00.000000', + 250, + 1119, + 30000, + 13 + ), + ( + 1000090, + 1000089, + 1994, + '1970-01-01 00:00:00.000000', + 500, + 1099, + 30000, + 13 + ), + ( + 1000091, + 1000090, + 1995, + '1970-01-01 00:00:00.000000', + 500, + 1043, + 30000, + 13 + ), + ( + 1000092, + 1000091, + 1996, + '1973-01-01 00:00:00.000000', + 250, + 2140, + 30000, + 13 + ), + ( + 1000093, + 1000092, + 1997, + '1955-01-01 00:00:00.000000', + 250, + 545, + 30000, + 15 + ), + ( + 1000094, + 1000093, + 1998, + '1955-01-01 00:00:00.000000', + 500, + 533, + 30000, + 15 + ), + ( + 1000095, + 1000094, + 1999, + '1955-01-01 00:00:00.000000', + 500, + 537, + 30000, + 15 + ), + ( + 1000096, + 1000095, + 2000, + '1956-01-01 00:00:00.000000', + 500, + 538, + 30000, + 15 + ), + ( + 1000097, + 1000096, + 2001, + '1956-01-01 00:00:00.000000', + 500, + 533, + 30000, + 15 + ), + ( + 1000098, + 1000097, + 2002, + '1957-01-01 00:00:00.000000', + 1000, + 552, + 30000, + 15 + ), + ( + 1000099, + 1000098, + 2003, + '1957-01-01 00:00:00.000000', + 500, + 595, + 30000, + 15 + ), + ( + 1000100, + 1000099, + 2004, + '1957-01-01 00:00:00.000000', + 500, + 554, + 30000, + 15 + ), + ( + 1000101, + 1000100, + 2005, + '1958-01-01 00:00:00.000000', + 1000, + 551, + 30000, + 15 + ), + ( + 1000102, + 1000101, + 2006, + '1959-01-01 00:00:00.000000', + 500, + 583, + 30000, + 15 + ), + ( + 1000103, + 1000102, + 2007, + '1963-01-01 00:00:00.000000', + 125, + 3293, + 30000, + 3 + ), + ( + 1000104, + 1000103, + 2008, + '1964-01-01 00:00:00.000000', + 125, + 2287, + 30000, + 3 + ), + ( + 1000105, + 1000104, + 2009, + '1964-01-01 00:00:00.000000', + 500, + 1012, + 30000, + 3 + ), + ( + 1000106, + 1000105, + 2010, + '1964-01-01 00:00:00.000000', + 500, + 908, + 30000, + 3 + ), + ( + 1000107, + 1000106, + 2011, + '1970-01-01 00:00:00.000000', + 250, + 1434, + 30000, + 16 + ), + ( + 1000108, + 1000107, + 2012, + '1970-01-01 00:00:00.000000', + 125, + 2925, + 30000, + 16 + ), + ( + 1000109, + 1000108, + 2013, + '1971-01-01 00:00:00.000000', + 500, + 1454, + 30000, + 16 + ), + ( + 1000110, + 1000109, + 2014, + '1972-01-01 00:00:00.000000', + 250, + 1410, + 30000, + 16 + ), + ( + 1000112, + 1000111, + 2016, + '1971-01-01 00:00:00.000000', + 250, + 1559, + 30000, + 17 + ), + ( + 1000113, + 1000112, + 2017, + '1959-01-01 00:00:00.000000', + 125, + 2030, + 30000, + 1 + ), + ( + 1000114, + 1000113, + 2018, + '1963-01-01 00:00:00.000000', + 500, + 940, + 30000, + 1 + ), + ( + 1000115, + 1000114, + 2019, + '1965-01-01 00:00:00.000000', + 1000, + 887, + 30000, + 1 + ), + ( + 1000116, + 1000115, + 2020, + '1964-01-01 00:00:00.000000', + 1000, + 838, + 30000, + 2 + ), + ( + 1000117, + 1000116, + 2021, + '1965-01-01 00:00:00.000000', + 250, + 1117, + 30000, + 2 + ), + ( + 1000118, + 1000117, + 2022, + '1968-01-01 00:00:00.000000', + 1000, + 838, + 30000, + 2 + ), + ( + 1000119, + 1000118, + 2023, + '1967-01-01 00:00:00.000000', + 500, + 842, + 30000, + 2 + ), + ( + 1000120, + 1000119, + 2034, + '1966-01-01 00:00:00.000000', + 500, + 982, + 30000, + 1 + ), + ( + 1000121, + 1000120, + 2037, + '1962-01-01 00:00:00.000000', + 125, + 2116, + 30000, + 6 + ), + ( + 1000122, + 1000121, + 2042, + '1969-01-01 00:00:00.000000', + 500, + 1018, + 30000, + 6 + ), + ( + 1000123, + 1000122, + 2048, + '1957-01-01 00:00:00.000000', + 500, + 831, + 30000, + 6 + ), + ( + 1000124, + 1000120, + 2050, + '1962-01-01 00:00:00.000000', + 125, + 2116, + 30000, + 6 + ), + ( + 1000125, + 1000124, + 2051, + '1962-01-01 00:00:00.000000', + 125, + 2844, + 30000, + 6 + ), + ( + 1000126, + 1000056, + 2055, + '1962-01-01 00:00:00.000000', + 500, + 855, + 30000, + 19 + ), + ( + 1000127, + 1000125, + 2060, + '1966-01-01 00:00:00.000000', + 125, + 2278, + 30000, + 5 + ), + ( + 1000128, + 1000126, + 2070, + '1960-01-01 00:00:00.000000', + 500, + 1027, + 30000, + 13 + ), + ( + 1000129, + 1000127, + 2076, + '1960-01-01 00:00:00.000000', + 125, + 2192, + 30000, + 13 + ), + ( + 1000130, + 1000128, + 2078, + '1962-01-01 00:00:00.000000', + 250, + 1200, + 30000, + 13 + ), + ( + 1000131, + 1000130, + 2084, + '1970-01-01 00:00:00.000000', + 15, + 2660, + 30000, + 13 + ), + ( + 1000132, + 1000131, + 2086, + '1958-01-01 00:00:00.000000', + 250, + 2033, + 30000, + 3 + ), + ( + 1000133, + 1000132, + 2088, + '1960-01-01 00:00:00.000000', + 1000, + 892, + 30000, + 3 + ), + ( + 1000134, + 1000133, + 2094, + '1966-01-01 00:00:00.000000', + 250, + 1115, + 30000, + 3 + ), + ( + 1000135, + 1000134, + 2096, + '1962-01-01 00:00:00.000000', + 1000, + 814, + 30000, + 4 + ), + ( + 1000136, + 1000135, + 2098, + '1963-01-01 00:00:00.000000', + 250, + 1036, + 30000, + 4 + ), + ( + 1000137, + 1000136, + 2101, + '1963-01-01 00:00:00.000000', + 1000, + 813, + 30000, + 4 + ), + ( + 1000138, + 1000137, + 2102, + '1965-01-01 00:00:00.000000', + 250, + 928, + 30000, + 4 + ), + ( + 1000139, + 1000138, + 2103, + '1969-01-01 00:00:00.000000', + 125, + 2615, + 30000, + 4 + ), + ( + 1000140, + 1000139, + 2106, + '1969-01-01 00:00:00.000000', + 500, + 879, + 30000, + 4 + ), + ( + 1000141, + 1000140, + 2107, + '1969-01-01 00:00:00.000000', + 250, + 1308, + 30000, + 4 + ), + ( + 1000142, + 1000141, + 2110, + '1971-01-01 00:00:00.000000', + 1000, + 938, + 30000, + 1 + ), + ( + 1000143, + 1000142, + 2112, + '1964-01-01 00:00:00.000000', + 60, + 2756, + 30000, + 1 + ), + ( + 1000144, + 1000143, + 2113, + '1964-01-01 00:00:00.000000', + 250, + 1128, + 30000, + 1 + ), + ( + 1000145, + 1000144, + 2218, + '1970-01-01 00:00:00.000000', + 125, + 2039, + 30000, + 7 + ), + ( + 1000146, + 1000145, + 2388, + '1973-01-01 00:00:00.000000', + 1000, + 952, + 30000, + 13 + ), + ( + 1000147, + 1000146, + 2424, + '1973-01-01 00:00:00.000000', + 125, + 1427, + 30000, + 5 + ), + ( + 1000148, + 1000147, + 2452, + '1960-01-01 00:00:00.000000', + 0, + 491, + 30000, + 6 + ), + ( + 1000149, + 1000148, + 2455, + '1966-01-01 00:00:00.000000', + 1000, + 1821, + 30000, + 14 + ), + ( + 1000150, + 1000149, + 2456, + '1969-01-01 00:00:00.000000', + 500, + 1898, + 30000, + 14 + ), + ( + 1000151, + 1000150, + 2457, + '1970-01-01 00:00:00.000000', + 250, + 1997, + 30000, + 14 + ), + ( + 1000152, + 1000151, + 2458, + '1970-01-01 00:00:00.000000', + 125, + 2291, + 30000, + 14 + ), + ( + 1000153, + 1000017, + 2467, + '1964-01-01 00:00:00.000000', + 0, + 2459, + 30000, + 18 + ), + ( + 1000154, + 1000152, + 2480, + '1940-01-01 00:00:00.000000', + 1, + 606, + 30000, + 20 + ), + ( + 1000155, + 1000153, + 2538, + '1957-01-01 00:00:00.000000', + 125, + 1051, + 30000, + 7 + ), + ( + 1000156, + 1000154, + 2549, + '1963-01-01 00:00:00.000000', + 15, + 2154, + 30000, + 19 + ), + ( + 1000157, + 1000155, + 2559, + '1942-03-14 00:00:00.000000', + 60, + 599, + 30000, + 20 + ), + ( + 1000158, + 1000156, + 2560, + '1942-05-16 00:00:00.000000', + 60, + 593, + 30000, + 20 + ), + ( + 1000159, + 1000157, + 2561, + '1946-04-17 00:00:00.000000', + 60, + 930, + 30000, + 20 + ), + ( + 1000160, + 1000158, + 2562, + '1947-08-20 00:00:00.000000', + 60, + 1724, + 30000, + 20 + ), + ( + 1000161, + 1000159, + 2563, + '1962-02-12 00:00:00.000000', + 250, + 793, + 30000, + 21 + ), + ( + 1000162, + 1000160, + 2564, + '1955-04-17 00:00:00.000000', + 250, + 1791, + 30000, + 21 + ), + ( + 1000163, + 1000161, + 2565, + '1960-06-11 00:00:00.000000', + 125, + 947, + 30000, + 21 + ), + ( + 1000164, + 1000162, + 2566, + '1959-07-11 00:00:00.000000', + 60, + 1016, + 30000, + 21 + ), + ( + 1000165, + 1000163, + 2567, + '1957-05-16 00:00:00.000000', + 60, + 1899, + 30000, + 9 + ), + ( + 1000166, + 1000164, + 2568, + '1958-07-11 00:00:00.000000', + 60, + 1943, + 30000, + 9 + ), + ( + 1000167, + 1000165, + 2569, + '1967-08-24 00:00:00.000000', + 30, + 3530, + 30000, + 18 + ), + ( + 1000168, + 1000166, + 2570, + '1968-04-15 00:00:00.000000', + 15, + 3631, + 30000, + 18 + ), + ( + 1000169, + 1000167, + 2667, + '1995-01-01 00:00:00.000000', + 30, + 2420, + 30000, + 10 + ), + ( + 1000170, + 1000168, + 2697, + '1995-01-01 00:00:00.000000', + 0, + 9237, + 30000, + 5 + ), + ( + 1000171, + 1000169, + 2755, + '1971-01-01 00:00:00.000000', + 0, + 5296, + 30000, + 14 + ), + ( + 1000172, + 1000170, + 2771, + '1971-01-01 00:00:00.000000', + 250, + 1933, + 30000, + 14 + ), + ( + 1000173, + 1000171, + 2772, + '1972-01-01 00:00:00.000000', + 500, + 1911, + 30000, + 14 + ), + ( + 1000174, + 1000173, + 2873, + '1970-01-01 00:00:00.000000', + 125, + 2606, + 30000, + 4 + ), + ( + 1000175, + 1000174, + 2874, + '1968-01-01 00:00:00.000000', + 30, + 1798, + 30000, + 4 + ), + ( + 1000176, + 1000172, + 2875, + '1971-01-01 00:00:00.000000', + 500, + 854, + 30000, + 4 + ), + ( + 1100001, + 1100001, + 1727, + '1999-01-01 00:00:00.000000', + 1000, + 444, + 30000, + 6 + ), + ( + 1100002, + 1100017, + 1728, + '1960-01-01 00:00:00.000000', + 1000, + 467, + 30000, + 2 + ), + ( + 1100003, + 1100003, + 167, + '1999-01-01 00:00:00.000000', + 125, + 1308, + 30000, + 2 + ), + ( + 1100004, + 1100004, + 1729, + '1999-01-01 00:00:00.000000', + 125, + 1403, + 30000, + 2 + ), + ( + 1100005, + 1100005, + 1726, + '1999-01-01 00:00:00.000000', + 1000, + 452, + 30000, + 4 + ), + ( + 1100006, + 1100006, + 1730, + '1999-01-01 00:00:00.000000', + 30, + 2111, + 30000, + 2 + ), + ( + 1100007, + 1100007, + 1731, + '1999-01-01 00:00:00.000000', + 30, + 2734, + 30000, + 2 + ), + ( + 1100008, + 1100008, + 1733, + '1999-01-01 00:00:00.000000', + 30, + 2772, + 30000, + 2 + ), + ( + 1100009, + 1100009, + 1732, + '1999-01-01 00:00:00.000000', + 30, + 3458, + 30000, + 2 + ), + ( + 1100010, + 1100018, + 1308, + '1966-01-01 00:00:00.000000', + 1000, + 498, + 30000, + 3 + ), + ( + 1100011, + 1100011, + 1309, + '1999-01-01 00:00:00.000000', + 1000, + 460, + 30000, + 7 + ), + ( + 1100012, + 1100012, + 1310, + '1999-01-01 00:00:00.000000', + 1000, + 454, + 30000, + 8 + ), + ( + 1100013, + 1100013, + 1311, + '1999-01-01 00:00:00.000000', + 1000, + 1052, + 30000, + 9 + ), + ( + 1100014, + 1100014, + 1312, + '1999-01-01 00:00:00.000000', + 1000, + 480, + 30000, + 5 + ), + ( + 1100015, + 1100016, + 1313, + '1999-01-01 00:00:00.000000', + 1000, + 485, + 30000, + 1 + ), + ( + 1100016, + 1100020, + 1314, + '1999-01-01 00:00:00.000000', + 1000, + 416, + 30000, + 10 + ), + ( + 1100017, + 1100021, + 1315, + '1999-01-01 00:00:00.000000', + 1000, + 472, + 30000, + 12 + ), + ( + 1100018, + 1100022, + 1316, + '1968-01-01 00:00:00.000000', + 1000, + 468, + 30000, + 11 + ), + ( + 1100019, + 1100023, + 1317, + '1999-01-01 00:00:00.000000', + 1000, + 442, + 30000, + 14 + ), + ( + 1100020, + 1100024, + 1318, + '1999-01-01 00:00:00.000000', + 1000, + 468, + 30000, + 13 + ), + ( + 1100021, + 1100002, + 1319, + '1999-01-01 00:00:00.000000', + 500, + 734, + 30000, + 2 + ), + ( + 1100022, + 1100025, + 1320, + '1956-01-01 00:00:00.000000', + 500, + 460, + 30000, + 6 + ), + ( + 1100023, + 1100026, + 1321, + '1957-01-01 00:00:00.000000', + 60, + 1572, + 30000, + 6 + ), + ( + 1100024, + 1100010, + 1307, + '1990-01-01 00:00:00.000000', + 30, + 1632, + 30000, + 2 + ), + ( + 1100025, + 1100015, + 1322, + '1956-01-01 00:00:00.000000', + 250, + 1040, + 30000, + 6 + ), + ( + 1100026, + 1100028, + 1323, + '1957-01-01 00:00:00.000000', + 250, + 1078, + 30000, + 5 + ), + ( + 1100027, + 1100029, + 1324, + '1970-01-01 00:00:00.000000', + 60, + 1725, + 30000, + 5 + ), + ( + 1100028, + 1100030, + 1325, + '1968-01-01 00:00:00.000000', + 500, + 495, + 30000, + 7 + ), + ( + 1100029, + 1100031, + 1326, + '1969-01-01 00:00:00.000000', + 250, + 1052, + 30000, + 7 + ), + ( + 1100030, + 1100032, + 1327, + '1969-01-01 00:00:00.000000', + 250, + 1082, + 30000, + 7 + ), + ( + 1100031, + 1100033, + 1328, + '1968-01-01 00:00:00.000000', + 250, + 1084, + 30000, + 11 + ), + ( + 1100032, + 1100034, + 1329, + '1967-01-01 00:00:00.000000', + 250, + 1091, + 30000, + 12 + ), + ( + 1100033, + 1100035, + 1330, + '1959-01-01 00:00:00.000000', + 60, + 1697, + 30000, + 13 + ), + ( + 1100034, + 1100036, + 1331, + '1967-01-01 00:00:00.000000', + 125, + 1028, + 30000, + 13 + ), + ( + 1100035, + 1100037, + 1332, + '1969-01-01 00:00:00.000000', + 250, + 1084, + 30000, + 13 + ), + ( + 1100036, + 1100039, + 1333, + '1963-01-01 00:00:00.000000', + 250, + 1089, + 30000, + 13 + ), + ( + 1100037, + 1100038, + 1334, + '1961-01-01 00:00:00.000000', + 60, + 1745, + 30000, + 13 + ), + ( + 1100038, + 1100040, + 1336, + '1956-01-01 00:00:00.000000', + 500, + 435, + 30000, + 15 + ), + ( + 1100039, + 1100041, + 1345, + '1961-01-01 00:00:00.000000', + 250, + 1106, + 30000, + 3 + ), + ( + 1100040, + 1100042, + 1346, + '1962-01-01 00:00:00.000000', + 250, + 1124, + 30000, + 3 + ), + ( + 1100041, + 1100043, + 1347, + '1967-01-01 00:00:00.000000', + 0, + 4598, + 30000, + 3 + ), + ( + 1100042, + 1100044, + 1348, + '1966-01-01 00:00:00.000000', + 250, + 1402, + 30000, + 3 + ), + ( + 1100043, + 1100045, + 1349, + '1971-01-01 00:00:00.000000', + 60, + 2187, + 30000, + 17 + ), + ( + 1100044, + 1100046, + 1359, + '1963-01-01 00:00:00.000000', + 250, + 1086, + 30000, + 1 + ), + ( + 1100045, + 1100049, + 1362, + '1964-01-01 00:00:00.000000', + 30, + 3404, + 30000, + 18 + ), + ( + 1100046, + 1100047, + 1360, + '1962-01-01 00:00:00.000000', + 250, + 1086, + 30000, + 1 + ), + ( + 1100047, + 1100048, + 1361, + '1964-01-01 00:00:00.000000', + 60, + 1740, + 30000, + 1 + ), + ( + 1100048, + 1100050, + 1363, + '1971-01-01 00:00:00.000000', + 250, + 1054, + 30000, + 2 + ), + ( + 1100049, + 1100051, + 1364, + '1966-01-01 00:00:00.000000', + 125, + 1330, + 30000, + 14 + ), + ( + 1100050, + 1100052, + 1365, + '1970-01-01 00:00:00.000000', + 60, + 1694, + 30000, + 14 + ), + ( + 1100052, + 1100054, + 1367, + '1999-01-01 00:00:00.000000', + 30, + 2786, + 30000, + 9 + ), + ( + 1100053, + 1100055, + 1368, + '1999-01-01 00:00:00.000000', + 30, + 2747, + 30000, + 7 + ), + ( + 1100054, + 1100056, + 1369, + '1999-01-01 00:00:00.000000', + 30, + 2747, + 30000, + 8 + ), + ( + 1100055, + 1100057, + 1370, + '1999-01-01 00:00:00.000000', + 30, + 2835, + 30000, + 5 + ), + ( + 1100056, + 1100058, + 1371, + '1999-01-01 00:00:00.000000', + 30, + 2742, + 30000, + 6 + ), + ( + 1100057, + 1100059, + 1372, + '1999-01-01 00:00:00.000000', + 30, + 2772, + 30000, + 1 + ), + ( + 1100058, + 1100060, + 1373, + '1999-01-01 00:00:00.000000', + 30, + 2890, + 30000, + 3 + ), + ( + 1100059, + 1100061, + 1374, + '1999-01-01 00:00:00.000000', + 30, + 2846, + 30000, + 4 + ), + ( + 1100060, + 1100062, + 1375, + '1999-01-01 00:00:00.000000', + 30, + 2846, + 30000, + 12 + ), + ( + 1100061, + 1100063, + 1376, + '1999-01-01 00:00:00.000000', + 30, + 2846, + 30000, + 11 + ), + ( + 1100062, + 1100064, + 1377, + '1999-01-01 00:00:00.000000', + 30, + 2772, + 30000, + 13 + ), + ( + 1100063, + 1100065, + 1378, + '1965-01-01 00:00:00.000000', + 0, + 1024, + 30000, + 18 + ), + ( + 1100064, + 1100066, + 1379, + '1999-01-01 00:00:00.000000', + 30, + 3520, + 30000, + 1 + ), + ( + 1100065, + 1100067, + 1380, + '1999-01-01 00:00:00.000000', + 30, + 3520, + 30000, + 7 + ), + ( + 1100066, + 1100068, + 1381, + '1999-01-01 00:00:00.000000', + 30, + 3458, + 30000, + 8 + ), + ( + 1100067, + 1100069, + 1382, + '1999-01-01 00:00:00.000000', + 30, + 3597, + 30000, + 5 + ), + ( + 1100068, + 1100070, + 1383, + '1999-01-01 00:00:00.000000', + 30, + 3458, + 30000, + 6 + ), + ( + 1100069, + 1100071, + 1385, + '1999-01-01 00:00:00.000000', + 30, + 3501, + 30000, + 3 + ), + ( + 1100070, + 1100072, + 1386, + '1999-01-01 00:00:00.000000', + 30, + 3494, + 30000, + 4 + ), + ( + 1100071, + 1100073, + 1387, + '1999-01-01 00:00:00.000000', + 30, + 3597, + 30000, + 12 + ), + ( + 1100072, + 1100074, + 1390, + '1999-01-01 00:00:00.000000', + 30, + 3458, + 30000, + 11 + ), + ( + 1100073, + 1100075, + 1391, + '1999-01-01 00:00:00.000000', + 30, + 3520, + 30000, + 13 + ), + ( + 1100074, + 1100076, + 1392, + '1999-01-01 00:00:00.000000', + 30, + 3520, + 30000, + 19 + ), + ( + 1100075, + 1100077, + 1393, + '1999-01-01 00:00:00.000000', + 125, + 1320, + 30000, + 6 + ), + ( + 1100076, + 1100078, + 1394, + '1999-01-01 00:00:00.000000', + 125, + 1355, + 30000, + 4 + ), + ( + 1100077, + 1100079, + 1396, + '1999-01-01 00:00:00.000000', + 125, + 1367, + 30000, + 3 + ), + ( + 1100078, + 1100080, + 1397, + '1999-01-01 00:00:00.000000', + 125, + 1388, + 30000, + 1 + ), + ( + 1100079, + 1100081, + 1398, + '1999-01-01 00:00:00.000000', + 125, + 1388, + 30000, + 7 + ), + ( + 1100080, + 1100082, + 1399, + '1999-01-01 00:00:00.000000', + 125, + 1491, + 30000, + 5 + ), + ( + 1100081, + 1100083, + 1400, + '1999-01-01 00:00:00.000000', + 125, + 1403, + 30000, + 6 + ), + ( + 1100082, + 1100084, + 1401, + '1999-01-01 00:00:00.000000', + 125, + 1494, + 30000, + 3 + ), + ( + 1100083, + 1100085, + 1402, + '1999-01-01 00:00:00.000000', + 125, + 1414, + 30000, + 4 + ), + ( + 1100085, + 1100087, + 1404, + '1999-01-01 00:00:00.000000', + 125, + 1414, + 30000, + 11 + ), + ( + 1100086, + 1100088, + 1405, + '1999-01-01 00:00:00.000000', + 125, + 1367, + 30000, + 13 + ), + ( + 1100088, + 1100090, + 1410, + '1999-01-01 00:00:00.000000', + 30, + 1672, + 30000, + 1 + ), + ( + 1100090, + 1100092, + 1412, + '1999-01-01 00:00:00.000000', + 30, + 1752, + 30000, + 5 + ), + ( + 1100091, + 1100093, + 1413, + '1999-01-01 00:00:00.000000', + 30, + 1683, + 30000, + 6 + ), + ( + 1100092, + 1100094, + 1414, + '1999-01-01 00:00:00.000000', + 30, + 1791, + 30000, + 3 + ), + ( + 1100093, + 1100095, + 1415, + '1999-01-01 00:00:00.000000', + 60, + 1678, + 30000, + 4 + ), + ( + 1100096, + 1100098, + 1418, + '1999-01-01 00:00:00.000000', + 30, + 1668, + 30000, + 13 + ), + ( + 1100098, + 1100100, + 2065, + '1968-01-01 00:00:00.000000', + 250, + 1065, + 30000, + 12 + ), + ( + 1100099, + 1100101, + 2068, + '1959-01-01 00:00:00.000000', + 250, + 1028, + 30000, + 13 + ), + ( + 1100100, + 1100102, + 2072, + '1959-01-01 00:00:00.000000', + 250, + 1091, + 32000, + 13 + ), + ( + 1100101, + 1100019, + 2100, + '1964-01-01 00:00:00.000000', + 250, + 1033, + 30000, + 4 + ), + ( + 1100102, + 1100104, + 2421, + '1965-01-01 00:00:00.000000', + 125, + 460, + 30000, + 4 + ), + ( + 1100103, + 1100105, + 2432, + '1965-01-01 00:00:00.000000', + 125, + 963, + 30000, + 10 + ), + ( + 1100104, + 1100106, + 2443, + '1960-01-01 00:00:00.000000', + 250, + 483, + 30000, + 8 + ), + ( + 1100105, + 1100107, + 2444, + '1968-01-01 00:00:00.000000', + 125, + 1085, + 30000, + 9 + ), + ( + 1100106, + 1100108, + 2445, + '1967-01-01 00:00:00.000000', + 125, + 1092, + 30000, + 5 + ), + ( + 1100107, + 1100109, + 2446, + '1957-01-01 00:00:00.000000', + 500, + 467, + 30000, + 6 + ), + ( + 1100108, + 1100110, + 2447, + '1965-01-01 00:00:00.000000', + 125, + 1049, + 30000, + 1 + ), + ( + 1100109, + 1100111, + 2448, + '1968-01-01 00:00:00.000000', + 250, + 483, + 30000, + 12 + ), + ( + 1100110, + 1100112, + 2449, + '1955-01-01 00:00:00.000000', + 125, + 1092, + 30000, + 13 + ), + ( + 1100111, + 1100113, + 2453, + '1960-01-01 00:00:00.000000', + 0, + 394, + 30000, + 6 + ), + ( + 1100112, + 1100114, + 2474, + '1940-01-01 00:00:00.000000', + 1000, + 462, + 30000, + 20 + ), + ( + 1100113, + 1100115, + 2482, + '1953-01-01 00:00:00.000000', + 1000, + 500, + 30000, + 21 + ), + ( + 1100114, + 1100116, + 2494, + '1970-01-01 00:00:00.000000', + 1000, + 483, + 30000, + 16 + ), + ( + 1100115, + 1100117, + 2495, + '1971-01-01 00:00:00.000000', + 60, + 1443, + 30000, + 16 + ), + ( + 1100116, + 1100118, + 2496, + '1972-01-01 00:00:00.000000', + 125, + 531, + 30000, + 16 + ), + ( + 1100117, + 1100119, + 2508, + '1968-01-01 00:00:00.000000', + 1000, + 516, + 30000, + 17 + ), + ( + 1100118, + 1100120, + 2509, + '1968-01-01 00:00:00.000000', + 125, + 545, + 30000, + 17 + ), + ( + 1100119, + 1100121, + 2529, + '1954-01-01 00:00:00.000000', + 1000, + 396, + 30000, + 15 + ), + ( + 1100120, + 1100122, + 2542, + '1958-01-01 00:00:00.000000', + 1000, + 457, + 30000, + 19 + ), + ( + 1100121, + 1100123, + 2543, + '1958-01-01 00:00:00.000000', + 125, + 1096, + 30000, + 19 + ), + ( + 1100122, + 1100124, + 2544, + '1963-01-01 00:00:00.000000', + 30, + 1717, + 30000, + 19 + ), + ( + 1100123, + 1100125, + 2575, + '1955-03-21 00:00:00.000000', + 125, + 1003, + 30000, + 21 + ), + ( + 1100124, + 1100126, + 2576, + '1955-03-21 00:00:00.000000', + 125, + 1014, + 30000, + 21 + ), + ( + 1100125, + 1100127, + 2577, + '1947-01-15 00:00:00.000000', + 125, + 1012, + 30000, + 20 + ), + ( + 1100126, + 1100128, + 2578, + '1947-01-15 00:00:00.000000', + 60, + 1026, + 30000, + 20 + ), + ( + 1100127, + 1100129, + 2698, + '1964-01-01 00:00:00.000000', + 125, + 939, + 30000, + 15 + ), + ( + 1100128, + 1100130, + 2699, + '1995-01-01 00:00:00.000000', + 125, + 1355, + 30000, + 14 + ), + ( + 1100129, + 1100131, + 2700, + '1965-01-01 00:00:00.000000', + 250, + 483, + 30000, + 14 + ), + ( + 1100130, + 1100132, + 2701, + '1995-01-01 00:00:00.000000', + 125, + 1355, + 30000, + 11 + ), + ( + 1100131, + 1100133, + 2702, + '1995-01-01 00:00:00.000000', + 125, + 1384, + 30000, + 12 + ), + ( + 1100132, + 1100134, + 2871, + '1957-01-01 00:00:00.000000', + 1000, + 413, + 30000, + 15 + ), + ( + 1100133, + 1100135, + 2863, + '1957-01-01 00:00:00.000000', + 1000, + 427, + 30000, + 15 + ), + ( + 1100134, + 1100136, + 2864, + '1957-01-01 00:00:00.000000', + 1000, + 433, + 30000, + 15 + ), + ( + 1100135, + 1100137, + 2865, + '1957-01-01 00:00:00.000000', + 125, + 1385, + 30000, + 15 + ), + ( + 1100136, + 1100138, + 2866, + '1957-01-01 00:00:00.000000', + 125, + 1396, + 30000, + 15 + ), + ( + 1100137, + 1100139, + 2867, + '1957-01-01 00:00:00.000000', + 125, + 1426, + 30000, + 15 + ), + ( + 1100138, + 1100140, + 2868, + '1957-01-01 00:00:00.000000', + 125, + 1441, + 30000, + 15 + ), + ( + 1100139, + 1100141, + 2869, + '1957-01-01 00:00:00.000000', + 60, + 2363, + 30000, + 15 + ), + ( + 1100140, + 1100142, + 2870, + '1957-01-01 00:00:00.000000', + 60, + 2432, + 30000, + 15 + ), + ( + 1100141, + 1100148, + 3024, + '1963-01-01 00:00:00.000000', + 500, + 499, + 30000, + 21 + ), + ( + 1100142, + 1100149, + 3025, + '1963-01-01 00:00:00.000000', + 500, + 506, + 30000, + 21 + ), + ( + 1100143, + 1100143, + 3019, + '1963-01-01 00:00:00.000000', + 500, + 514, + 30000, + 21 + ), + ( + 1100144, + 1100144, + 3020, + '1963-01-01 00:00:00.000000', + 500, + 530, + 30000, + 21 + ), + ( + 1100145, + 1100145, + 3021, + '1963-01-01 00:00:00.000000', + 250, + 538, + 30000, + 21 + ), + ( + 1100146, + 1100146, + 3022, + '1963-01-01 00:00:00.000000', + 250, + 1086, + 30000, + 21 + ), + ( + 1100147, + 1100147, + 3023, + '1963-01-01 00:00:00.000000', + 125, + 1106, + 30000, + 21 + ), + ( + 1100148, + 1100159, + 3625, + '1968-01-01 00:00:00.000000', + 0, + 3447, + 30000, + 18 + ), + ( + 1100149, + 1100154, + 3620, + '1968-01-01 00:00:00.000000', + 250, + 554, + 30000, + 18 + ), + ( + 1100150, + 1100155, + 3619, + '1968-01-01 00:00:00.000000', + 125, + 2119, + 30000, + 18 + ), + ( + 1100151, + 1100156, + 3616, + '1968-01-01 00:00:00.000000', + 500, + 514, + 30000, + 9 + ), + ( + 1100152, + 1100153, + 3621, + '1968-01-01 00:00:00.000000', + 125, + 1547, + 30000, + 17 + ), + ( + 1100153, + 1100152, + 3622, + '1968-01-01 00:00:00.000000', + 125, + 1730, + 30000, + 16 + ), + ( + 1100154, + 1100158, + 3618, + '1968-01-01 00:00:00.000000', + 0, + 3385, + 30000, + 9 + ), + ( + 1100155, + 1100150, + 3624, + '1968-01-01 00:00:00.000000', + 250, + 545, + 30000, + 17 + ), + ( + 1100156, + 1100151, + 3623, + '1968-01-01 00:00:00.000000', + 250, + 473, + 30000, + 16 + ), + ( + 1100157, + 1100157, + 3617, + '1968-01-01 00:00:00.000000', + 250, + 524, + 30000, + 9 + ), + ( + 1100158, + 1100160, + 3650, + '1957-01-01 00:00:00.000000', + 500, + 454, + 30000, + 6 + ), + ( + 1100159, + 1100161, + 3773, + '1935-01-01 00:00:00.000000', + 60, + 960, + 30000, + 10 + ), + ( + 1200001, + 1200001, + 168, + '1958-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 5 + ), + ( + 1200002, + 1200002, + 169, + '1964-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 2 + ), + ( + 1200003, + 1200003, + 189, + '1999-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 3 + ), + ( + 1200004, + 1200004, + 892, + '1990-01-01 00:00:00.000000', + 60, + 705, + 30000, + 3 + ), + ( + 1200005, + 1200005, + 893, + '1970-01-01 00:00:00.000000', + 60, + 614, + 30000, + 17 + ), + ( + 1200006, + 1200006, + 1294, + '1966-01-01 00:00:00.000000', + 1000, + 128, + 30000, + 5 + ), + ( + 1200007, + 1200007, + 1299, + '1964-01-01 00:00:00.000000', + 125, + 556, + 30000, + 1 + ), + ( + 1200008, + 1200008, + 1465, + '1990-01-01 00:00:00.000000', + 125, + 160, + 30000, + 3 + ), + ( + 1200009, + 1200009, + 1469, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 3 + ), + ( + 1200010, + 1200010, + 1470, + '1990-01-01 00:00:00.000000', + 125, + 901, + 30000, + 3 + ), + ( + 1200011, + 1200011, + 1468, + '1990-01-01 00:00:00.000000', + 250, + 195, + 30000, + 3 + ), + ( + 1200012, + 1200012, + 1913, + '1990-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 7 + ), + ( + 1200013, + 1200013, + 1914, + '1953-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 21 + ), + ( + 1200014, + 1200014, + 1915, + '1990-01-01 00:00:00.000000', + 1000, + 361, + 30000, + 9 + ), + ( + 1200015, + 1200015, + 1916, + '1990-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 1 + ), + ( + 1200017, + 1200017, + 1918, + '1990-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 4 + ), + ( + 1200018, + 1200018, + 1919, + '1990-01-01 00:00:00.000000', + 100, + 74, + 30000, + 10 + ), + ( + 1200019, + 1200019, + 1920, + '1990-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 12 + ), + ( + 1200020, + 1200020, + 1921, + '1968-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 11 + ), + ( + 1200021, + 1200021, + 1922, + '1966-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 14 + ), + ( + 1200022, + 1200022, + 1923, + '1990-01-01 00:00:00.000000', + 1000, + 124, + 30000, + 8 + ), + ( + 1200023, + 1200023, + 1924, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 6 + ), + ( + 1200024, + 1200024, + 1925, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 5 + ), + ( + 1200025, + 1200025, + 1926, + '1990-01-01 00:00:00.000000', + 60, + 616, + 30000, + 5 + ), + ( + 1200026, + 1200026, + 1927, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 13 + ), + ( + 1200027, + 1200027, + 1928, + '1990-01-01 00:00:00.000000', + 125, + 506, + 30000, + 15 + ), + ( + 1200028, + 1200028, + 1929, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 3 + ), + ( + 1200029, + 1200029, + 1930, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 3 + ), + ( + 1200030, + 1200030, + 1931, + '1990-01-01 00:00:00.000000', + 0, + 671, + 30000, + 3 + ), + ( + 1200031, + 1200031, + 1932, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 3 + ), + ( + 1200032, + 1200032, + 1933, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 1 + ), + ( + 1200033, + 1200033, + 1934, + '1990-01-01 00:00:00.000000', + 125, + 561, + 30000, + 2 + ), + ( + 1200034, + 1200034, + 2036, + '1955-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 6 + ), + ( + 1200035, + 1200035, + 2039, + '1959-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 13 + ), + ( + 1200036, + 1200036, + 2077, + '1960-01-01 00:00:00.000000', + 125, + 561, + 30000, + 14 + ), + ( + 1200037, + 1200037, + 2079, + '1961-01-01 00:00:00.000000', + 250, + 561, + 30000, + 13 + ), + ( + 1200038, + 1200038, + 2099, + '1964-01-01 00:00:00.000000', + 125, + 561, + 30000, + 4 + ), + ( + 1200039, + 1200039, + 2468, + '1964-01-01 00:00:00.000000', + 15, + 616, + 30000, + 18 + ), + ( + 1200040, + 1200040, + 2469, + '1964-01-01 00:00:00.000000', + 0, + 124, + 30000, + 18 + ), + ( + 1200041, + 1200041, + 2472, + '1970-01-01 00:00:00.000000', + 60, + 160, + 30000, + 18 + ), + ( + 1200042, + 1200042, + 2478, + '1940-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 20 + ), + ( + 1200043, + 1200043, + 2503, + '1970-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 16 + ), + ( + 1200044, + 1200044, + 2504, + '1971-01-01 00:00:00.000000', + 60, + 616, + 30000, + 16 + ), + ( + 1200045, + 1200045, + 2516, + '1968-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 17 + ), + ( + 1200046, + 1200047, + 2517, + '1969-01-01 00:00:00.000000', + 125, + 229, + 30000, + 17 + ), + ( + 1200047, + 1200046, + 2518, + '1970-01-01 00:00:00.000000', + 60, + 561, + 30000, + 17 + ), + ( + 1200048, + 1200048, + 2534, + '1954-01-01 00:00:00.000000', + 1000, + 506, + 30000, + 15 + ), + ( + 1200049, + 1200049, + 2546, + '1958-01-01 00:00:00.000000', + 1000, + 74, + 30000, + 19 + ), + ( + 1200050, + 1200050, + 2547, + '1958-01-01 00:00:00.000000', + 125, + 411, + 30000, + 19 + ), + ( + 1200051, + 1200051, + 2628, + '1955-02-10 00:00:00.000000', + 125, + 411, + 30000, + 21 + ), + ( + 1200052, + 1200052, + 2629, + '1968-03-17 00:00:00.000000', + 125, + 411, + 30000, + 8 + ), + ( + 1200053, + 1200053, + 2630, + '1968-03-17 00:00:00.000000', + 125, + 411, + 30000, + 7 + ), + ( + 1200054, + 1200054, + 2631, + '1946-02-26 00:00:00.000000', + 1000, + 133, + 30000, + 20 + ), + ( + 1200055, + 1200056, + 2632, + '1957-01-16 00:00:00.000000', + 60, + 411, + 30000, + 9 + ), + ( + 1200056, + 1200055, + 2633, + '1938-04-20 00:00:00.000000', + 1000, + 133, + 30000, + 10 + ), + ( + 1200057, + 1200057, + 2634, + '1968-03-11 00:00:00.000000', + 60, + 411, + 30000, + 11 + ), + ( + 1200058, + 1200058, + 2635, + '1968-03-11 00:00:00.000000', + 125, + 411, + 30000, + 12 + ), + ( + 1200059, + 1200059, + 2692, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 14 + ), + ( + 1200060, + 1200061, + 2704, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 5 + ), + ( + 1200061, + 1200060, + 2705, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 6 + ), + ( + 1200062, + 1200063, + 2706, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 1 + ), + ( + 1200063, + 1200062, + 2707, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 2 + ), + ( + 1200064, + 1200067, + 2708, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 17 + ), + ( + 1200065, + 1200066, + 2709, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 3 + ), + ( + 1200066, + 1200065, + 2710, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 16 + ), + ( + 1200067, + 1200064, + 2711, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 4 + ), + ( + 1200068, + 1200069, + 2712, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 12 + ), + ( + 1200069, + 1200068, + 2713, + '1995-01-01 00:00:00.000000', + 125, + 149, + 30000, + 11 + ), + ( + 1200070, + 1200070, + 2714, + '1995-01-01 00:00:00.000000', + 250, + 149, + 30000, + 13 + ), + ( + 1200071, + 1200071, + 2715, + '1995-01-01 00:00:00.000000', + 30, + 891, + 30000, + 3 + ), + ( + 1200072, + 1200074, + 2716, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 8 + ), + ( + 1200073, + 1200079, + 2717, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 5 + ), + ( + 1200074, + 1200076, + 2718, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 6 + ), + ( + 1200075, + 1200082, + 2719, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 19 + ), + ( + 1200076, + 1200088, + 2720, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 1 + ), + ( + 1200077, + 1200085, + 2721, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 2 + ), + ( + 1200078, + 1200099, + 2722, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 17 + ), + ( + 1200079, + 1200096, + 2723, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 16 + ), + ( + 1200080, + 1200093, + 2724, + '1995-01-01 00:00:00.000000', + 125, + 160, + 30000, + 4 + ), + ( + 1200081, + 1200072, + 2725, + '1995-01-01 00:00:00.000000', + 60, + 642, + 30000, + 14 + ), + ( + 1200082, + 1200075, + 2726, + '1998-01-01 00:00:00.000000', + 60, + 642, + 30000, + 8 + ), + ( + 1200083, + 1200080, + 2727, + '1995-01-01 00:00:00.000000', + 60, + 642, + 30000, + 5 + ), + ( + 1200084, + 1200077, + 2728, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 6 + ), + ( + 1200085, + 1200083, + 2729, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 19 + ), + ( + 1200086, + 1200089, + 2730, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 1 + ), + ( + 1200087, + 1200086, + 2732, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 2 + ), + ( + 1200088, + 1200091, + 2731, + '1999-01-01 00:00:00.000000', + 30, + 642, + 30000, + 18 + ), + ( + 1200089, + 1200100, + 2733, + '1999-01-01 00:00:00.000000', + 60, + 705, + 30000, + 17 + ), + ( + 1200090, + 1200097, + 2734, + '1999-01-01 00:00:00.000000', + 60, + 705, + 30000, + 16 + ), + ( + 1200091, + 1200094, + 2735, + '1999-01-01 00:00:00.000000', + 60, + 705, + 30000, + 4 + ), + ( + 1200092, + 1200073, + 2736, + '1999-01-01 00:00:00.000000', + 30, + 891, + 30000, + 14 + ), + ( + 1200093, + 1200081, + 2737, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 5 + ), + ( + 1200094, + 1200078, + 2738, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 6 + ), + ( + 1200095, + 1200084, + 2739, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 19 + ), + ( + 1200096, + 1200090, + 2740, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 1 + ), + ( + 1200097, + 1200092, + 2741, + '1999-01-01 00:00:00.000000', + 15, + 946, + 30000, + 18 + ), + ( + 1200098, + 1200087, + 2742, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 2 + ), + ( + 1200099, + 1200101, + 2743, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 17 + ), + ( + 1200100, + 1200098, + 2744, + '1999-01-01 00:00:00.000000', + 30, + 1001, + 30000, + 16 + ), + ( + 1200101, + 1200095, + 2745, + '1999-01-01 00:00:00.000000', + 30, + 891, + 30000, + 4 + ), + ( + 1200102, + 1200108, + 2746, + '1999-01-01 00:00:00.000000', + 125, + 160, + 30000, + 12 + ), + ( + 1200103, + 1200102, + 2747, + '1999-01-01 00:00:00.000000', + 125, + 160, + 30000, + 11 + ), + ( + 1200104, + 1200105, + 2748, + '1999-01-01 00:00:00.000000', + 125, + 160, + 30000, + 13 + ), + ( + 1200105, + 1200109, + 2749, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 12 + ), + ( + 1200106, + 1200103, + 2750, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 11 + ), + ( + 1200107, + 1200106, + 2751, + '1999-01-01 00:00:00.000000', + 60, + 642, + 30000, + 13 + ), + ( + 1200108, + 1200110, + 2752, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 12 + ), + ( + 1200109, + 1200104, + 2753, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 11 + ), + ( + 1200110, + 1200107, + 2754, + '1999-01-01 00:00:00.000000', + 30, + 946, + 30000, + 13 + ), + ( + 1200111, + 1200115, + 2833, + '1957-01-01 00:00:00.000000', + 125, + 551, + 30000, + 15 + ), + ( + 1200112, + 1200113, + 2829, + '1957-01-01 00:00:00.000000', + 60, + 951, + 30000, + 15 + ), + ( + 1200113, + 1200116, + 2834, + '1957-01-01 00:00:00.000000', + 125, + 821, + 30000, + 15 + ), + ( + 1200114, + 1200114, + 2832, + '1957-01-01 00:00:00.000000', + 125, + 506, + 30000, + 15 + ), + ( + 1200115, + 1200117, + 2830, + '1957-01-01 00:00:00.000000', + 125, + 551, + 30000, + 15 + ), + ( + 1200116, + 1200111, + 2827, + '1957-01-01 00:00:00.000000', + 125, + 506, + 30000, + 15 + ), + ( + 1200117, + 1200112, + 2828, + '1957-01-01 00:00:00.000000', + 60, + 655, + 30000, + 15 + ), + ( + 1200118, + 1200118, + 2831, + '1957-01-01 00:00:00.000000', + 125, + 554, + 30000, + 15 + ), + ( + 1200119, + 1200123, + 2915, + '1964-01-01 00:00:00.000000', + 250, + 133, + 30000, + 6 + ), + ( + 1200120, + 1200122, + 2914, + '1964-01-01 00:00:00.000000', + 125, + 614, + 30000, + 6 + ), + ( + 1200121, + 1200121, + 2913, + '1964-01-01 00:00:00.000000', + 30, + 1084, + 30000, + 6 + ), + ( + 1200122, + 1200124, + 2916, + '1964-01-01 00:00:00.000000', + 30, + 990, + 30000, + 6 + ), + ( + 1200123, + 1200119, + 2911, + '1964-01-01 00:00:00.000000', + 60, + 674, + 30000, + 6 + ), + ( + 1200124, + 1200120, + 2912, + '1964-01-01 00:00:00.000000', + 500, + 133, + 30000, + 6 + ), + ( + 1200125, + 1200131, + 2994, + '1965-01-01 00:00:00.000000', + 500, + 128, + 30000, + 21 + ), + ( + 1200126, + 1200127, + 2990, + '1965-01-01 00:00:00.000000', + 125, + 848, + 30000, + 21 + ), + ( + 1200127, + 1200132, + 2995, + '1965-01-01 00:00:00.000000', + 125, + 482, + 30000, + 21 + ), + ( + 1200128, + 1200138, + 3001, + '1965-01-01 00:00:00.000000', + 250, + 224, + 30000, + 4 + ), + ( + 1200129, + 1200126, + 2989, + '1965-01-01 00:00:00.000000', + 250, + 181, + 30000, + 21 + ), + ( + 1200130, + 1200139, + 3002, + '1965-01-01 00:00:00.000000', + 125, + 942, + 30000, + 4 + ), + ( + 1200131, + 1200128, + 2991, + '1965-01-01 00:00:00.000000', + 125, + 901, + 30000, + 21 + ), + ( + 1200132, + 1200137, + 3000, + '1965-01-01 00:00:00.000000', + 125, + 535, + 30000, + 4 + ), + ( + 1200133, + 1200129, + 2992, + '1965-01-01 00:00:00.000000', + 125, + 511, + 30000, + 21 + ), + ( + 1200134, + 1200130, + 2993, + '1965-01-01 00:00:00.000000', + 125, + 559, + 30000, + 21 + ), + ( + 1200135, + 1200135, + 2998, + '1965-01-01 00:00:00.000000', + 125, + 535, + 30000, + 4 + ), + ( + 1200136, + 1200133, + 2996, + '1965-01-01 00:00:00.000000', + 125, + 535, + 30000, + 4 + ), + ( + 1200137, + 1200134, + 2997, + '1965-01-01 00:00:00.000000', + 60, + 674, + 30000, + 4 + ), + ( + 1200138, + 1200125, + 2988, + '1965-01-01 00:00:00.000000', + 60, + 559, + 30000, + 21 + ), + ( + 1200139, + 1200140, + 2999, + '1965-01-01 00:00:00.000000', + 60, + 705, + 30000, + 4 + ), + ( + 1200140, + 1200142, + 3070, + '1966-01-01 00:00:00.000000', + 75, + 1096, + 30000, + 2 + ), + ( + 1200141, + 1200143, + 3072, + '1966-01-01 00:00:00.000000', + 125, + 861, + 30000, + 2 + ), + ( + 1200142, + 1200141, + 3071, + '1966-01-01 00:00:00.000000', + 250, + 511, + 30000, + 2 + ), + ( + 1200143, + 1200144, + 3107, + '1966-01-01 00:00:00.000000', + 75, + 1096, + 30000, + 13 + ), + ( + 1200144, + 1200145, + 3108, + '1966-01-01 00:00:00.000000', + 75, + 1047, + 30000, + 13 + ), + ( + 1200145, + 1200165, + 3282, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 9 + ), + ( + 1200146, + 1200180, + 3297, + '1967-01-01 00:00:00.000000', + 500, + 254, + 30000, + 14 + ), + ( + 1200147, + 1200173, + 3290, + '1967-01-01 00:00:00.000000', + 500, + 254, + 30000, + 19 + ), + ( + 1200148, + 1200166, + 3283, + '1967-01-01 00:00:00.000000', + 500, + 254, + 30000, + 9 + ), + ( + 1200149, + 1200181, + 3298, + '1967-01-01 00:00:00.000000', + 250, + 587, + 30000, + 14 + ), + ( + 1200150, + 1200174, + 3291, + '1967-01-01 00:00:00.000000', + 250, + 587, + 30000, + 19 + ), + ( + 1200151, + 1200167, + 3284, + '1967-01-01 00:00:00.000000', + 250, + 587, + 30000, + 9 + ), + ( + 1200152, + 1200179, + 3296, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 14 + ), + ( + 1200153, + 1200148, + 3265, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 16 + ), + ( + 1200154, + 1200153, + 3270, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 17 + ), + ( + 1200155, + 1200186, + 3303, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 12 + ), + ( + 1200156, + 1200159, + 3276, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 18 + ), + ( + 1200157, + 1200172, + 3289, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 19 + ), + ( + 1200158, + 1200190, + 3307, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 1 + ), + ( + 1200159, + 1200191, + 3308, + '1967-01-01 00:00:00.000000', + 0, + 1260, + 30000, + 5 + ), + ( + 1200160, + 1200175, + 3292, + '1967-01-01 00:00:00.000000', + 75, + 1001, + 30000, + 19 + ), + ( + 1200161, + 1200182, + 3299, + '1967-01-01 00:00:00.000000', + 75, + 1001, + 30000, + 14 + ), + ( + 1200162, + 1200160, + 3277, + '1967-01-01 00:00:00.000000', + 50, + 1001, + 30000, + 18 + ), + ( + 1200163, + 1200192, + 3309, + '1967-01-01 00:00:00.000000', + 75, + 1001, + 30000, + 5 + ), + ( + 1200164, + 1200168, + 3285, + '1967-01-01 00:00:00.000000', + 75, + 1001, + 30000, + 9 + ), + ( + 1200165, + 1200169, + 3286, + '1967-01-01 00:00:00.000000', + 250, + 233, + 30000, + 19 + ), + ( + 1200166, + 1200176, + 3293, + '1967-01-01 00:00:00.000000', + 250, + 233, + 30000, + 14 + ), + ( + 1200167, + 1200162, + 3279, + '1967-01-01 00:00:00.000000', + 250, + 233, + 30000, + 9 + ), + ( + 1200168, + 1200183, + 3300, + '1967-01-01 00:00:00.000000', + 250, + 242, + 30000, + 12 + ), + ( + 1200169, + 1200156, + 3275, + '1967-01-01 00:00:00.000000', + 250, + 242, + 30000, + 18 + ), + ( + 1200170, + 1200187, + 3304, + '1967-01-01 00:00:00.000000', + 250, + 233, + 30000, + 1 + ), + ( + 1200171, + 1200163, + 3280, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 9 + ), + ( + 1200172, + 1200157, + 3273, + '1967-01-01 00:00:00.000000', + 125, + 535, + 30000, + 18 + ), + ( + 1200173, + 1200189, + 3306, + '1967-01-01 00:00:00.000000', + 250, + 614, + 30000, + 1 + ), + ( + 1200174, + 1200151, + 3268, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 17 + ), + ( + 1200175, + 1200146, + 3263, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 16 + ), + ( + 1200176, + 1200170, + 3287, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 19 + ), + ( + 1200177, + 1200177, + 3294, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 14 + ), + ( + 1200178, + 1200184, + 3301, + '1967-01-01 00:00:00.000000', + 250, + 535, + 30000, + 12 + ), + ( + 1200179, + 1200161, + 3278, + '1967-01-01 00:00:00.000000', + 500, + 212, + 30000, + 9 + ), + ( + 1200180, + 1200149, + 3266, + '1967-01-01 00:00:00.000000', + 125, + 1047, + 30000, + 16 + ), + ( + 1200181, + 1200154, + 3271, + '1967-01-01 00:00:00.000000', + 125, + 1047, + 30000, + 17 + ), + ( + 1200182, + 1200152, + 3269, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 17 + ), + ( + 1200183, + 1200178, + 3295, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 14 + ), + ( + 1200184, + 1200189, + 3306, + '1967-01-01 00:00:00.000000', + 125, + 614, + 30000, + 1 + ), + ( + 1200185, + 1200185, + 3302, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 12 + ), + ( + 1200186, + 1200147, + 3264, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 16 + ), + ( + 1200187, + 1200171, + 3288, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 19 + ), + ( + 1200188, + 1200164, + 3281, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 9 + ), + ( + 1200189, + 1200158, + 3274, + '1967-01-01 00:00:00.000000', + 125, + 698, + 30000, + 18 + ), + ( + 1200190, + 1200155, + 3272, + '1967-01-01 00:00:00.000000', + 0, + 1132, + 30000, + 17 + ), + ( + 1200191, + 1200150, + 3267, + '1967-01-01 00:00:00.000000', + 0, + 1132, + 30000, + 16 + ), + ( + 1200192, + 1200193, + 3771, + '1995-01-01 00:00:00.000000', + 60, + 579, + 30000, + 10 + ); \ No newline at end of file diff --git a/migrations/0022-seedPart.sql b/migrations/0022-seedPart.sql new file mode 100644 index 000000000..26fffbfde --- /dev/null +++ b/migrations/0022-seedPart.sql @@ -0,0 +1 @@ +-- Intentionally left blank, file exists to maintain order of migrations diff --git a/migrations/0023-seedDriverClass.sql b/migrations/0023-seedDriverClass.sql new file mode 100644 index 000000000..b6452417b --- /dev/null +++ b/migrations/0023-seedDriverClass.sql @@ -0,0 +1,6 @@ +INSERT INTO + driver_class (driver_class_id, driver_class) +VALUES + (0, 'C'), + (1, 'B'), + (2, 'A'); \ No newline at end of file diff --git a/migrations/0024-seedPlayerType.sql b/migrations/0024-seedPlayerType.sql new file mode 100644 index 000000000..e160b4c09 --- /dev/null +++ b/migrations/0024-seedPlayerType.sql @@ -0,0 +1,8 @@ +INSERT INTO + player_type (player_type_id, player_type) +VALUES + (1, 'System'), + (2, 'Admin'), + (3, 'Player'), + (4, 'Deleted Player'), + (5, 'Escrow'); \ No newline at end of file diff --git a/migrations/0025-seedPlayer.sql b/migrations/0025-seedPlayer.sql new file mode 100644 index 000000000..e4a0eaa72 --- /dev/null +++ b/migrations/0025-seedPlayer.sql @@ -0,0 +1,33026 @@ +INSERT INTO + player ( + player_id, + customer_id, + player_type_id, + sanctioned_score, + challenge_score, + last_logged_in, + times_logged_in, + bank_balance, + num_cars_owned, + is_logged_in, + driver_style, + lp_code, + lp_text, + car_num1, + car_num2, + car_num3, + car_num4, + car_num5, + car_num6, + dl_number, + persona, + "address", + residence, + vehicle_id, + current_race_id, + offline_driver_skill, + offline_grudge, + offline_reputation, + total_time_played, + car_info_setting, + stock_classic_class, + stock_muscle_class, + modified_classic_class, + modified_muscle_class, + outlaw_class, + drag_class, + challenge_rung, + offline_ai_car_class, + offline_ai_skin_id, + offline_ai_car_bpt_id, + offline_ai_state, + body_type, + skin_color, + hair_color, + shirt_color, + pants_color, + offline_driver_style, + offline_driver_attitude, + evaded_fuzz, + pinks_won, + num_unread_mail, + total_races_run, + total_races_won, + total_races_completed, + total_winnings, + insurance_risk_points, + insurance_rating, + challenge_races_run, + challenge_races_won, + challenge_races_completed, + cars_lost, + cars_won + ) +VALUES + ( + 0, + 0, + 5, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Null Name', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 1, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Muscle Mike', + '1235 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 2, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Auto Barn', + '1236 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 3, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Fat Fender Freddy', + '1237 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 4, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Righteous Ride', + '1238 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 5, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Classic Chrysler', + '1239 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 6, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'All Factory Ford', + '1240 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 7, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Shoebox Showroom', + '1241 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 8, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Original GM', + '1242 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 9, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Scrappy', + '1243 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 10, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Joe', + '1244 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 11, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'AI Administrator', + '1244 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 12, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Editorials', + '1244 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 13, + 0, + 5, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 999999, + 0, + 0, + 0, + 0, + NULL, + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + '0 ', + 'xxx', + 'Escrow', + '1234 A Street', + 'ABCDEFGHIJKLMNOPQRST', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 14, + 0, + 1, + 0, + 0, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 0, + NULL, + '0', + '0', + '0', + '0', + '0', + '0', + 'xxxx', + 'PartAuction', + '0', + '0', + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + NULL, + NULL, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ), + ( + 500, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 0, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '303872ia', + 'AI Racer 500', + '12390 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 0, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 47, + 104, + 0, + 3, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 501, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '392562ia', + 'AI Racer 501', + '19030 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 0, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 488, + 135, + 0, + 7, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 502, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '754473ia', + 'AI Racer 502', + '24667 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 0, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 45, + 104, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 503, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 39, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '655218ia', + 'AI Racer 503', + '19862 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 0, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 424, + 256, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 504, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '661274ia', + 'AI Racer 504', + '17633 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 0, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 320, + 124, + 0, + 1, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 505, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '748672ia', + 'AI Racer 505', + '5973 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 1, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 341, + 126, + 0, + 7, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 506, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '743362ia', + 'AI Racer 506', + '20530 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 1, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 479, + 135, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 507, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '150424ia', + 'AI Racer 507', + '14501 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 1, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 208, + 117, + 0, + 5, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 508, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '670230ia', + 'AI Racer 508', + '11518 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 1, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 517, + 102, + 0, + 2, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 509, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '676802ia', + 'AI Racer 509', + '17074 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 1, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 164, + 114, + 0, + 2, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 510, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '216809ia', + 'AI Racer 510', + '1 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 2, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 332, + 125, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 511, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '450489ia', + 'AI Racer 511', + '17156 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 2, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 157, + 113, + 0, + 0, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 512, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '880258ia', + 'AI Racer 512', + '4278 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 2, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 403, + 130, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 513, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '325247ia', + 'AI Racer 513', + '1923 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 2, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 334, + 125, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 514, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '985983ia', + 'AI Racer 514', + '4582 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 3, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 648, + 134, + 0, + 5, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 515, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '219306ia', + 'AI Racer 515', + '5913 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 3, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 410, + 131, + 0, + 8, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 516, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '712898ia', + 'AI Racer 516', + '22855 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 3, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 340, + 126, + 0, + 3, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 517, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '769085ia', + 'AI Racer 517', + '21038 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 3, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 205, + 117, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 518, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '460272ia', + 'AI Racer 518', + '9291 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 3, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 561, + 113, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 519, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '83745ia', + 'AI Racer 519', + '12505 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 4, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 427, + 132, + 0, + 7, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 520, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '469201ia', + 'AI Racer 520', + '28280 Fell Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 4, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 520, + 103, + 0, + 4, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 521, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '387318ia', + 'AI Racer 521', + '5676 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 4, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 58, + 105, + 0, + 0, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 522, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '481939ia', + 'AI Racer 522', + '167 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 4, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 162, + 114, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 523, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '219602ia', + 'AI Racer 523', + '5377 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 5, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 94, + 109, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 524, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '98237ia', + 'AI Racer 524', + '2966 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 5, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 28, + 102, + 0, + 5, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 525, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '550891ia', + 'AI Racer 525', + '8909 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 5, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 426, + 132, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 526, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '82933ia', + 'AI Racer 526', + '27132 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 5, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 299, + 123, + 0, + 9, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 527, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '602424ia', + 'AI Racer 527', + '13996 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 5, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 528, + 105, + 0, + 0, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 528, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '837365ia', + 'AI Racer 528', + '16577 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 6, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 185, + 115, + 0, + 0, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 529, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '568712ia', + 'AI Racer 529', + '157 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 6, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 64, + 105, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 530, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '486006ia', + 'AI Racer 530', + '21699 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 6, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 624, + 128, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 531, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '150879ia', + 'AI Racer 531', + '13759 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 6, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 304, + 123, + 0, + 6, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 532, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '498768ia', + 'AI Racer 532', + '15100 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 7, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 232, + 119, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 533, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '697447ia', + 'AI Racer 533', + '7870 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 7, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 73, + 106, + 0, + 3, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 534, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '914165ia', + 'AI Racer 534', + '12865 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 7, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 16, + 102, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 535, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '585301ia', + 'AI Racer 535', + '15917 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 7, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 370, + 128, + 0, + 0, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 536, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '696998ia', + 'AI Racer 536', + '29129 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 7, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 403, + 130, + 0, + 0, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 537, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '485027ia', + 'AI Racer 537', + '11864 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 8, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 154, + 113, + 0, + 4, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 538, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '509577ia', + 'AI Racer 538', + '18755 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 8, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 1, + 101, + 0, + 1, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 539, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '179998ia', + 'AI Racer 539', + '27924 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 8, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 569, + 115, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 540, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '35476ia', + 'AI Racer 540', + '2526 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 8, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 344, + 126, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 541, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '974717ia', + 'AI Racer 541', + '11837 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 9, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 20, + 102, + 0, + 7, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 542, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '464742ia', + 'AI Racer 542', + '4093 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 9, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 209, + 117, + 0, + 5, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 543, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '754074ia', + 'AI Racer 543', + '4268 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 9, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 30, + 103, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 544, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '804176ia', + 'AI Racer 544', + '24503 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 9, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 491, + 135, + 0, + 1, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 545, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '994626ia', + 'AI Racer 545', + '2186 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 9, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 209, + 117, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 546, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '94126ia', + 'AI Racer 546', + '4524 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 10, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 95, + 109, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 547, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '571815ia', + 'AI Racer 547', + '6931 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 10, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 99, + 109, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 548, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '160096ia', + 'AI Racer 548', + '11826 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 10, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 295, + 123, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 549, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '227074ia', + 'AI Racer 549', + '24213 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 10, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 150, + 112, + 0, + 1, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 550, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '936708ia', + 'AI Racer 550', + '21767 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 11, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 191, + 116, + 0, + 8, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 551, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '330081ia', + 'AI Racer 551', + '20248 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 11, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 280, + 122, + 0, + 3, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 552, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '852519ia', + 'AI Racer 552', + '1585 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 11, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 504, + 108, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 553, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '25095ia', + 'AI Racer 553', + '742 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 11, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 491, + 135, + 0, + 0, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 554, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '476593ia', + 'AI Racer 554', + '23289 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 11, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 421, + 132, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 555, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '79046ia', + 'AI Racer 555', + '11493 Petrick Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 12, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 212, + 118, + 0, + 3, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 556, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '421062ia', + 'AI Racer 556', + '11511 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 12, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 644, + 133, + 0, + 4, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 557, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '834459ia', + 'AI Racer 557', + '2578 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 12, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 158, + 113, + 0, + 7, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 558, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '185804ia', + 'AI Racer 558', + '3130 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 12, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 207, + 117, + 0, + 9, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 559, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '292551ia', + 'AI Racer 559', + '22628 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 12, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 101, + 109, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 560, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '301945ia', + 'AI Racer 560', + '15902 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 13, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 301, + 123, + 0, + 0, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 561, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '939129ia', + 'AI Racer 561', + '11995 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 13, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 331, + 125, + 0, + 5, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 562, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '842129ia', + 'AI Racer 562', + '15070 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 13, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 227, + 119, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 563, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522294ia', + 'AI Racer 563', + '25688 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 13, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 124, + 111, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 564, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '430746ia', + 'AI Racer 564', + '12809 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 14, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 550, + 110, + 0, + 4, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 565, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '74483ia', + 'AI Racer 565', + '13403 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 14, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 141, + 112, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 566, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '488746ia', + 'AI Racer 566', + '29792 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 14, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 610, + 125, + 0, + 7, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 567, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '360001ia', + 'AI Racer 567', + '29357 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 14, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 349, + 126, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 568, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '182796ia', + 'AI Racer 568', + '16647 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 14, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 490, + 135, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 569, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '817095ia', + 'AI Racer 569', + '7805 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 15, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 72, + 106, + 0, + 6, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 570, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '596776ia', + 'AI Racer 570', + '12112 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 15, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 541, + 108, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 571, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '376237ia', + 'AI Racer 571', + '28270 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 15, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 51, + 104, + 0, + 1, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 572, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '326326ia', + 'AI Racer 572', + '8675 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 15, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 586, + 119, + 0, + 4, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 573, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '224231ia', + 'AI Racer 573', + '28187 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 16, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 582, + 118, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 574, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '520429ia', + 'AI Racer 574', + '18809 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 16, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 226, + 119, + 0, + 2, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 575, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '964865ia', + 'AI Racer 575', + '3780 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 16, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 606, + 124, + 0, + 6, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 576, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '866643ia', + 'AI Racer 576', + '21809 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 16, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 40, + 103, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 577, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '626184ia', + 'AI Racer 577', + '25887 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 16, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 175, + 114, + 0, + 7, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 578, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '392980ia', + 'AI Racer 578', + '4362 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 17, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 14, + 101, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 579, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '949799ia', + 'AI Racer 579', + '23535 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 17, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 395, + 130, + 0, + 3, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 580, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '273343ia', + 'AI Racer 580', + '26913 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 17, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 55, + 105, + 0, + 2, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 581, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '76510ia', + 'AI Racer 581', + '27342 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 17, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 468, + 134, + 0, + 9, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 582, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '813472ia', + 'AI Racer 582', + '12153 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 18, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 561, + 113, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 583, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '110644ia', + 'AI Racer 583', + '20152 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 18, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 425, + 132, + 0, + 6, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 584, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '749440ia', + 'AI Racer 584', + '28765 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 18, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 332, + 125, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 585, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '841527ia', + 'AI Racer 585', + '16354 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 18, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 75, + 106, + 0, + 6, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 586, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '241745ia', + 'AI Racer 586', + '12041 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 18, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 362, + 127, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 587, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '659771ia', + 'AI Racer 587', + '795 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 19, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 143, + 112, + 0, + 8, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 588, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '26899ia', + 'AI Racer 588', + '3545 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 19, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 380, + 129, + 0, + 6, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 589, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '416064ia', + 'AI Racer 589', + '25498 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 19, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 113, + 110, + 0, + 4, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 590, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '768108ia', + 'AI Racer 590', + '20187 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 19, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 413, + 131, + 0, + 9, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 591, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '701220ia', + 'AI Racer 591', + '1649 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 20, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 65, + 106, + 0, + 7, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 592, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '622845ia', + 'AI Racer 592', + '21062 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 20, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 205, + 117, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 593, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '411571ia', + 'AI Racer 593', + '23654 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 20, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 343, + 126, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 594, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '66525ia', + 'AI Racer 594', + '12399 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 20, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 49, + 104, + 0, + 7, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 595, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '273352ia', + 'AI Racer 595', + '2731 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 20, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 521, + 103, + 0, + 5, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 596, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '154000ia', + 'AI Racer 596', + '2787 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 21, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 204, + 117, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 597, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '423723ia', + 'AI Racer 597', + '9138 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 21, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 72, + 106, + 0, + 0, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 598, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '671710ia', + 'AI Racer 598', + '19830 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 21, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 46, + 104, + 0, + 9, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 599, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '679830ia', + 'AI Racer 599', + '11928 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 21, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 207, + 117, + 0, + 5, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 600, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522491ia', + 'AI Racer 600', + '867 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 22, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 358, + 127, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 601, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '173515ia', + 'AI Racer 601', + '20635 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 22, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 250, + 120, + 0, + 6, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 602, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '17008ia', + 'AI Racer 602', + '3799 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 22, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 644, + 133, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 603, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '723724ia', + 'AI Racer 603', + '27178 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 22, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 291, + 122, + 0, + 0, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 604, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '912010ia', + 'AI Racer 604', + '28794 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 22, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 71, + 106, + 0, + 5, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 605, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '856571ia', + 'AI Racer 605', + '23770 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 23, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 355, + 140, + 0, + 1, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 606, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '361569ia', + 'AI Racer 606', + '27936 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 23, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 607, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '430294ia', + 'AI Racer 607', + '9465 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 23, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 344, + 143, + 0, + 1, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 608, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '200002ia', + 'AI Racer 608', + '18734 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 23, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 393, + 129, + 0, + 7, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 609, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '761006ia', + 'AI Racer 609', + '3122 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 23, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 209, + 117, + 0, + 4, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 610, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '354954ia', + 'AI Racer 610', + '7308 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 24, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 242, + 120, + 0, + 1, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 611, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '941120ia', + 'AI Racer 611', + '4992 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 24, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 2, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 612, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '997661ia', + 'AI Racer 612', + '1284 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 24, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 613, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '784622ia', + 'AI Racer 613', + '10704 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 24, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 1, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 614, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '610071ia', + 'AI Racer 614', + '5439 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 25, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 7, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 615, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '154341ia', + 'AI Racer 615', + '26774 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 25, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 5, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 616, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '603120ia', + 'AI Racer 616', + '13229 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 25, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 126, + 111, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 617, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '84166ia', + 'AI Racer 617', + '13098 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 25, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 13, + 139, + 0, + 9, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 618, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '751322ia', + 'AI Racer 618', + '8804 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 25, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 9, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 619, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '156450ia', + 'AI Racer 619', + '7359 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 26, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 373, + 128, + 0, + 4, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 620, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '311080ia', + 'AI Racer 620', + '12471 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 26, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 198, + 116, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 621, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '109171ia', + 'AI Racer 621', + '16179 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 26, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 14, + 139, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 622, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '21143ia', + 'AI Racer 622', + '7698 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 26, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 620, + 127, + 0, + 0, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 623, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '494328ia', + 'AI Racer 623', + '22080 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 27, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 185, + 115, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 624, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '67631ia', + 'AI Racer 624', + '23832 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 27, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 70, + 106, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 625, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '409432ia', + 'AI Racer 625', + '16188 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 27, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 536, + 107, + 0, + 3, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 626, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '123659ia', + 'AI Racer 626', + '7518 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 27, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 6, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 627, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '839593ia', + 'AI Racer 627', + '10874 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 27, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 4, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 628, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '109316ia', + 'AI Racer 628', + '11119 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 28, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 318, + 124, + 0, + 7, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 629, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '291280ia', + 'AI Racer 629', + '28506 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 28, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 615, + 143, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 630, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '473923ia', + 'AI Racer 630', + '5033 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 28, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 132, + 111, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 631, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '407098ia', + 'AI Racer 631', + '21929 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 28, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 8, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 632, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '922459ia', + 'AI Racer 632', + '26513 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 29, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 10, + 139, + 0, + 9, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 633, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '8727ia', + 'AI Racer 633', + '9820 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 29, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 634, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '319287ia', + 'AI Racer 634', + '1729 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 29, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 14, + 139, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 635, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '139794ia', + 'AI Racer 635', + '14163 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 29, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 636, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522918ia', + 'AI Racer 636', + '25350 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 29, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 252, + 120, + 0, + 5, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 637, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '814006ia', + 'AI Racer 637', + '24547 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 30, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 0, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 638, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '968628ia', + 'AI Racer 638', + '29310 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 30, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 7, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 639, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '486332ia', + 'AI Racer 639', + '133 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 30, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 7, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 640, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '378921ia', + 'AI Racer 640', + '28711 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 30, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 4, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 641, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '867790ia', + 'AI Racer 641', + '13602 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 31, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 6, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 642, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '169255ia', + 'AI Racer 642', + '17079 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 31, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 643, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '637397ia', + 'AI Racer 643', + '12225 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 31, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 644, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '260694ia', + 'AI Racer 644', + '5682 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 31, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 370, + 128, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 645, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '193921ia', + 'AI Racer 645', + '1517 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 31, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 5, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 646, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '383668ia', + 'AI Racer 646', + '22413 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 32, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 8, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 647, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '418331ia', + 'AI Racer 647', + '24800 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 32, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 598, + 122, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 648, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '498356ia', + 'AI Racer 648', + '6111 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 32, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 649, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '394224ia', + 'AI Racer 649', + '17302 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 32, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 177, + 115, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 650, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '46273ia', + 'AI Racer 650', + '17762 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 33, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 9, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 651, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '873050ia', + 'AI Racer 651', + '3579 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 33, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 9, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 652, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '438471ia', + 'AI Racer 652', + '2543 Fell Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 33, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 529, + 105, + 0, + 9, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 653, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '512831ia', + 'AI Racer 653', + '15245 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 33, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 298, + 123, + 0, + 5, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 654, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '915303ia', + 'AI Racer 654', + '10197 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 33, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 222, + 118, + 0, + 3, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 655, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '199397ia', + 'AI Racer 655', + '2197 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 34, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 656, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '140597ia', + 'AI Racer 656', + '17701 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 34, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 657, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '739018ia', + 'AI Racer 657', + '15977 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 34, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 2, + 139, + 0, + 5, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 658, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '288685ia', + 'AI Racer 658', + '23165 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 34, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 659, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '736478ia', + 'AI Racer 659', + '27051 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 34, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 407, + 131, + 0, + 6, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 660, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '842805ia', + 'AI Racer 660', + '24570 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 35, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 7, + 139, + 0, + 8, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 661, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '908598ia', + 'AI Racer 661', + '21645 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 35, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 433, + 132, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 662, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '870033ia', + 'AI Racer 662', + '4276 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 35, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 344, + 143, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 663, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '833278ia', + 'AI Racer 663', + '28616 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 35, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 0, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 664, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '462606ia', + 'AI Racer 664', + '23816 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 36, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 5, + 101, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 665, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '959217ia', + 'AI Racer 665', + '24837 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 36, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 636, + 131, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 666, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '419274ia', + 'AI Racer 666', + '5688 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 36, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 569, + 115, + 0, + 3, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 667, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '634402ia', + 'AI Racer 667', + '12319 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 36, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 355, + 140, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 668, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '263602ia', + 'AI Racer 668', + '7509 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 36, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 200, + 116, + 0, + 3, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 669, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '784129ia', + 'AI Racer 669', + '28233 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 37, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 670, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '537433ia', + 'AI Racer 670', + '1742 Fell Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 37, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 360, + 140, + 0, + 6, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 671, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '687851ia', + 'AI Racer 671', + '12358 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 37, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 672, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '782994ia', + 'AI Racer 672', + '19994 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 37, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 532, + 106, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 673, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '238242ia', + 'AI Racer 673', + '29314 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 38, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 562, + 113, + 0, + 4, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 674, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '185706ia', + 'AI Racer 674', + '17810 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 38, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 554, + 111, + 0, + 7, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 675, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '269504ia', + 'AI Racer 675', + '26177 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 38, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 6, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 676, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '945853ia', + 'AI Racer 676', + '21559 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 38, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 65, + 106, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 677, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '658907ia', + 'AI Racer 677', + '7324 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 38, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 60, + 105, + 0, + 2, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 678, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '526760ia', + 'AI Racer 678', + '24556 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 39, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 1, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 679, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '464750ia', + 'AI Racer 679', + '9027 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 39, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 193, + 116, + 0, + 8, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 680, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '627007ia', + 'AI Racer 680', + '7172 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 39, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 309, + 123, + 0, + 1, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 681, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '994199ia', + 'AI Racer 681', + '21102 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 39, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 0, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 682, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '841467ia', + 'AI Racer 682', + '467 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 40, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 282, + 122, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 683, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '42685ia', + 'AI Racer 683', + '28659 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 40, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 196, + 116, + 0, + 4, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 684, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '621816ia', + 'AI Racer 684', + '19155 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 40, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 2, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 685, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '189819ia', + 'AI Racer 685', + '27233 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 40, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 344, + 143, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 686, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '298553ia', + 'AI Racer 686', + '11934 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 40, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 1, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 687, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '587905ia', + 'AI Racer 687', + '13868 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 41, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 323, + 124, + 0, + 1, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 688, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '329753ia', + 'AI Racer 688', + '15688 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 41, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 689, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '339916ia', + 'AI Racer 689', + '17824 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 41, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 570, + 115, + 0, + 0, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 690, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '763876ia', + 'AI Racer 690', + '5538 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 41, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 9, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 691, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '130748ia', + 'AI Racer 691', + '19330 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 42, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 692, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '861413ia', + 'AI Racer 692', + '3047 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 42, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 517, + 102, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 693, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '940574ia', + 'AI Racer 693', + '18853 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 42, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 0, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 694, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '95274ia', + 'AI Racer 694', + '10817 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 42, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 11, + 139, + 0, + 1, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 695, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '260194ia', + 'AI Racer 695', + '24284 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 42, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 696, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '349514ia', + 'AI Racer 696', + '22758 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 43, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 7, + 139, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 697, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '967634ia', + 'AI Racer 697', + '9224 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 43, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 341, + 143, + 0, + 7, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 698, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '430043ia', + 'AI Racer 698', + '24868 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 43, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 4, + 139, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 699, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '914177ia', + 'AI Racer 699', + '29211 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 43, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 2, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 700, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '863991ia', + 'AI Racer 700', + '19718 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 44, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 1, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 701, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '732600ia', + 'AI Racer 701', + '1504 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 44, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 362, + 140, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 702, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '931152ia', + 'AI Racer 702', + '9873 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 44, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 2, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 703, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '91295ia', + 'AI Racer 703', + '451 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 44, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 704, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '740375ia', + 'AI Racer 704', + '11695 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 44, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 482, + 135, + 0, + 7, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 705, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '821195ia', + 'AI Racer 705', + '6662 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 45, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 241, + 120, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 706, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '803969ia', + 'AI Racer 706', + '18934 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 45, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 5, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 707, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '185183ia', + 'AI Racer 707', + '19299 Petrick Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 45, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 339, + 126, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 708, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '627887ia', + 'AI Racer 708', + '27540 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 45, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 5, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 709, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '784354ia', + 'AI Racer 709', + '11047 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 45, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 517, + 102, + 0, + 6, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 710, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '795168ia', + 'AI Racer 710', + '21469 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 46, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 3, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 711, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '32290ia', + 'AI Racer 711', + '3536 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 46, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 12, + 139, + 0, + 1, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 712, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '265341ia', + 'AI Racer 712', + '19971 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 46, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 7, + 101, + 0, + 7, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 713, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '121830ia', + 'AI Racer 713', + '1496 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 46, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 2, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 714, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '955076ia', + 'AI Racer 714', + '20285 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 47, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 154, + 113, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 715, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 9, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '836230ia', + 'AI Racer 715', + '3299 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 47, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 8, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 716, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '50290ia', + 'AI Racer 716', + '27073 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 47, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 352, + 140, + 0, + 0, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 717, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522344ia', + 'AI Racer 717', + '29459 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 47, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 718, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '703806ia', + 'AI Racer 718', + '20601 Fell Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 47, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 512, + 139, + 0, + 6, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 719, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '307671ia', + 'AI Racer 719', + '15813 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 48, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 0, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 720, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '986269ia', + 'AI Racer 720', + '7641 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 48, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 10, + 139, + 0, + 2, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 721, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '157802ia', + 'AI Racer 721', + '3364 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 48, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 73, + 106, + 0, + 6, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 722, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '184658ia', + 'AI Racer 722', + '22794 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 48, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 615, + 143, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 723, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '390538ia', + 'AI Racer 723', + '16005 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 49, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 182, + 115, + 0, + 7, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 724, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '760587ia', + 'AI Racer 724', + '8166 Petrick Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 49, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 450, + 133, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 725, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '948166ia', + 'AI Racer 725', + '6338 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 49, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 726, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '792091ia', + 'AI Racer 726', + '8130 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 49, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 0, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 727, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '576631ia', + 'AI Racer 727', + '15503 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 49, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 728, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '841408ia', + 'AI Racer 728', + '6912 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 50, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 0, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 729, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '527174ia', + 'AI Racer 729', + '23710 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 50, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 8, + 139, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 730, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '98381ia', + 'AI Racer 730', + '12813 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 50, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 5, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 731, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '128052ia', + 'AI Racer 731', + '51 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 50, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 13, + 139, + 0, + 1, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 732, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '622648ia', + 'AI Racer 732', + '20088 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 51, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 10, + 139, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 733, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '974370ia', + 'AI Racer 733', + '20228 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 51, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 7, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 734, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522921ia', + 'AI Racer 734', + '2987 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 51, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 357, + 127, + 0, + 7, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 735, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '293030ia', + 'AI Racer 735', + '19104 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 51, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 4, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 736, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '145303ia', + 'AI Racer 736', + '22908 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 51, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 8, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 737, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '861163ia', + 'AI Racer 737', + '21594 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 52, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 738, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '866208ia', + 'AI Racer 738', + '9554 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 52, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 639, + 132, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 739, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '765345ia', + 'AI Racer 739', + '4901 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 52, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 9, + 139, + 0, + 2, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 740, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '760698ia', + 'AI Racer 740', + '20485 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 52, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 366, + 128, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 741, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '276869ia', + 'AI Racer 741', + '15532 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 53, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 423, + 132, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 742, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '900508ia', + 'AI Racer 742', + '3119 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 53, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 510, + 108, + 0, + 9, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 743, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '383417ia', + 'AI Racer 743', + '20485 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 53, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 574, + 116, + 0, + 5, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 744, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '69374ia', + 'AI Racer 744', + '17754 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 53, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 352, + 140, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 745, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '580192ia', + 'AI Racer 745', + '19640 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 53, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 7, + 139, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 746, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '800015ia', + 'AI Racer 746', + '24210 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 54, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 95, + 109, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 747, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '867472ia', + 'AI Racer 747', + '6760 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 54, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 1, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 748, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '203002ia', + 'AI Racer 748', + '16685 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 54, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 320, + 124, + 0, + 2, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 749, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '1813ia', + 'AI Racer 749', + '18371 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 54, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 152, + 113, + 0, + 6, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 750, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '737647ia', + 'AI Racer 750', + '6087 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 55, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 4, + 139, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 751, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '832918ia', + 'AI Racer 751', + '23584 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 55, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 579, + 117, + 0, + 7, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 752, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '992344ia', + 'AI Racer 752', + '189 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 55, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 524, + 104, + 0, + 5, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 753, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '330147ia', + 'AI Racer 753', + '19837 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 55, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 82, + 107, + 0, + 9, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 754, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '109599ia', + 'AI Racer 754', + '16443 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 55, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 184, + 115, + 0, + 6, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 755, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '384743ia', + 'AI Racer 755', + '23283 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 56, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 5, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 756, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '227751ia', + 'AI Racer 756', + '21956 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 56, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 594, + 121, + 0, + 8, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 757, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '505229ia', + 'AI Racer 757', + '13250 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 56, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 2, + 139, + 0, + 1, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 758, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '639762ia', + 'AI Racer 758', + '18956 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 56, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 517, + 102, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 759, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '769005ia', + 'AI Racer 759', + '28099 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 56, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 508, + 108, + 0, + 3, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 760, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '312586ia', + 'AI Racer 760', + '6421 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 57, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 355, + 140, + 0, + 9, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 761, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '173115ia', + 'AI Racer 761', + '7443 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 57, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 558, + 112, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 762, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '133532ia', + 'AI Racer 762', + '12562 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 57, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 508, + 108, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 763, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '432455ia', + 'AI Racer 763', + '5036 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 57, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 361, + 140, + 0, + 0, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 764, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '813139ia', + 'AI Racer 764', + '9886 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 58, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 635, + 131, + 0, + 2, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 765, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '792775ia', + 'AI Racer 765', + '12333 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 58, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 614, + 143, + 0, + 3, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 766, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '32052ia', + 'AI Racer 766', + '8444 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 58, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 767, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '156060ia', + 'AI Racer 767', + '9577 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 58, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 15, + 102, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 768, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '207050ia', + 'AI Racer 768', + '17324 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 58, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 11, + 139, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 769, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '253908ia', + 'AI Racer 769', + '29085 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 59, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 72, + 106, + 0, + 4, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 770, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '513633ia', + 'AI Racer 770', + '3686 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 59, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 771, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '549699ia', + 'AI Racer 771', + '3358 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 59, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 615, + 143, + 0, + 5, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 772, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '733383ia', + 'AI Racer 772', + '8144 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 59, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 5, + 139, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 773, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '276713ia', + 'AI Racer 773', + '28263 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 60, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 327, + 125, + 0, + 7, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 774, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '703974ia', + 'AI Racer 774', + '12096 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 60, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 95, + 109, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 775, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '996439ia', + 'AI Racer 775', + '4926 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 60, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 2, + 139, + 0, + 4, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 776, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '838233ia', + 'AI Racer 776', + '15063 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 60, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 5, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 777, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '539036ia', + 'AI Racer 777', + '10474 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 60, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 5, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 778, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '268247ia', + 'AI Racer 778', + '29936 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 61, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 186, + 115, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 779, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '3721ia', + 'AI Racer 779', + '10277 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 61, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 360, + 127, + 0, + 1, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 780, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '958061ia', + 'AI Racer 780', + '24258 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 61, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 314, + 124, + 0, + 0, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 781, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '409616ia', + 'AI Racer 781', + '29593 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 61, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 205, + 117, + 0, + 7, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 782, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '508842ia', + 'AI Racer 782', + '6745 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 62, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 512, + 139, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 783, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '84848ia', + 'AI Racer 783', + '15885 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 62, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 784, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '455543ia', + 'AI Racer 784', + '9106 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 62, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 11, + 144, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 785, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '575983ia', + 'AI Racer 785', + '14830 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 62, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 434, + 132, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 786, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '86639ia', + 'AI Racer 786', + '7342 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 62, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 231, + 119, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 787, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '636477ia', + 'AI Racer 787', + '26110 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 63, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 284, + 122, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 788, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '82440ia', + 'AI Racer 788', + '1330 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 63, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 789, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '737547ia', + 'AI Racer 789', + '25620 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 63, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 14, + 139, + 0, + 0, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 790, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '890036ia', + 'AI Racer 790', + '14554 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 63, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 341, + 143, + 0, + 1, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 791, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '351085ia', + 'AI Racer 791', + '7817 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 64, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 317, + 124, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 792, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '97513ia', + 'AI Racer 792', + '27644 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 64, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 793, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '728067ia', + 'AI Racer 793', + '29617 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 64, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 348, + 141, + 0, + 6, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 794, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '590410ia', + 'AI Racer 794', + '19319 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 64, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 4, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 795, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '795378ia', + 'AI Racer 795', + '26999 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 64, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 512, + 139, + 0, + 7, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 796, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '987817ia', + 'AI Racer 796', + '6308 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 65, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 362, + 140, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 797, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '505709ia', + 'AI Racer 797', + '9648 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 65, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 5, + 139, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 798, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '595757ia', + 'AI Racer 798', + '10956 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 65, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 614, + 143, + 0, + 9, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 799, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '36535ia', + 'AI Racer 799', + '6543 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 65, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 1, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 800, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '567326ia', + 'AI Racer 800', + '21057 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 66, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 801, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '535811ia', + 'AI Racer 801', + '1882 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 66, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 279, + 122, + 0, + 3, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 802, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '166770ia', + 'AI Racer 802', + '22363 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 66, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 5, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 803, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '326461ia', + 'AI Racer 803', + '7848 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 66, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 7, + 139, + 0, + 4, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 804, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '279476ia', + 'AI Racer 804', + '29216 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 66, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 10, + 139, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 805, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522434ia', + 'AI Racer 805', + '20386 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 67, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 4, + 139, + 0, + 5, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 806, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '812693ia', + 'AI Racer 806', + '13354 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 67, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 10, + 101, + 0, + 9, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 807, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '661141ia', + 'AI Racer 807', + '10269 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 67, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 479, + 135, + 0, + 4, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 808, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '121827ia', + 'AI Racer 808', + '8699 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 67, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 6, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 809, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '457021ia', + 'AI Racer 809', + '16367 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 67, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 0, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 810, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '982975ia', + 'AI Racer 810', + '16866 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 68, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 9, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 811, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '5629ia', + 'AI Racer 811', + '13599 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 68, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 614, + 143, + 0, + 4, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 812, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '78989ia', + 'AI Racer 812', + '1835 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 68, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 263, + 121, + 0, + 6, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 813, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '722178ia', + 'AI Racer 813', + '23349 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 68, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 430, + 132, + 0, + 1, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 814, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '438785ia', + 'AI Racer 814', + '1116 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 69, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 9, + 139, + 0, + 0, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 815, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '519945ia', + 'AI Racer 815', + '9008 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 69, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 288, + 122, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 816, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '95791ia', + 'AI Racer 816', + '28454 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 69, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 394, + 129, + 0, + 9, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 817, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '903799ia', + 'AI Racer 817', + '26634 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 69, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 619, + 140, + 0, + 6, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 818, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '224279ia', + 'AI Racer 818', + '18972 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 69, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 819, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '761345ia', + 'AI Racer 819', + '29044 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 70, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 10, + 139, + 0, + 1, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 820, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '71481ia', + 'AI Racer 820', + '25860 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 70, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 614, + 143, + 0, + 1, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 821, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '932999ia', + 'AI Racer 821', + '11041 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 70, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 1, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 822, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '400332ia', + 'AI Racer 822', + '12105 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 70, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 614, + 143, + 0, + 2, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 823, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '32896ia', + 'AI Racer 823', + '25059 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 71, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 8, + 139, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 824, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '554600ia', + 'AI Racer 824', + '20541 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 71, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 8, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 825, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '808589ia', + 'AI Racer 825', + '9554 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 71, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 6, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 826, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '807775ia', + 'AI Racer 826', + '10047 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 71, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 9, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 827, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '431654ia', + 'AI Racer 827', + '24177 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 71, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 4, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 828, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '958990ia', + 'AI Racer 828', + '29602 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 72, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 829, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '87116ia', + 'AI Racer 829', + '22124 Fell Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 72, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 541, + 108, + 0, + 5, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 830, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '877902ia', + 'AI Racer 830', + '6335 Torino Terrace', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 72, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 55, + 105, + 0, + 7, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 831, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '278368ia', + 'AI Racer 831', + '15499 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 72, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 356, + 140, + 0, + 4, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 832, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '99280ia', + 'AI Racer 832', + '20545 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 73, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 348, + 143, + 0, + 8, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 833, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '154147ia', + 'AI Racer 833', + '12069 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 73, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 344, + 143, + 0, + 3, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 834, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '829004ia', + 'AI Racer 834', + '28816 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 73, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 4, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 835, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '924845ia', + 'AI Racer 835', + '7986 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 73, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 620, + 140, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 836, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '339844ia', + 'AI Racer 836', + '12839 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 73, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 349, + 143, + 0, + 0, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 837, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '64718ia', + 'AI Racer 837', + '18598 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 74, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 359, + 140, + 0, + 3, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 838, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '948791ia', + 'AI Racer 838', + '17050 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 74, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 7, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 839, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '711400ia', + 'AI Racer 839', + '28013 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 74, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 6, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 840, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '518260ia', + 'AI Racer 840', + '6312 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 74, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 359, + 140, + 0, + 0, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 841, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '992545ia', + 'AI Racer 841', + '3135 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 75, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 344, + 143, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 842, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '262429ia', + 'AI Racer 842', + '15233 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 75, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 615, + 143, + 0, + 5, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 843, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '18539ia', + 'AI Racer 843', + '20524 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 75, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 361, + 140, + 0, + 7, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 844, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '761901ia', + 'AI Racer 844', + '12640 30th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 75, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 845, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '976439ia', + 'AI Racer 845', + '25788 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 75, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 81, + 107, + 0, + 1, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 846, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '493440ia', + 'AI Racer 846', + '10761 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 76, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 847, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '756885ia', + 'AI Racer 847', + '18616 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 76, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 0, + 30, + 103, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 848, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '424338ia', + 'AI Racer 848', + '3367 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 76, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 236, + 119, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 849, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '908628ia', + 'AI Racer 849', + '13245 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 76, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 619, + 140, + 0, + 1, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 850, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '484649ia', + 'AI Racer 850', + '29818 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 77, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 361, + 140, + 0, + 1, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 851, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '495244ia', + 'AI Racer 851', + '6874 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 77, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 7, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 852, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '807916ia', + 'AI Racer 852', + '221 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 77, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 13, + 139, + 0, + 3, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 853, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '640827ia', + 'AI Racer 853', + '671 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 77, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 341, + 143, + 0, + 3, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 854, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '763592ia', + 'AI Racer 854', + '29024 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 77, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 1, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 855, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '306453ia', + 'AI Racer 855', + '2556 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 78, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 352, + 140, + 0, + 9, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 856, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '24697ia', + 'AI Racer 856', + '20155 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 78, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 1, + 104, + 110, + 0, + 8, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 857, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '67729ia', + 'AI Racer 857', + '24339 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 78, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 344, + 141, + 0, + 8, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 858, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '415968ia', + 'AI Racer 858', + '10111 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 78, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 5, + 139, + 0, + 5, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 859, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '352942ia', + 'AI Racer 859', + '26361 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 78, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 12, + 144, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 860, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '547377ia', + 'AI Racer 860', + '25736 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 79, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 6, + 139, + 0, + 1, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 861, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '708167ia', + 'AI Racer 861', + '4515 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 79, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 9, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 862, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '32778ia', + 'AI Racer 862', + '27682 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 79, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 7, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 863, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '132434ia', + 'AI Racer 863', + '6375 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 79, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 864, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '149694ia', + 'AI Racer 864', + '2373 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 80, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 339, + 143, + 0, + 4, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 865, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '809469ia', + 'AI Racer 865', + '17285 Valiant Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 80, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 4, + 144, + 0, + 6, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 866, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '824156ia', + 'AI Racer 866', + '2429 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 80, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 14, + 144, + 0, + 3, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 867, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '97409ia', + 'AI Racer 867', + '16404 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 80, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 868, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '91130ia', + 'AI Racer 868', + '25569 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 80, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 347, + 141, + 0, + 1, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 869, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '270021ia', + 'AI Racer 869', + '969 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 81, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 11, + 144, + 0, + 9, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 870, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '606156ia', + 'AI Racer 870', + '9751 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 81, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 345, + 141, + 0, + 4, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 871, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '514966ia', + 'AI Racer 871', + '19262 Clarendon Drive', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 81, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 350, + 143, + 0, + 1, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 872, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '943765ia', + 'AI Racer 872', + '4416 Bryant Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 81, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 353, + 140, + 0, + 0, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 873, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '433391ia', + 'AI Racer 873', + '8015 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 82, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 346, + 141, + 0, + 5, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 874, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '948495ia', + 'AI Racer 874', + '14249 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 82, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 361, + 142, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 875, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '961290ia', + 'AI Racer 875', + '26743 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 82, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 351, + 141, + 0, + 3, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 876, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '743898ia', + 'AI Racer 876', + '20642 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 82, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 357, + 140, + 0, + 9, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 877, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '942426ia', + 'AI Racer 877', + '19663 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 82, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 348, + 141, + 0, + 0, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 878, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '117626ia', + 'AI Racer 878', + '3563 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 83, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 340, + 141, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 879, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '467750ia', + 'AI Racer 879', + '7844 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 83, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 10, + 144, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 880, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '701850ia', + 'AI Racer 880', + '22593 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 83, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 620, + 140, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 881, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '338912ia', + 'AI Racer 881', + '27742 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 83, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 4, + 144, + 0, + 7, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 882, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '13519ia', + 'AI Racer 882', + '1000 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 84, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 512, + 144, + 0, + 8, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 883, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '180014ia', + 'AI Racer 883', + '19102 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 84, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 615, + 141, + 0, + 5, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 884, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '662568ia', + 'AI Racer 884', + '15827 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 84, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 5, + 139, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 885, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '250041ia', + 'AI Racer 885', + '24909 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 84, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 886, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '428335ia', + 'AI Racer 886', + '16845 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 84, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 2, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 887, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '537232ia', + 'AI Racer 887', + '11537 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 85, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 8, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 888, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '934722ia', + 'AI Racer 888', + '26521 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 85, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 357, + 142, + 0, + 9, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 889, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '662887ia', + 'AI Racer 889', + '26372 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 85, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 9, + 139, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 890, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '622607ia', + 'AI Racer 890', + '9796 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 85, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 362, + 142, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 891, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '273895ia', + 'AI Racer 891', + '2849 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 86, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 351, + 141, + 0, + 1, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 892, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '610599ia', + 'AI Racer 892', + '16473 Dodge Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 86, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 358, + 140, + 0, + 8, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 893, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '41220ia', + 'AI Racer 893', + '19269 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 86, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 614, + 141, + 0, + 9, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 894, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '259228ia', + 'AI Racer 894', + '19052 Wheel Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 86, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 2, + 139, + 0, + 3, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 895, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '907181ia', + 'AI Racer 895', + '21818 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 86, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 341, + 141, + 0, + 0, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 896, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '785705ia', + 'AI Racer 896', + '23893 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 87, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 355, + 142, + 0, + 0, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 897, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '798940ia', + 'AI Racer 897', + '15330 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 87, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 1, + 139, + 0, + 3, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 898, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '386702ia', + 'AI Racer 898', + '1911 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 87, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 0, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 899, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '654050ia', + 'AI Racer 899', + '7932 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 87, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 353, + 142, + 0, + 1, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 900, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '983366ia', + 'AI Racer 900', + '28757 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 88, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 12, + 144, + 0, + 5, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 901, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '529744ia', + 'AI Racer 901', + '27648 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 88, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 11, + 144, + 0, + 4, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 902, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '30378ia', + 'AI Racer 902', + '13355 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 88, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 13, + 139, + 0, + 6, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 903, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '237562ia', + 'AI Racer 903', + '10939 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 88, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 359, + 142, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 904, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '551698ia', + 'AI Racer 904', + '28388 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 88, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 1, + 144, + 0, + 4, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 905, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '438821ia', + 'AI Racer 905', + '536 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 89, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 352, + 140, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 906, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '531285ia', + 'AI Racer 906', + '17 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 89, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 7, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 907, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '89389ia', + 'AI Racer 907', + '23974 Petrick Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 89, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 615, + 141, + 0, + 1, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 908, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '749209ia', + 'AI Racer 908', + '2726 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 89, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 342, + 141, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 909, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '285470ia', + 'AI Racer 909', + '434 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 89, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 351, + 141, + 0, + 3, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 910, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '358472ia', + 'AI Racer 910', + '3291 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 90, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 356, + 142, + 0, + 1, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 911, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '225079ia', + 'AI Racer 911', + '11876 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 90, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 6, + 139, + 0, + 5, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 912, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '12336ia', + 'AI Racer 912', + '939 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 90, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 7, + 144, + 0, + 8, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 913, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522762ia', + 'AI Racer 913', + '22868 Cordoba Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 90, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 341, + 141, + 0, + 5, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 914, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '832581ia', + 'AI Racer 914', + '20031 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 91, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 342, + 141, + 0, + 4, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 915, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '944307ia', + 'AI Racer 915', + '29092 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 91, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 343, + 143, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 916, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '212235ia', + 'AI Racer 916', + '3472 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 91, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 2, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 917, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '272500ia', + 'AI Racer 917', + '26018 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 91, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 345, + 143, + 0, + 5, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 918, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '996008ia', + 'AI Racer 918', + '22415 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 91, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 7, + 139, + 0, + 0, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 919, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '912168ia', + 'AI Racer 919', + '9713 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 92, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 615, + 141, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 920, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '254922ia', + 'AI Racer 920', + '27273 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 92, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 921, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '168441ia', + 'AI Racer 921', + '12348 Taney Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 92, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 351, + 143, + 0, + 8, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 922, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '490139ia', + 'AI Racer 922', + '19144 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 92, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 512, + 139, + 0, + 7, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 923, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '26344ia', + 'AI Racer 923', + '22036 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 93, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 346, + 143, + 0, + 3, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 924, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '112972ia', + 'AI Racer 924', + '20662 Tinted Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 93, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 352, + 142, + 0, + 7, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 925, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '886631ia', + 'AI Racer 925', + '967 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 93, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 346, + 141, + 0, + 2, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 926, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '512520ia', + 'AI Racer 926', + '24149 Head Row', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 93, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 347, + 141, + 0, + 2, + -5142950, + -730292, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 927, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '527479ia', + 'AI Racer 927', + '7612 Caps Creek Parkway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 93, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 347, + 141, + 0, + 7, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 928, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '514602ia', + 'AI Racer 928', + '1483 Spark Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 94, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 344, + 141, + 0, + 4, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 929, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '940771ia', + 'AI Racer 929', + '16113 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 94, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 620, + 140, + 0, + 4, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 930, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '404632ia', + 'AI Racer 930', + '16954 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 94, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 6, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 931, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '661587ia', + 'AI Racer 931', + '6982 28th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 94, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 339, + 141, + 0, + 6, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 932, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '227937ia', + 'AI Racer 932', + '22767 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 95, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 6, + 139, + 0, + 8, + -5142950, + -11452131, + NULL, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 933, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '243202ia', + 'AI Racer 933', + '17261 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 95, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 343, + 141, + 0, + 8, + -12635, + -16777216, + -15132652, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 934, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '630145ia', + 'AI Racer 934', + '6278 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 95, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 12, + 144, + 0, + 0, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 935, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '547634ia', + 'AI Racer 935', + '24808 Detroit Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 95, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 936, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '852078ia', + 'AI Racer 936', + '18193 Hardtop Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 95, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 2, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 937, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '631546ia', + 'AI Racer 937', + '29481 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 96, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 359, + 142, + 0, + 3, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 938, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '192011ia', + 'AI Racer 938', + '22149 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 96, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 361, + 140, + 0, + 3, + -11255506, + -16777216, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 939, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '939998ia', + 'AI Racer 939', + '8083 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 96, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 343, + 141, + 0, + 1, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 940, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '522113ia', + 'AI Racer 940', + '23246 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 96, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 358, + 142, + 0, + 0, + -12635, + -1, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 941, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '327561ia', + 'AI Racer 941', + '10944 39th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 97, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 353, + 140, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 942, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '931153ia', + 'AI Racer 942', + '3147 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 97, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 9, + 139, + 0, + 9, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 943, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '666099ia', + 'AI Racer 943', + '14570 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 97, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 349, + 141, + 0, + 6, + -12635, + -7592437, + -9540505, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 944, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '816773ia', + 'AI Racer 944', + '29980 36th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 97, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 342, + 143, + 0, + 9, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 945, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '825685ia', + 'AI Racer 945', + '7193 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 97, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 340, + 143, + 0, + 6, + -11255506, + NULL, + -10240, + -12343227, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 946, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '595351ia', + 'AI Racer 946', + '27056 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 98, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 347, + 143, + 0, + 4, + -12635, + -9034914, + -11516638, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 947, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '293524ia', + 'AI Racer 947', + '29505 Firebird Freeway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 98, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 2, + 354, + 140, + 0, + 2, + -12635, + -11452131, + -12343227, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 948, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 0, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '235490ia', + 'AI Racer 948', + '15010 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 98, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 3, + 341, + 143, + 0, + 6, + -5142950, + -16777216, + -65536, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 949, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 2, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '925539ia', + 'AI Racer 949', + '16823 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 98, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 358, + 142, + 0, + 7, + -12635, + -8756175, + -11516638, + -12365400, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 950, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '239317ia', + 'AI Racer 950', + '29487 31st Street', + 'Bonneville', + NULL, + NULL, + 2, + NULL, + 99, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 8, + 101, + 0, + 0, + -11255506, + -16777216, + -15132652, + -15132652, + 2, + 2, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 951, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '895768ia', + 'AI Racer 951', + '20259 27th Street', + 'Bonneville', + NULL, + NULL, + 2, + NULL, + 99, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 8, + 101, + 0, + 0, + -11255506, + -16777216, + -15132652, + -15132652, + 2, + 2, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 952, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '38819ia', + 'AI Racer 952', + '27071 37th Street', + 'Bonneville', + NULL, + NULL, + 2, + NULL, + 99, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 8, + 101, + 0, + 0, + -11255506, + -16777216, + -15132652, + -15132652, + 2, + 2, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 953, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '246897ia', + 'AI Racer 953', + '2742 Torino Terrace', + 'Bonneville', + NULL, + NULL, + 2, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 4, + 8, + 101, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + 2, + 2, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 954, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '490161ia', + 'AI Racer 954', + '14555 Fallon Place ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 955, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '479340ia', + 'AI Racer 955', + '25016 Sway Bar Lane', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 956, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '291643ia', + 'AI Racer 956', + '16108 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 957, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '141218ia', + 'AI Racer 957', + '24592 Meadowbrook Lane ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 958, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '971050ia', + 'AI Racer 958', + '21071 35th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 959, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '817138ia', + 'AI Racer 959', + '4925 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 960, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '710229ia', + 'AI Racer 960', + '3430 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 961, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '447558ia', + 'AI Racer 961', + '28907 38th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 962, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '999858ia', + 'AI Racer 962', + '7136 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 963, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '983205ia', + 'AI Racer 963', + '27822 Windsor Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 964, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '359720ia', + 'AI Racer 964', + '11213 27th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 965, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '617051ia', + 'AI Racer 965', + '5990 31st Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 966, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '586700ia', + 'AI Racer 966', + '4772 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 967, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '553491ia', + 'AI Racer 967', + '10294 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 968, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '971374ia', + 'AI Racer 968', + '3394 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 969, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '358930ia', + 'AI Racer 969', + '25161 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 970, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '604680ia', + 'AI Racer 970', + '6811 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 971, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '928315ia', + 'AI Racer 971', + '12530 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 972, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '965047ia', + 'AI Racer 972', + '20034 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 973, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '727958ia', + 'AI Racer 973', + '12519 33rd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 974, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '435500ia', + 'AI Racer 974', + '4515 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 975, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '107448ia', + 'AI Racer 975', + '13837 Motor City Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 976, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 3, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '48324ia', + 'AI Racer 976', + '16175 29th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + 99, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + 5, + 350, + 141, + 0, + 2, + -11255506, + -16777216, + -9034914, + -15132652, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 977, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '907044ia', + 'AI Racer 977', + '6380 Traction Turnpike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 978, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '833557ia', + 'AI Racer 978', + '10257 Eddy Street ', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 979, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '72366ia', + 'AI Racer 979', + '19588 Pantellas Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 980, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '934074ia', + 'AI Racer 980', + '20486 32nd Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 981, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '517416ia', + 'AI Racer 981', + '2785 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 982, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '148619ia', + 'AI Racer 982', + '22190 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 983, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '903244ia', + 'AI Racer 983', + '15285 37th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 984, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '138467ia', + 'AI Racer 984', + '5362 Buick Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 985, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '377542ia', + 'AI Racer 985', + '25582 Petrick Pike', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 986, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '966027ia', + 'AI Racer 986', + '23919 Headlight Place', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 987, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '629706ia', + 'AI Racer 987', + '20337 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 988, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '801526ia', + 'AI Racer 988', + '26597 26th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 989, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '777649ia', + 'AI Racer 989', + '6914 Van Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 990, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '57497ia', + 'AI Racer 990', + '360 Newport Way', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 991, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '338283ia', + 'AI Racer 991', + '27152 Edmunds Alley', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 992, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '645275ia', + 'AI Racer 992', + '3176 34th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 993, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '97168ia', + 'AI Racer 993', + '1684 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 994, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '228536ia', + 'AI Racer 994', + '9362 Chevrolet Highway', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 995, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '35273ia', + 'AI Racer 995', + '2521 Main Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 996, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '1761ia', + 'AI Racer 996', + '26956 40th Street', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 997, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '516805ia', + 'AI Racer 997', + '16713 Beaudoin Boulevard', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 998, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '563146ia', + 'AI Racer 998', + '7879 Convertible Court', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ), + ( + 999, + 0, + 1, + 250000, + 250000, + '1900-01-01 00:00:00.000000', + 0, + 250000, + 0, + 0, + 1, + 1, + 'AI Racer', + '00', + '01', + '02', + '03', + '04', + '05', + '52069ia', + 'AI Racer 999', + '29929 Saratoga Avenue', + 'Bonneville', + NULL, + NULL, + NULL, + NULL, + NULL, + 250000, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + 0, + NULL, + NULL, + NULL, + 0, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL + ); \ No newline at end of file diff --git a/migrations/0026-createSVACarClass.sql b/migrations/0026-createSVACarClass.sql new file mode 100644 index 000000000..7f46b9d6d --- /dev/null +++ b/migrations/0026-createSVACarClass.sql @@ -0,0 +1,8 @@ +CREATE TABLE + sva_car_class ( + sva_car_class INTEGER DEFAULT 0 NOT NULL, + description VARCHAR(50), + CONSTRAINT sys_pk_12175 PRIMARY KEY (sva_car_class) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12175_12176 ON sva_car_class (sva_car_class); \ No newline at end of file diff --git a/migrations/0027-createSVAModeRestriction.sql b/migrations/0027-createSVAModeRestriction.sql new file mode 100644 index 000000000..50679c23e --- /dev/null +++ b/migrations/0027-createSVAModeRestriction.sql @@ -0,0 +1,8 @@ +CREATE TABLE + sva_mode_restriction ( + sva_mode_restriction INTEGER DEFAULT 0 NOT NULL, + description VARCHAR(100), + CONSTRAINT sys_pk_12180 PRIMARY KEY (sva_mode_restriction) + ); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12180_12181 ON sva_mode_restriction (sva_mode_restriction); \ No newline at end of file diff --git a/migrations/0028-createStockVehicleAtrributes.sql b/migrations/0028-createStockVehicleAtrributes.sql new file mode 100644 index 000000000..32d7fdeb1 --- /dev/null +++ b/migrations/0028-createStockVehicleAtrributes.sql @@ -0,0 +1,31 @@ +CREATE TABLE IF NOT EXISTS + stock_vehicle_attributes ( + branded_part_id INTEGER NOT NULL, + car_class INTEGER, + ai_restriction_class INTEGER, + mode_restriction INTEGER, + sponsor INTEGER, + vin_branded_part_id INTEGER, + track_id INTEGER DEFAULT 0, + vin_crc INTEGER DEFAULT 0 NOT NULL, + retail_price INTEGER DEFAULT 1000, + CONSTRAINT sys_pk_12168 PRIMARY KEY (branded_part_id), + CONSTRAINT stock_vehicle_attributes_brandedpart_stockvehicleattributes FOREIGN KEY (branded_part_id) REFERENCES branded_part (branded_part_id) ON DELETE CASCADE, + CONSTRAINT stock_vehicle_attributes_brandedpart_stockvehicleattributes1 FOREIGN KEY (vin_branded_part_id) REFERENCES branded_part (branded_part_id), + CONSTRAINT stock_vehicle_attributes_sva_carclass_stockvehicleattributes FOREIGN KEY (car_class) REFERENCES sva_car_class (sva_car_class), + CONSTRAINT stock_vehicle_attributes_sva_moderestriction_stockvehicleattributes FOREIGN KEY (mode_restriction) REFERENCES sva_mode_restriction (sva_mode_restriction) ON DELETE CASCADE ON UPDATE CASCADE + ); + +CREATE INDEX IF NOT EXISTS stock_vehicle_attributes_coptrackid ON stock_vehicle_attributes (track_id); + +CREATE INDEX IF NOT EXISTS sys_idx_stock_vehicle_attributes_brandedpart_stockvehicleattribs1_12795 ON stock_vehicle_attributes (vin_branded_part_id); + +CREATE INDEX IF NOT EXISTS sys_idx_stock_vehicle_attributes_brandedpart_stockvehicleattribs_12786 ON stock_vehicle_attributes (branded_part_id); + +CREATE UNIQUE INDEX IF NOT EXISTS sys_idx_stock_vehicle_attributes_parentbrandedpartid_12162 ON stock_vehicle_attributes (branded_part_id); + +CREATE INDEX IF NOT EXISTS sys_idx_stock_vehicle_attributes_sva_carclass_stockvehicleattributes_12804 ON stock_vehicle_attributes (car_class); + +CREATE INDEX IF NOT EXISTS sys_idx_stock_vehicle_attributes_sva_moderestriction_stockvehicleattributes_12813 ON stock_vehicle_attributes (mode_restriction); + +CREATE UNIQUE INDEX IF NOT EXISTS sys_idx_sys_pk_12168_12169 ON stock_vehicle_attributes (branded_part_id); \ No newline at end of file diff --git a/migrations/0029-seedSVACarClass.sql b/migrations/0029-seedSVACarClass.sql new file mode 100644 index 000000000..0593d66b2 --- /dev/null +++ b/migrations/0029-seedSVACarClass.sql @@ -0,0 +1,7 @@ +INSERT INTO + sva_car_class (sva_car_class, "description") +VALUES + (0, 'Null'), + (1, 'Fat Fender'), + (2, 'Shoebox'), + (3, 'Muscle'); \ No newline at end of file diff --git a/migrations/0030-seedSVAModeRestriction.sql b/migrations/0030-seedSVAModeRestriction.sql new file mode 100644 index 000000000..3c79110d3 --- /dev/null +++ b/migrations/0030-seedSVAModeRestriction.sql @@ -0,0 +1,9 @@ +INSERT INTO + sva_mode_restriction (sva_mode_restriction, "description") +VALUES + (0, 'All Modes'), + (1, 'Motor City'), + (2, 'Debug'), + (3, 'Traffic'), + (4, 'Cop'), + (5, 'Arcade'); \ No newline at end of file diff --git a/migrations/0031-seedStockVehicleAttributes.sql b/migrations/0031-seedStockVehicleAttributes.sql new file mode 100644 index 000000000..827a31059 --- /dev/null +++ b/migrations/0031-seedStockVehicleAttributes.sql @@ -0,0 +1,158 @@ +INSERT INTO + stock_vehicle_attributes ( + branded_part_id, + car_class, + ai_restriction_class, + mode_restriction, + sponsor, + vin_branded_part_id, + track_id, + vin_crc, + retail_price + ) +VALUES + (101, 1, 0, 0, NULL, 101, 0, 1021354189, 7610), + (102, 1, 0, 0, NULL, 102, 0, -1730149944, 11562), + (103, 2, 0, 0, 1, 103, 0, -1175172867, 13144), + (104, 2, 1, 0, 2, 104, 0, -1916621234, 18162), + (105, 2, 0, 0, NULL, 105, 0, 454523797, 18616), + (106, 2, 0, 0, NULL, 106, 0, -851716885, 17964), + (107, 3, 0, 0, 3, 107, 0, -1748379974, 27658), + (108, 3, 0, 0, NULL, 108, 0, 1470602472, 28976), + (109, 3, 0, 0, 3, 109, 0, -1951593844, 20844), + (110, 3, 0, 0, 4, 110, 0, 616652853, 22386), + (111, 3, 0, 0, NULL, 111, 0, 290542722, 54910), + (112, 1, 1, 0, 1, 112, 0, 1363239003, 13674), + (113, 2, 2, 0, 2, 113, 0, -1210440381, 20214), + (114, 2, 0, 0, NULL, 114, 0, -947329386, 46982), + (115, 2, 2, 0, NULL, 115, 0, 362914015, 19456), + (116, 3, 0, 0, 3, 116, 0, -57467043, 31920), + (117, 3, 0, 0, NULL, 117, 0, 240098383, 106456), + (118, 2, 0, 0, NULL, 118, 0, -728377105, 21780), + (119, 3, 0, 0, NULL, 119, 0, -76507965, 29062), + (120, 3, 0, 0, NULL, 120, 0, -400099549, 39098), + (121, 3, 0, 0, 4, 121, 0, 185089250, 31346), + (122, 3, 0, 0, NULL, 122, 0, -639251059, 35486), + (123, 3, 0, 0, NULL, 123, 0, -1190729049, 34530), + (124, 1, 2, 0, 1, 124, 0, 1322255805, 20734), + (125, 2, 0, 0, NULL, 125, 0, 616095431, 22180), + (126, 3, 0, 0, 4, 126, 0, 296347663, 31036), + (127, 2, 0, 0, 2, 127, 0, 2120724018, 15940), + (128, 3, 0, 0, NULL, 128, 0, 281859969, 40806), + (129, 3, 0, 0, NULL, 129, 0, 1756655401, 35880), + (130, 3, 0, 0, NULL, 130, 0, 1478345654, 55586), + (131, 3, 0, 0, NULL, 131, 0, 290406200, 34666), + (132, 3, 0, 0, NULL, 132, 0, 1108479146, 27940), + (133, 3, 0, 0, NULL, 133, 0, 103959562, 31470), + (134, 3, 0, 0, NULL, 134, 0, -1401275087, 51874), + (135, 3, 0, 0, NULL, 135, 0, 1279692657, 24612), + (153, 3, 0, 3, 0, NULL, 0, -1733711197, 13124), + (159, 2, 0, 0, NULL, 104, 0, 71127960, 16216), + (171, 3, 0, 0, NULL, 108, 0, 95938317, 75870), + (173, 3, 0, 3, 0, NULL, 0, 821917378, 15442), + (174, 3, 0, 3, 0, NULL, 0, -1114011574, 17448), + (175, 3, 0, 3, 0, NULL, 0, 127614921, 30986), + (176, 3, 0, 3, 0, NULL, 0, 5490897, 20842), + (177, 3, 0, 3, 0, NULL, 0, -260987179, 44366), + (178, 3, 0, 3, 0, NULL, 0, 1169708297, 40912), + (179, 3, 0, 3, 0, NULL, 0, -997698018, 15442), + (184, 3, 0, 0, NULL, 133, 0, -2100426307, 36732), + (190, 3, 0, 0, NULL, 131, 0, 702282812, 41738), + (208, 2, 0, 0, NULL, 127, 0, -1933058019, 15958), + (236, 2, 1, 0, NULL, 113, 0, -132507054, 20086), + (320, 3, 0, 0, 0, 320, 0, -1930998368, 103848), + (335, 3, 0, 0, 0, 335, 0, -1417679893, 27676), + (336, 3, 0, 0, 0, 336, 0, -1457759091, 36426), + (337, 3, 0, 0, 0, 337, 0, -1471211264, 35306), + (338, 3, 0, 0, 0, 338, 0, 1151680185, 79086), + (339, 3, 0, 0, 0, 339, 0, -405643342, 50570), + (340, 3, 0, 0, 0, 340, 0, -1392644837, 49912), + (341, 3, 0, 0, 0, 341, 0, -899383748, 27844), + (342, 3, 0, 0, 0, 342, 0, -1841308194, 27998), + (343, 3, 0, 0, 0, 343, 0, 1354809895, 28504), + (344, 3, 0, 0, 0, 344, 0, 361663498, 35546), + (345, 3, 0, 0, 0, 345, 0, 1024304803, 45646), + (346, 3, 0, 0, 0, 346, 0, 739147792, 36390), + (347, 3, 0, 0, 0, 347, 0, 363654567, 29172), + (348, 3, 0, 0, 0, 348, 0, 1172991200, 33008), + (349, 3, 0, 0, 0, 349, 0, 535823263, 34620), + (350, 3, 0, 0, 0, 350, 0, -253450591, 46938), + (351, 3, 0, 0, 0, 351, 0, 1522514137, 35372), + (352, 3, 0, 0, 0, 352, 0, 960207390, 54196), + (353, 3, 0, 0, 0, 353, 0, 1367260066, 50390), + (354, 1, 0, 0, 0, 354, 0, 1298694592, 20554), + (355, 1, 0, 0, 0, 355, 0, 343020322, 17152), + (356, 2, 1, 0, 0, 356, 0, -493509567, 10246), + (357, 2, 0, 0, 0, 357, 0, -1091297472, 14696), + (358, 2, 0, 0, 0, 358, 0, -1850950053, 15560), + (359, 2, 0, 0, 0, 359, 0, 1251900878, 16656), + (360, 2, 0, 0, 0, 360, 0, -2008884082, 18208), + (361, 2, 0, 0, 0, 361, 0, 89250179, 16560), + (362, 3, 0, 0, 0, 362, 0, 282526109, 46076), + (363, 3, 0, 0, 0, 363, 0, -40698369, 21280), + (364, 3, 0, 0, 0, 364, 0, 1864120653, 102566), + (365, 3, 0, 0, 0, 365, 0, -489646267, 28474), + (366, 3, 0, 0, 0, 366, 0, -1287635300, 20522), + (367, 3, 0, 0, 0, 367, 0, -630364099, 28084), + (368, 3, 0, 0, 0, 368, 0, -448515064, 40204), + (369, 3, 0, 0, 0, 369, 0, 1169942692, 29370), + (370, 3, 0, 0, 0, 370, 0, 1472055501, 37674), + (371, 3, 0, 0, 0, 371, 0, -742484274, 32080), + (372, 3, 0, 0, 0, 372, 0, 1250189820, 35112), + (373, 3, 0, 0, 0, 373, 0, 219790868, 30660), + (374, 3, 0, 0, NULL, 120, 0, -900399956, 34938), + (375, 3, 0, 5, 0, 375, 0, 336373640, 21800), + (377, 2, 0, 5, 0, 377, 0, 1812020664, 24426), + (378, 2, 0, 5, 0, 378, 0, -1499897175, 23652), + (379, 2, 2, 5, 0, 379, 0, 1800916956, 20796), + (383, 3, 0, 5, 0, 383, 0, 690278510, 31444), + (384, 3, 0, 5, 0, 384, 0, 778235356, 41062), + (385, 2, 0, 5, 0, 385, 0, -933770060, 20552), + (386, 2, 0, 5, 0, 386, 0, -1538070422, 28076), + (387, 3, 0, 5, 0, 387, 0, -606946665, 37542), + (388, 3, 0, 5, 0, 388, 0, -452681372, 28338), + (389, 3, 0, 5, 0, 389, 0, -911118315, 34188), + (390, 2, 0, 5, 0, 390, 0, 1824323067, 26356), + (391, 2, 0, 5, 0, 391, 0, 349594734, 21320), + (392, 3, 0, 5, 0, 392, 0, -2017423296, 39308), + (393, 2, 0, 5, 0, 393, 0, 2076432346, 26382), + (394, 3, 0, 5, 0, 394, 0, -958728569, 44848), + (395, 1, 0, 2, 0, 395, 0, 2082574938, 73518), + (396, 2, 0, 2, 0, 396, 0, 664232324, 83374), + (397, 3, 0, 2, 0, 397, 0, 1823304277, 116878), + (398, 2, 0, 2, 0, 398, 0, 1595575092, 70364), + (399, 3, 7, 2, 0, 399, 0, 649508892, 174752), + (400, 3, 0, 2, 0, 400, 0, -1419219140, 104696), + (401, 3, 0, 2, 0, 401, 0, -2072889218, 115802), + (405, 3, 0, 0, 0, 405, 0, 0, 1000), + (411, 3, 0, 0, 0, 411, 0, 0, 1000), + (412, 3, 0, 0, 0, 412, 0, 0, 1000), + (413, 3, 0, 0, 0, 413, 0, 0, 1000), + (414, 0, 0, 0, 0, 414, 0, 0, 1000), + (415, 3, 1, 0, 0, 415, 0, 0, 1000), + (416, 3, 4, 0, 0, 416, 0, 0, 1000), + (417, 3, 4, 0, 0, 417, 0, 0, 1000), + (418, 0, 5, 0, 0, 418, 0, 0, 1000), + (419, 1, 5, 0, 0, 419, 0, 0, 1000), + (420, 1, 1, 0, 0, 420, 0, 0, 1000), + (421, 2, 3, 0, 0, 421, 0, 0, 1000), + (422, 1, 4, 0, 0, 422, 0, 0, 1000), + (423, 1, 3, 0, 0, 423, 0, 0, 1000), + (424, 3, 4, 0, 0, 424, 0, 0, 1000), + (425, 3, 5, 0, 0, 425, 0, 0, 1000), + (426, 3, 5, 0, 0, 426, 0, 0, 1000), + (427, 1, 2, 0, 0, 427, 0, 0, 1000), + (428, 3, 3, 0, 0, 428, 0, 0, 1000), + (429, 0, 3, 0, 0, 429, 0, 0, 1000), + (430, 0, 3, 0, 0, 430, 0, 0, 1000), + (431, 3, 6, 0, 0, 431, 0, 0, 1000), + (432, 0, 0, 0, 0, 432, 0, 0, 1000), + (433, 0, 0, 0, 0, 433, 0, 0, 1000), + (434, 0, 0, 0, 0, 434, 0, 0, 1000), + (435, 0, 0, 0, 0, 435, 0, 0, 1000), + (436, 0, 0, 0, 0, 436, 0, 0, 1000), + (437, 0, 0, 0, 0, 437, 0, 0, 1000), + (438, 0, 0, 0, 0, 438, 0, 0, 1000), + (439, 3, 3, 0, 0, 439, 0, 0, 1000), + (440, 0, 0, 0, 0, 440, 0, 0, 1000), + (441, 3, 0, 0, 0, 441, 0, 0, 1000); \ No newline at end of file diff --git a/migrations/0032-createStockAssembly.sql b/migrations/0032-createStockAssembly.sql new file mode 100644 index 000000000..60bd78a74 --- /dev/null +++ b/migrations/0032-createStockAssembly.sql @@ -0,0 +1,28 @@ +CREATE TABLE + stock_assembly ( + parent_branded_part_id INTEGER NOT NULL, + child_branded_part_id INTEGER NOT NULL, + attachment_point_id INTEGER NOT NULL, + config_default SMALLINT NOT NULL, + physics_default SMALLINT NOT NULL, + CONSTRAINT sys_pk_12146 PRIMARY KEY ( + parent_branded_part_id, + child_branded_part_id, + attachment_point_id + ), + CONSTRAINT stockassembly_attachmentpointstockassembly FOREIGN KEY (attachment_point_id) REFERENCES attachment_point (attachment_point_id), + CONSTRAINT stockassembly_brandedpartstockassembly FOREIGN KEY (child_branded_part_id) REFERENCES branded_part (branded_part_id), + CONSTRAINT stockassembly_brandedpartstockassembly1 FOREIGN KEY (parent_branded_part_id) REFERENCES branded_part (branded_part_id) + ); + +CREATE INDEX sys_idx_stockassembly_attachmentpointstockassembly_12750 ON stock_assembly (attachment_point_id); + +CREATE INDEX sys_idx_stockassembly_brandedpartstockassembly1_12774 ON stock_assembly (parent_branded_part_id); + +CREATE INDEX sys_idx_stockassembly_brandedpartstockassembly_12762 ON stock_assembly (child_branded_part_id); + +CREATE UNIQUE INDEX sys_idx_sys_pk_12146_12147 ON stock_assembly ( + parent_branded_part_id, + child_branded_part_id, + attachment_point_id +); \ No newline at end of file diff --git a/migrations/0033-seedStockAssembly.sql b/migrations/0033-seedStockAssembly.sql new file mode 100644 index 000000000..0facaf0a1 --- /dev/null +++ b/migrations/0033-seedStockAssembly.sql @@ -0,0 +1,9303 @@ +INSERT INTO + stock_assembly ( + parent_branded_part_id, + child_branded_part_id, + attachment_point_id, + config_default, + physics_default + ) +VALUES + (101, 1001, 0, 0, 0), + (101, 2001, 0, 1, 1), + (101, 4001, 0, 0, 0), + (101, 5001, 0, 0, 0), + (101, 6001, 0, 0, 0), + (101, 10009, 11, 0, 0), + (101, 10010, 10, 0, 0), + (101, 11004, 10, 0, 0), + (101, 11004, 11, 0, 0), + (101, 12002, 11, 0, 0), + (101, 12004, 10, 0, 0), + (101, 15001, 0, 0, 0), + (101, 20101, 0, 0, 0), + (101, 22016, 0, 0, 0), + (101, 23003, 0, 0, 0), + (101, 31153, 0, 0, 0), + (101, 34001, 10, 0, 0), + (101, 34002, 11, 0, 0), + (101, 35001, 10, 0, 0), + (101, 35001, 11, 0, 0), + (101, 36001, 0, 0, 0), + (101, 37001, 0, 0, 0), + (101, 40002, 0, 0, 0), + (101, 100002, 10, 0, 0), + (101, 100002, 11, 0, 0), + (101, 110001, 10, 1, 1), + (101, 110001, 11, 1, 1), + (101, 130012, 0, 0, 0), + (101, 140023, 0, 0, 0), + (101, 160021, 0, 0, 0), + (101, 180019, 0, 0, 0), + (101, 190021, 0, 0, 0), + (101, 200019, 0, 0, 0), + (101, 230002, 0, 0, 0), + (101, 240003, 0, 0, 0), + (101, 250020, 0, 0, 0), + (101, 280019, 0, 0, 0), + (101, 290001, 0, 0, 0), + (101, 300001, 0, 0, 0), + (101, 320023, 0, 0, 0), + (101, 330016, 0, 0, 0), + (101, 340001, 0, 0, 0), + (101, 1000002, 0, 0, 0), + (101, 1100016, 0, 0, 0), + (101, 1200018, 0, 0, 0), + (102, 1001, 0, 1, 1), + (102, 2001, 0, 1, 1), + (102, 4001, 0, 1, 0), + (102, 5001, 0, 0, 0), + (102, 6001, 0, 0, 0), + (102, 10009, 11, 0, 0), + (102, 10010, 10, 0, 0), + (102, 11004, 10, 0, 0), + (102, 11004, 11, 0, 0), + (102, 12003, 11, 0, 0), + (102, 12005, 10, 0, 0), + (102, 15001, 0, 0, 0), + (102, 20102, 0, 0, 0), + (102, 22016, 0, 0, 0), + (102, 23009, 0, 0, 0), + (102, 31153, 0, 0, 0), + (102, 35002, 10, 0, 0), + (102, 35002, 11, 0, 0), + (102, 36001, 0, 0, 0), + (102, 37001, 0, 0, 0), + (102, 40003, 0, 0, 0), + (102, 100002, 10, 0, 0), + (102, 100002, 11, 0, 0), + (102, 110018, 10, 1, 1), + (102, 110018, 11, 1, 1), + (102, 130012, 0, 0, 0), + (102, 140025, 0, 0, 0), + (102, 160021, 0, 0, 0), + (102, 180019, 0, 0, 0), + (102, 190021, 0, 0, 0), + (102, 200019, 0, 0, 0), + (102, 230002, 0, 0, 0), + (102, 240003, 0, 0, 0), + (102, 250020, 0, 0, 0), + (102, 280019, 0, 0, 0), + (102, 290001, 0, 0, 0), + (102, 300001, 0, 0, 0), + (102, 320023, 0, 0, 0), + (102, 330006, 0, 0, 0), + (102, 340001, 0, 0, 0), + (102, 1000002, 0, 0, 0), + (102, 1100016, 0, 0, 0), + (102, 1200018, 0, 0, 0), + (103, 1001, 0, 1, 1), + (103, 2001, 0, 1, 1), + (103, 4001, 0, 9, 0), + (103, 5001, 0, 0, 0), + (103, 6001, 0, 0, 0), + (103, 10009, 11, 0, 0), + (103, 10010, 10, 0, 0), + (103, 11004, 10, 0, 0), + (103, 11004, 11, 0, 0), + (103, 12007, 10, 0, 0), + (103, 12028, 11, 0, 0), + (103, 15001, 0, 0, 0), + (103, 20103, 0, 0, 0), + (103, 22014, 0, 0, 0), + (103, 31153, 0, 0, 0), + (103, 36001, 0, 0, 0), + (103, 37001, 0, 0, 0), + (103, 40005, 0, 0, 0), + (103, 100002, 10, 0, 0), + (103, 100002, 11, 0, 0), + (103, 110012, 10, 1, 1), + (103, 110012, 11, 1, 1), + (103, 130047, 0, 0, 0), + (103, 140014, 0, 0, 0), + (103, 160022, 0, 0, 0), + (103, 180019, 0, 0, 0), + (103, 190021, 0, 0, 0), + (103, 200019, 0, 0, 0), + (103, 230002, 0, 0, 0), + (103, 240003, 0, 0, 0), + (103, 250020, 0, 0, 0), + (103, 280019, 0, 0, 0), + (103, 290001, 0, 0, 0), + (103, 300001, 0, 0, 0), + (103, 320023, 0, 0, 0), + (103, 330006, 0, 0, 0), + (103, 340001, 0, 0, 0), + (103, 1000004, 0, 0, 0), + (103, 1100016, 0, 0, 0), + (103, 1200018, 0, 0, 0), + (104, 1001, 0, 1, 1), + (104, 2001, 0, 1, 1), + (104, 4001, 0, 0, 0), + (104, 5001, 0, 0, 0), + (104, 6001, 0, 0, 0), + (104, 10001, 10, 0, 0), + (104, 10004, 11, 0, 0), + (104, 11004, 10, 0, 0), + (104, 11004, 11, 0, 0), + (104, 12010, 10, 0, 0), + (104, 12022, 11, 0, 0), + (104, 15001, 0, 0, 0), + (104, 20104, 0, 0, 0), + (104, 22014, 0, 0, 0), + (104, 31153, 0, 0, 0), + (104, 36001, 0, 0, 0), + (104, 37001, 0, 0, 0), + (104, 40006, 0, 0, 0), + (104, 100006, 10, 0, 0), + (104, 100006, 11, 0, 0), + (104, 110021, 10, 1, 1), + (104, 110021, 11, 1, 1), + (104, 130047, 0, 0, 0), + (104, 140007, 0, 0, 0), + (104, 160026, 0, 0, 0), + (104, 180018, 0, 0, 0), + (104, 190077, 0, 0, 0), + (104, 200066, 0, 0, 0), + (104, 230001, 0, 0, 0), + (104, 240001, 0, 0, 0), + (104, 250030, 0, 0, 0), + (104, 280030, 0, 0, 0), + (104, 290001, 0, 0, 0), + (104, 300001, 0, 0, 0), + (104, 320098, 0, 0, 0), + (104, 330020, 0, 0, 0), + (104, 340002, 0, 0, 0), + (104, 1000001, 0, 0, 0), + (104, 1100119, 0, 0, 0), + (104, 1200048, 0, 0, 0), + (105, 1001, 0, 1, 1), + (105, 2001, 0, 1, 1), + (105, 4001, 0, 0, 0), + (105, 5001, 0, 0, 0), + (105, 6001, 0, 0, 0), + (105, 10011, 10, 0, 0), + (105, 10011, 11, 0, 0), + (105, 11004, 10, 0, 0), + (105, 11004, 11, 0, 0), + (105, 12009, 10, 0, 0), + (105, 12030, 11, 0, 0), + (105, 15001, 0, 0, 0), + (105, 20105, 0, 0, 0), + (105, 22014, 0, 0, 0), + (105, 31153, 0, 0, 0), + (105, 36001, 0, 0, 0), + (105, 37001, 0, 0, 0), + (105, 40007, 0, 0, 0), + (105, 100002, 10, 0, 0), + (105, 100002, 11, 0, 0), + (105, 110021, 10, 1, 1), + (105, 110021, 11, 1, 1), + (105, 130047, 0, 0, 0), + (105, 140008, 0, 0, 1), + (105, 160026, 0, 0, 0), + (105, 180018, 0, 0, 0), + (105, 190077, 0, 0, 0), + (105, 200066, 0, 0, 0), + (105, 230001, 0, 0, 0), + (105, 240001, 0, 0, 0), + (105, 250030, 0, 0, 0), + (105, 280030, 0, 0, 0), + (105, 290001, 0, 0, 0), + (105, 300001, 0, 0, 0), + (105, 320098, 0, 0, 0), + (105, 330020, 0, 0, 0), + (105, 340002, 0, 0, 0), + (105, 1000001, 0, 0, 0), + (105, 1100119, 0, 0, 0), + (105, 1200048, 0, 0, 0), + (106, 1001, 0, 1, 1), + (106, 2001, 0, 1, 1), + (106, 4001, 0, 0, 0), + (106, 5001, 0, 0, 0), + (106, 6001, 0, 0, 0), + (106, 10011, 10, 0, 0), + (106, 10011, 11, 0, 0), + (106, 11004, 10, 0, 0), + (106, 11004, 11, 0, 0), + (106, 12009, 10, 0, 0), + (106, 12012, 11, 0, 0), + (106, 15001, 0, 0, 0), + (106, 20106, 0, 0, 0), + (106, 22014, 0, 0, 0), + (106, 31153, 0, 0, 0), + (106, 36001, 0, 0, 0), + (106, 37001, 0, 0, 0), + (106, 40008, 0, 0, 0), + (106, 100002, 10, 0, 0), + (106, 100002, 11, 0, 0), + (106, 110032, 10, 1, 1), + (106, 110032, 11, 1, 1), + (106, 130026, 0, 0, 0), + (106, 140003, 0, 0, 0), + (106, 160026, 0, 0, 0), + (106, 180018, 0, 0, 0), + (106, 190077, 0, 0, 0), + (106, 200066, 0, 0, 0), + (106, 230001, 0, 0, 0), + (106, 240001, 0, 0, 0), + (106, 250030, 0, 0, 0), + (106, 280030, 0, 0, 0), + (106, 290002, 0, 0, 0), + (106, 300001, 0, 0, 0), + (106, 320040, 0, 0, 0), + (106, 330035, 0, 0, 0), + (106, 340002, 0, 0, 0), + (106, 1000001, 0, 0, 0), + (106, 1100119, 0, 0, 0), + (106, 1200048, 0, 0, 0), + (107, 1001, 0, 1, 1), + (107, 2001, 0, 1, 1), + (107, 4001, 0, 0, 0), + (107, 5001, 0, 0, 0), + (107, 6001, 0, 0, 0), + (107, 10011, 10, 0, 0), + (107, 10011, 11, 0, 0), + (107, 11004, 10, 0, 0), + (107, 11004, 11, 0, 0), + (107, 12009, 10, 0, 0), + (107, 12012, 11, 0, 0), + (107, 13011, 10, 0, 0), + (107, 15001, 0, 0, 0), + (107, 20107, 0, 0, 0), + (107, 22014, 0, 0, 0), + (107, 31153, 0, 0, 0), + (107, 36001, 0, 0, 0), + (107, 37001, 0, 0, 0), + (107, 40009, 0, 0, 0), + (107, 100002, 10, 0, 0), + (107, 100002, 11, 0, 0), + (107, 110036, 10, 1, 1), + (107, 110036, 11, 1, 1), + (107, 130026, 0, 0, 0), + (107, 140003, 0, 0, 0), + (107, 160030, 0, 0, 0), + (107, 180017, 0, 0, 0), + (107, 190002, 0, 0, 0), + (107, 200001, 0, 0, 0), + (107, 230001, 0, 0, 0), + (107, 240001, 0, 0, 0), + (107, 250001, 0, 0, 0), + (107, 280001, 0, 0, 0), + (107, 290002, 0, 0, 0), + (107, 300001, 0, 0, 0), + (107, 320006, 0, 0, 0), + (107, 330035, 0, 0, 0), + (107, 340002, 0, 0, 0), + (107, 1000132, 0, 0, 0), + (107, 1100010, 0, 0, 0), + (107, 1200003, 0, 0, 0), + (108, 1001, 0, 1, 1), + (108, 2001, 0, 1, 1), + (108, 4001, 0, 0, 0), + (108, 5001, 0, 0, 0), + (108, 6001, 0, 0, 0), + (108, 10010, 10, 0, 0), + (108, 10010, 11, 0, 0), + (108, 11004, 10, 0, 0), + (108, 11004, 11, 0, 0), + (108, 12006, 10, 0, 0), + (108, 12028, 11, 0, 0), + (108, 13010, 10, 0, 0), + (108, 15001, 0, 0, 0), + (108, 20108, 0, 0, 0), + (108, 22014, 0, 0, 0), + (108, 31153, 0, 0, 0), + (108, 36001, 0, 0, 0), + (108, 37001, 0, 0, 0), + (108, 40013, 0, 0, 0), + (108, 100002, 10, 0, 0), + (108, 100002, 11, 0, 0), + (108, 110044, 10, 0, 0), + (108, 110044, 11, 0, 0), + (108, 130034, 0, 0, 0), + (108, 140019, 0, 0, 0), + (108, 160025, 0, 0, 0), + (108, 180030, 0, 0, 0), + (108, 190020, 0, 0, 0), + (108, 200004, 0, 0, 0), + (108, 230001, 0, 0, 0), + (108, 240001, 0, 0, 0), + (108, 250001, 0, 0, 0), + (108, 280018, 0, 0, 0), + (108, 290001, 0, 0, 0), + (108, 300001, 0, 0, 0), + (108, 320022, 0, 0, 0), + (108, 330003, 0, 0, 0), + (108, 340002, 0, 0, 0), + (108, 1000138, 0, 0, 0), + (108, 1100005, 0, 0, 0), + (108, 1200017, 0, 0, 0), + (109, 1001, 0, 1, 1), + (109, 2001, 0, 1, 1), + (109, 4001, 0, 0, 0), + (109, 5001, 0, 0, 0), + (109, 6001, 0, 0, 0), + (109, 10010, 10, 0, 0), + (109, 10010, 11, 0, 0), + (109, 11004, 10, 0, 0), + (109, 11004, 11, 0, 0), + (109, 12009, 10, 0, 0), + (109, 12029, 11, 0, 0), + (109, 15001, 0, 0, 0), + (109, 20109, 0, 0, 0), + (109, 22014, 0, 0, 0), + (109, 31153, 0, 0, 0), + (109, 36001, 0, 0, 0), + (109, 37001, 0, 0, 0), + (109, 40011, 0, 0, 0), + (109, 100002, 10, 0, 0), + (109, 100002, 11, 0, 0), + (109, 110032, 10, 0, 0), + (109, 110032, 11, 0, 0), + (109, 130034, 0, 0, 0), + (109, 140003, 0, 0, 0), + (109, 160025, 0, 0, 0), + (109, 180030, 0, 0, 0), + (109, 190020, 0, 0, 0), + (109, 200004, 0, 0, 0), + (109, 230001, 0, 0, 0), + (109, 240001, 0, 0, 0), + (109, 250001, 0, 0, 0), + (109, 280018, 0, 0, 0), + (109, 290001, 0, 0, 0), + (109, 300001, 0, 0, 0), + (109, 320022, 0, 0, 0), + (109, 330003, 0, 0, 0), + (109, 340002, 0, 0, 0), + (109, 1000138, 0, 0, 0), + (109, 1100005, 0, 0, 0), + (109, 1200017, 0, 0, 0), + (110, 1001, 0, 1, 1), + (110, 2001, 0, 1, 1), + (110, 4001, 0, 0, 0), + (110, 5001, 0, 0, 0), + (110, 6001, 0, 0, 0), + (110, 10002, 10, 0, 0), + (110, 10010, 11, 0, 0), + (110, 11004, 10, 0, 0), + (110, 11004, 11, 0, 0), + (110, 12008, 10, 0, 0), + (110, 12022, 11, 0, 0), + (110, 13011, 10, 0, 0), + (110, 15001, 0, 0, 0), + (110, 20110, 0, 0, 0), + (110, 22014, 0, 0, 0), + (110, 31153, 0, 0, 0), + (110, 36001, 0, 0, 0), + (110, 37001, 0, 0, 0), + (110, 40012, 0, 0, 0), + (110, 100002, 10, 0, 0), + (110, 100002, 11, 0, 0), + (110, 110044, 10, 1, 1), + (110, 110044, 11, 1, 1), + (110, 130026, 0, 0, 0), + (110, 140020, 0, 0, 0), + (110, 160027, 0, 0, 0), + (110, 180030, 0, 0, 0), + (110, 190020, 0, 0, 0), + (110, 200004, 0, 0, 0), + (110, 230001, 0, 0, 0), + (110, 240001, 0, 0, 0), + (110, 250001, 0, 0, 0), + (110, 280018, 0, 0, 0), + (110, 290001, 0, 0, 0), + (110, 300001, 0, 0, 0), + (110, 320022, 0, 0, 0), + (110, 330003, 0, 0, 0), + (110, 340002, 0, 0, 0), + (110, 1000138, 0, 0, 0), + (110, 1100005, 0, 0, 0), + (110, 1200017, 0, 0, 0), + (111, 1001, 0, 1, 1), + (111, 2001, 0, 1, 1), + (111, 4001, 0, 0, 0), + (111, 5001, 0, 0, 0), + (111, 6001, 0, 0, 0), + (111, 10010, 11, 0, 0), + (111, 10017, 10, 0, 0), + (111, 11009, 10, 0, 0), + (111, 11009, 11, 0, 0), + (111, 12008, 10, 0, 0), + (111, 12029, 11, 0, 0), + (111, 13007, 11, 0, 0), + (111, 13009, 10, 0, 0), + (111, 15001, 0, 0, 0), + (111, 20111, 0, 0, 0), + (111, 22014, 0, 0, 0), + (111, 29002, 0, 0, 0), + (111, 30003, 0, 0, 0), + (111, 31153, 0, 0, 0), + (111, 36001, 0, 0, 0), + (111, 37001, 0, 0, 0), + (111, 40013, 0, 0, 0), + (111, 100112, 10, 0, 0), + (111, 100112, 11, 0, 0), + (111, 110083, 10, 1, 1), + (111, 110084, 11, 1, 1), + (111, 130034, 0, 0, 0), + (111, 140020, 0, 0, 0), + (111, 160027, 0, 0, 0), + (111, 180034, 0, 0, 0), + (111, 190001, 0, 0, 0), + (111, 200054, 0, 0, 0), + (111, 230003, 0, 0, 0), + (111, 240005, 0, 0, 0), + (111, 250001, 0, 0, 0), + (111, 280041, 0, 0, 0), + (111, 290002, 0, 0, 0), + (111, 300011, 0, 0, 0), + (111, 320087, 0, 0, 0), + (111, 330025, 0, 0, 0), + (111, 340003, 0, 0, 0), + (111, 1000139, 0, 0, 0), + (111, 1100005, 0, 0, 0), + (111, 1200038, 0, 0, 0), + (112, 1001, 0, 1, 1), + (112, 2001, 0, 1, 1), + (112, 4001, 0, 0, 0), + (112, 5001, 0, 0, 0), + (112, 6001, 0, 0, 0), + (112, 10001, 10, 0, 0), + (112, 10004, 11, 0, 0), + (112, 11004, 10, 0, 0), + (112, 11004, 11, 0, 0), + (112, 12007, 10, 0, 0), + (112, 12028, 11, 0, 0), + (112, 15001, 0, 0, 0), + (112, 20112, 0, 0, 0), + (112, 22014, 0, 0, 0), + (112, 31153, 0, 0, 0), + (112, 36001, 0, 0, 0), + (112, 37001, 0, 0, 0), + (112, 40004, 0, 0, 0), + (112, 100002, 10, 0, 0), + (112, 100002, 11, 0, 0), + (112, 110017, 10, 1, 1), + (112, 110017, 11, 1, 1), + (112, 130012, 0, 0, 0), + (112, 140024, 0, 0, 0), + (112, 160047, 0, 0, 0), + (112, 180019, 0, 0, 0), + (112, 190021, 0, 0, 0), + (112, 200019, 0, 0, 0), + (112, 230002, 0, 0, 0), + (112, 240001, 0, 0, 0), + (112, 250020, 0, 0, 0), + (112, 280019, 0, 0, 0), + (112, 290001, 0, 0, 0), + (112, 300001, 0, 0, 0), + (112, 320023, 0, 0, 0), + (112, 330006, 0, 0, 0), + (112, 340001, 0, 0, 0), + (112, 1000003, 0, 0, 0), + (112, 1100016, 0, 0, 0), + (112, 1200018, 0, 0, 0), + (113, 1001, 0, 1, 1), + (113, 2001, 0, 1, 1), + (113, 4001, 0, 0, 0), + (113, 5001, 0, 0, 0), + (113, 6001, 0, 0, 0), + (113, 10001, 10, 0, 0), + (113, 10004, 11, 0, 0), + (113, 11004, 10, 0, 0), + (113, 11004, 11, 0, 0), + (113, 12009, 10, 0, 0), + (113, 12030, 11, 0, 0), + (113, 15001, 0, 0, 0), + (113, 20113, 0, 0, 0), + (113, 22009, 0, 0, 0), + (113, 31153, 0, 0, 0), + (113, 36001, 0, 0, 0), + (113, 37001, 0, 0, 0), + (113, 40016, 0, 0, 0), + (113, 100002, 10, 0, 0), + (113, 100002, 11, 0, 0), + (113, 110014, 10, 1, 1), + (113, 110014, 11, 1, 1), + (113, 130021, 0, 0, 0), + (113, 140021, 0, 0, 0), + (113, 160006, 0, 0, 0), + (113, 180014, 0, 0, 0), + (113, 190016, 0, 0, 0), + (113, 200002, 0, 0, 0), + (113, 230001, 0, 0, 0), + (113, 240001, 0, 0, 0), + (113, 250026, 0, 0, 0), + (113, 280024, 0, 0, 0), + (113, 290003, 0, 0, 0), + (113, 300001, 0, 0, 0), + (113, 320020, 0, 0, 0), + (113, 330052, 0, 0, 0), + (113, 340002, 0, 0, 0), + (113, 1000123, 0, 0, 0), + (113, 1100001, 0, 0, 0), + (113, 1200034, 0, 0, 0), + (114, 1001, 0, 1, 1), + (114, 2001, 0, 1, 1), + (114, 4001, 0, 0, 0), + (114, 5001, 0, 0, 0), + (114, 6001, 0, 0, 0), + (114, 10006, 11, 0, 0), + (114, 10015, 10, 0, 0), + (114, 11006, 10, 0, 0), + (114, 11006, 11, 0, 0), + (114, 12021, 10, 0, 0), + (114, 12029, 11, 0, 0), + (114, 13006, 10, 0, 0), + (114, 15001, 0, 0, 0), + (114, 20114, 0, 0, 0), + (114, 22009, 0, 0, 0), + (114, 31153, 0, 0, 0), + (114, 36001, 0, 0, 0), + (114, 37001, 0, 0, 0), + (114, 40018, 0, 0, 0), + (114, 100002, 10, 0, 0), + (114, 100002, 11, 0, 0), + (114, 110012, 10, 1, 1), + (114, 110012, 11, 1, 1), + (114, 130032, 0, 0, 0), + (114, 140009, 0, 0, 0), + (114, 160006, 0, 0, 0), + (114, 180014, 0, 0, 0), + (114, 190016, 0, 0, 0), + (114, 200002, 0, 0, 0), + (114, 230001, 0, 0, 0), + (114, 240001, 0, 0, 0), + (114, 250026, 0, 0, 0), + (114, 280024, 0, 0, 0), + (114, 290001, 0, 0, 0), + (114, 300001, 0, 0, 0), + (114, 320030, 0, 0, 0), + (114, 330052, 0, 0, 0), + (114, 340002, 0, 0, 0), + (114, 1000015, 0, 0, 0), + (114, 1100001, 0, 0, 0), + (114, 1200034, 0, 0, 0), + (115, 1001, 0, 1, 1), + (115, 2001, 0, 1, 1), + (115, 4001, 0, 0, 0), + (115, 5001, 0, 0, 0), + (115, 6001, 0, 0, 0), + (115, 10011, 10, 0, 0), + (115, 10011, 11, 0, 0), + (115, 11004, 10, 0, 0), + (115, 11004, 11, 0, 0), + (115, 12009, 10, 0, 0), + (115, 12030, 11, 0, 0), + (115, 15001, 0, 0, 0), + (115, 20115, 0, 0, 0), + (115, 22009, 0, 0, 0), + (115, 31153, 0, 0, 0), + (115, 36001, 0, 0, 0), + (115, 37001, 0, 0, 0), + (115, 40017, 0, 0, 0), + (115, 100002, 10, 0, 0), + (115, 100002, 11, 0, 0), + (115, 110014, 10, 1, 1), + (115, 110014, 11, 1, 1), + (115, 130021, 0, 0, 0), + (115, 140018, 0, 0, 0), + (115, 160006, 0, 0, 0), + (115, 180014, 0, 0, 0), + (115, 190016, 0, 0, 0), + (115, 200002, 0, 0, 0), + (115, 230001, 0, 0, 0), + (115, 240001, 0, 0, 0), + (115, 250026, 0, 0, 0), + (115, 280024, 0, 0, 0), + (115, 290004, 0, 0, 0), + (115, 300001, 0, 0, 0), + (115, 320030, 0, 0, 0), + (115, 330053, 0, 0, 0), + (115, 340002, 0, 0, 0), + (115, 1000015, 0, 0, 0), + (115, 1100158, 0, 0, 0), + (115, 1200034, 0, 0, 0), + (116, 1001, 0, 1, 1), + (116, 2001, 0, 1, 1), + (116, 4001, 0, 0, 0), + (116, 5001, 0, 0, 0), + (116, 6001, 0, 0, 0), + (116, 10011, 10, 0, 0), + (116, 10011, 11, 0, 0), + (116, 11004, 10, 0, 0), + (116, 11004, 11, 0, 0), + (116, 12007, 10, 0, 0), + (116, 12021, 11, 0, 0), + (116, 13009, 10, 0, 0), + (116, 15001, 0, 0, 0), + (116, 20116, 0, 0, 0), + (116, 22009, 0, 0, 0), + (116, 31153, 0, 0, 0), + (116, 36001, 0, 0, 0), + (116, 37001, 0, 0, 0), + (116, 40022, 0, 0, 0), + (116, 100002, 10, 0, 0), + (116, 100002, 11, 0, 0), + (116, 110035, 10, 1, 1), + (116, 110035, 11, 1, 1), + (116, 130021, 0, 0, 0), + (116, 140009, 0, 0, 0), + (116, 160006, 0, 0, 0), + (116, 180014, 0, 0, 0), + (116, 190016, 0, 0, 0), + (116, 200002, 0, 0, 0), + (116, 230001, 0, 0, 0), + (116, 240032, 0, 0, 0), + (116, 250026, 0, 0, 0), + (116, 280016, 0, 0, 0), + (116, 290004, 0, 0, 0), + (116, 300001, 0, 0, 0), + (116, 320020, 0, 0, 0), + (116, 330053, 0, 0, 0), + (116, 340002, 0, 0, 0), + (116, 1000070, 0, 0, 0), + (116, 1100001, 0, 0, 0), + (116, 1200034, 0, 0, 0), + (117, 1001, 0, 1, 1), + (117, 2001, 0, 1, 1), + (117, 4001, 0, 0, 0), + (117, 5001, 0, 0, 0), + (117, 6001, 0, 0, 0), + (117, 10021, 10, 0, 0), + (117, 10026, 11, 0, 0), + (117, 11006, 10, 0, 0), + (117, 11006, 11, 0, 0), + (117, 12007, 11, 0, 0), + (117, 12021, 10, 0, 0), + (117, 13006, 10, 0, 0), + (117, 15001, 0, 0, 0), + (117, 20117, 0, 0, 0), + (117, 22009, 0, 0, 0), + (117, 31153, 0, 0, 0), + (117, 36001, 0, 0, 0), + (117, 37001, 0, 0, 0), + (117, 40021, 0, 0, 0), + (117, 100120, 10, 0, 0), + (117, 100120, 11, 0, 0), + (117, 110087, 10, 1, 1), + (117, 110088, 11, 1, 1), + (117, 130008, 0, 0, 0), + (117, 140005, 0, 0, 0), + (117, 160009, 0, 0, 0), + (117, 180014, 0, 0, 0), + (117, 190016, 0, 0, 0), + (117, 200002, 0, 0, 0), + (117, 230003, 0, 0, 0), + (117, 240006, 0, 0, 0), + (117, 250002, 0, 0, 0), + (117, 280024, 0, 0, 0), + (117, 290004, 0, 0, 0), + (117, 300001, 0, 0, 0), + (117, 320030, 0, 0, 0), + (117, 330057, 0, 0, 0), + (117, 340003, 0, 0, 0), + (117, 1000073, 0, 0, 0), + (117, 1100025, 0, 0, 0), + (117, 1200023, 0, 0, 0), + (118, 1001, 0, 1, 1), + (118, 2001, 0, 1, 1), + (118, 4001, 0, 0, 0), + (118, 5001, 0, 0, 0), + (118, 6001, 0, 0, 0), + (118, 10011, 10, 0, 0), + (118, 10011, 11, 0, 0), + (118, 11004, 10, 0, 0), + (118, 11004, 11, 0, 0), + (118, 12006, 11, 0, 0), + (118, 12007, 10, 0, 0), + (118, 15001, 0, 0, 0), + (118, 20118, 0, 0, 0), + (118, 22009, 0, 0, 0), + (118, 31153, 0, 0, 0), + (118, 36001, 0, 0, 0), + (118, 37001, 0, 0, 0), + (118, 40019, 0, 0, 0), + (118, 100002, 10, 0, 0), + (118, 100002, 11, 0, 0), + (118, 110032, 10, 1, 1), + (118, 110032, 11, 1, 1), + (118, 130032, 0, 0, 0), + (118, 140016, 0, 0, 0), + (118, 160011, 0, 0, 0), + (118, 180062, 0, 0, 0), + (118, 190067, 0, 0, 0), + (118, 200048, 0, 0, 0), + (118, 230001, 0, 0, 0), + (118, 240001, 0, 0, 0), + (118, 250026, 0, 0, 0), + (118, 280051, 0, 0, 0), + (118, 290004, 0, 0, 0), + (118, 300001, 0, 0, 0), + (118, 320100, 0, 0, 0), + (118, 330056, 0, 0, 0), + (118, 340002, 0, 0, 0), + (118, 1000057, 0, 0, 0), + (118, 1100120, 0, 0, 0), + (118, 1200049, 0, 0, 0), + (119, 1001, 0, 1, 1), + (119, 2001, 0, 1, 1), + (119, 4001, 0, 0, 0), + (119, 5001, 0, 0, 0), + (119, 6001, 0, 0, 0), + (119, 10010, 10, 0, 0), + (119, 10010, 11, 0, 0), + (119, 11004, 10, 0, 0), + (119, 11004, 11, 0, 0), + (119, 12008, 10, 0, 0), + (119, 12029, 11, 0, 0), + (119, 15001, 0, 0, 0), + (119, 20119, 0, 0, 0), + (119, 22009, 0, 0, 0), + (119, 31153, 0, 0, 0), + (119, 36001, 0, 0, 0), + (119, 37001, 0, 0, 0), + (119, 40024, 0, 0, 0), + (119, 100002, 10, 0, 0), + (119, 100002, 11, 0, 0), + (119, 110032, 10, 1, 1), + (119, 110032, 11, 1, 1), + (119, 130033, 0, 0, 0), + (119, 140016, 0, 0, 0), + (119, 160006, 0, 0, 0), + (119, 180014, 0, 0, 0), + (119, 190016, 0, 0, 0), + (119, 200002, 0, 0, 0), + (119, 230001, 0, 0, 0), + (119, 240023, 0, 0, 0), + (119, 250026, 0, 0, 0), + (119, 280016, 0, 0, 0), + (119, 290004, 0, 0, 0), + (119, 300001, 0, 0, 0), + (119, 320020, 0, 0, 0), + (119, 330053, 0, 0, 0), + (119, 340002, 0, 0, 0), + (119, 1000070, 0, 0, 0), + (119, 1100001, 0, 0, 0), + (119, 1200034, 0, 0, 0), + (120, 1001, 0, 1, 1), + (120, 2001, 0, 1, 1), + (120, 4001, 0, 0, 0), + (120, 5001, 0, 0, 0), + (120, 6001, 0, 0, 0), + (120, 10002, 10, 0, 0), + (120, 10010, 11, 0, 0), + (120, 11004, 10, 0, 0), + (120, 11004, 11, 0, 0), + (120, 12006, 10, 0, 0), + (120, 12027, 11, 0, 0), + (120, 13009, 10, 0, 0), + (120, 15001, 0, 0, 0), + (120, 20120, 0, 0, 0), + (120, 22009, 0, 0, 0), + (120, 31153, 0, 0, 0), + (120, 36001, 0, 0, 0), + (120, 37001, 0, 0, 0), + (120, 40025, 0, 0, 0), + (120, 100003, 10, 0, 0), + (120, 100003, 11, 0, 0), + (120, 110032, 10, 1, 1), + (120, 110032, 11, 1, 1), + (120, 130032, 0, 0, 0), + (120, 140016, 0, 0, 0), + (120, 160009, 0, 0, 0), + (120, 180014, 0, 0, 0), + (120, 190016, 0, 0, 0), + (120, 200002, 0, 0, 0), + (120, 230001, 0, 0, 0), + (120, 240023, 0, 0, 0), + (120, 250026, 0, 0, 0), + (120, 280016, 0, 0, 0), + (120, 290004, 0, 0, 0), + (120, 300001, 0, 0, 0), + (120, 320020, 0, 0, 0), + (120, 330053, 0, 0, 0), + (120, 340002, 0, 0, 0), + (120, 1000121, 0, 0, 0), + (120, 1100001, 0, 0, 0), + (120, 1200034, 0, 0, 0), + (121, 1001, 0, 1, 1), + (121, 2001, 0, 1, 1), + (121, 4001, 0, 0, 0), + (121, 5001, 0, 0, 0), + (121, 6001, 0, 0, 0), + (121, 10002, 10, 0, 0), + (121, 10010, 11, 0, 0), + (121, 11004, 10, 0, 0), + (121, 11004, 11, 0, 0), + (121, 12009, 10, 0, 0), + (121, 12021, 11, 0, 0), + (121, 13009, 10, 0, 0), + (121, 15001, 0, 0, 0), + (121, 20121, 0, 0, 0), + (121, 22009, 0, 0, 0), + (121, 31153, 0, 0, 0), + (121, 36001, 0, 0, 0), + (121, 37001, 0, 0, 0), + (121, 40030, 0, 0, 0), + (121, 100002, 10, 0, 0), + (121, 100002, 11, 0, 0), + (121, 110027, 10, 1, 1), + (121, 110027, 11, 1, 1), + (121, 130023, 0, 0, 0), + (121, 140016, 0, 0, 0), + (121, 160008, 0, 0, 0), + (121, 180003, 0, 0, 0), + (121, 190016, 0, 0, 0), + (121, 200002, 0, 0, 0), + (121, 230001, 0, 0, 0), + (121, 240023, 0, 0, 0), + (121, 250026, 0, 0, 0), + (121, 280016, 0, 0, 0), + (121, 290004, 0, 0, 0), + (121, 300001, 0, 0, 0), + (121, 320020, 0, 0, 0), + (121, 330020, 0, 0, 0), + (121, 340002, 0, 0, 0), + (121, 1000074, 0, 0, 0), + (121, 1100001, 0, 0, 0), + (121, 1200034, 0, 0, 0), + (122, 1001, 0, 1, 1), + (122, 2001, 0, 1, 1), + (122, 4001, 0, 0, 0), + (122, 5001, 0, 0, 0), + (122, 6001, 0, 0, 0), + (122, 10010, 10, 0, 0), + (122, 10010, 11, 0, 0), + (122, 11004, 10, 0, 0), + (122, 11004, 11, 0, 0), + (122, 12007, 11, 0, 0), + (122, 12010, 10, 0, 0), + (122, 13009, 10, 0, 0), + (122, 15001, 0, 0, 0), + (122, 20122, 0, 0, 0), + (122, 22009, 0, 0, 0), + (122, 31153, 0, 0, 0), + (122, 36001, 0, 0, 0), + (122, 37001, 0, 0, 0), + (122, 40028, 0, 0, 0), + (122, 100003, 10, 0, 0), + (122, 100003, 11, 0, 0), + (122, 110034, 10, 1, 1), + (122, 110034, 11, 1, 1), + (122, 130023, 0, 0, 0), + (122, 140016, 0, 0, 0), + (122, 160008, 0, 0, 0), + (122, 180003, 0, 0, 0), + (122, 190016, 0, 0, 0), + (122, 200002, 0, 0, 0), + (122, 230001, 0, 0, 0), + (122, 240023, 0, 0, 0), + (122, 250026, 0, 0, 0), + (122, 280016, 0, 0, 0), + (122, 290004, 0, 0, 0), + (122, 300001, 0, 0, 0), + (122, 320020, 0, 0, 0), + (122, 330020, 0, 0, 0), + (122, 340002, 0, 0, 0), + (122, 1000074, 0, 0, 0), + (122, 1100001, 0, 0, 0), + (122, 1200034, 0, 0, 0), + (123, 1001, 0, 1, 1), + (123, 2001, 0, 1, 1), + (123, 4001, 0, 0, 0), + (123, 5001, 0, 0, 0), + (123, 6001, 0, 0, 0), + (123, 10002, 10, 0, 0), + (123, 10010, 11, 0, 0), + (123, 11004, 10, 0, 0), + (123, 11004, 11, 0, 0), + (123, 12020, 10, 0, 0), + (123, 12029, 11, 0, 0), + (123, 13009, 10, 0, 0), + (123, 15001, 0, 0, 0), + (123, 20123, 0, 0, 0), + (123, 22009, 0, 0, 0), + (123, 31153, 0, 0, 0), + (123, 36001, 0, 0, 0), + (123, 37001, 0, 0, 0), + (123, 40029, 0, 0, 0), + (123, 100002, 10, 0, 0), + (123, 100002, 11, 0, 0), + (123, 110034, 10, 1, 1), + (123, 110034, 11, 1, 1), + (123, 130023, 0, 0, 0), + (123, 140016, 0, 0, 0), + (123, 160008, 0, 0, 0), + (123, 180003, 0, 0, 0), + (123, 190016, 0, 0, 0), + (123, 200002, 0, 0, 0), + (123, 230001, 0, 0, 0), + (123, 240023, 0, 0, 0), + (123, 250026, 0, 0, 0), + (123, 280016, 0, 0, 0), + (123, 290004, 0, 0, 0), + (123, 300001, 0, 0, 0), + (123, 320020, 0, 0, 0), + (123, 330020, 0, 0, 0), + (123, 340002, 0, 0, 0), + (123, 1000074, 0, 0, 0), + (123, 1100001, 0, 0, 0), + (123, 1200034, 0, 0, 0), + (124, 1001, 0, 1, 1), + (124, 2001, 0, 1, 1), + (124, 4001, 0, 0, 0), + (124, 5001, 0, 0, 0), + (124, 6001, 0, 0, 0), + (124, 10012, 10, 0, 0), + (124, 10012, 11, 0, 0), + (124, 11004, 10, 0, 0), + (124, 11004, 11, 0, 0), + (124, 12011, 10, 0, 0), + (124, 12027, 11, 0, 0), + (124, 15001, 0, 0, 0), + (124, 20124, 0, 0, 0), + (124, 22005, 0, 0, 0), + (124, 31153, 0, 0, 0), + (124, 36001, 0, 0, 0), + (124, 37001, 0, 0, 0), + (124, 40014, 0, 0, 0), + (124, 100002, 10, 0, 0), + (124, 100002, 11, 0, 0), + (124, 110047, 10, 1, 1), + (124, 110047, 11, 1, 1), + (124, 130023, 0, 0, 0), + (124, 140008, 0, 0, 0), + (124, 160010, 0, 0, 0), + (124, 180055, 0, 0, 0), + (124, 190071, 0, 0, 0), + (124, 200056, 0, 0, 0), + (124, 230001, 0, 0, 0), + (124, 240001, 0, 0, 0), + (124, 250021, 0, 0, 0), + (124, 280044, 0, 0, 0), + (124, 290003, 0, 0, 0), + (124, 300001, 0, 0, 0), + (124, 320092, 0, 0, 0), + (124, 330052, 0, 0, 0), + (124, 340002, 0, 0, 0), + (124, 1000154, 0, 0, 0), + (124, 1100112, 0, 0, 0), + (124, 1200042, 0, 0, 0), + (125, 1001, 0, 1, 1), + (125, 2001, 0, 1, 1), + (125, 4001, 0, 0, 0), + (125, 5001, 0, 0, 0), + (125, 6001, 0, 0, 0), + (125, 10003, 10, 0, 0), + (125, 10011, 11, 0, 0), + (125, 11004, 10, 0, 0), + (125, 11004, 11, 0, 0), + (125, 12010, 11, 0, 0), + (125, 12011, 10, 0, 0), + (125, 15001, 0, 0, 0), + (125, 20125, 0, 0, 0), + (125, 22009, 0, 0, 0), + (125, 31153, 0, 0, 0), + (125, 36001, 0, 0, 0), + (125, 37001, 0, 0, 0), + (125, 40020, 0, 0, 0), + (125, 100103, 10, 0, 0), + (125, 100103, 11, 0, 0), + (125, 110042, 10, 1, 1), + (125, 110042, 11, 1, 1), + (125, 130022, 0, 0, 0), + (125, 140002, 0, 0, 0), + (125, 160013, 0, 0, 0), + (125, 180012, 0, 0, 0), + (125, 190005, 0, 0, 0), + (125, 200018, 0, 0, 0), + (125, 230001, 0, 0, 0), + (125, 240001, 0, 0, 0), + (125, 250002, 0, 0, 0), + (125, 280015, 0, 0, 0), + (125, 290004, 0, 0, 0), + (125, 300001, 0, 0, 0), + (125, 320021, 0, 0, 0), + (125, 330008, 0, 0, 0), + (125, 340002, 0, 0, 0), + (125, 1000068, 0, 0, 0), + (125, 1100013, 0, 0, 0), + (125, 1200014, 0, 0, 0), + (126, 1001, 0, 1, 1), + (126, 2001, 0, 1, 1), + (126, 4001, 0, 0, 0), + (126, 5001, 0, 0, 0), + (126, 6001, 0, 0, 0), + (126, 10002, 10, 0, 0), + (126, 10010, 11, 0, 0), + (126, 11004, 10, 0, 0), + (126, 11004, 11, 0, 0), + (126, 12010, 10, 0, 0), + (126, 12021, 11, 0, 0), + (126, 13011, 11, 0, 0), + (126, 13012, 10, 0, 0), + (126, 15001, 0, 0, 0), + (126, 20126, 0, 0, 0), + (126, 22009, 0, 0, 0), + (126, 31153, 0, 0, 0), + (126, 36001, 0, 0, 0), + (126, 37001, 0, 0, 0), + (126, 40026, 0, 0, 0), + (126, 100002, 10, 0, 0), + (126, 100002, 11, 0, 0), + (126, 110104, 10, 1, 1), + (126, 110109, 11, 1, 1), + (126, 130045, 0, 0, 0), + (126, 140009, 0, 0, 0), + (126, 160037, 0, 0, 0), + (126, 180020, 0, 0, 0), + (126, 190022, 0, 0, 0), + (126, 200020, 0, 0, 0), + (126, 230001, 0, 0, 0), + (126, 240001, 0, 0, 0), + (126, 250002, 0, 0, 0), + (126, 280027, 0, 0, 0), + (126, 290003, 0, 0, 0), + (126, 300001, 0, 0, 0), + (126, 320024, 0, 0, 0), + (126, 330056, 0, 0, 0), + (126, 340002, 0, 0, 0), + (126, 1000021, 0, 0, 0), + (126, 1100098, 0, 0, 0), + (126, 1200019, 0, 0, 0), + (127, 1001, 0, 1, 1), + (127, 2001, 0, 1, 1), + (127, 4001, 0, 0, 0), + (127, 5001, 0, 0, 0), + (127, 6001, 0, 0, 0), + (127, 10009, 11, 0, 0), + (127, 10010, 10, 0, 0), + (127, 11004, 10, 0, 0), + (127, 11004, 11, 0, 0), + (127, 12008, 11, 0, 0), + (127, 12009, 10, 0, 0), + (127, 15001, 0, 0, 0), + (127, 20127, 0, 0, 0), + (127, 22009, 0, 0, 0), + (127, 31153, 0, 0, 0), + (127, 36001, 0, 0, 0), + (127, 37001, 0, 0, 0), + (127, 40015, 0, 0, 0), + (127, 100002, 10, 0, 0), + (127, 100002, 11, 0, 0), + (127, 110048, 10, 1, 1), + (127, 110048, 11, 1, 1), + (127, 130057, 0, 0, 0), + (127, 140018, 0, 0, 0), + (127, 160001, 0, 0, 0), + (127, 180049, 0, 0, 0), + (127, 190013, 0, 0, 0), + (127, 200058, 0, 0, 0), + (127, 230021, 0, 0, 0), + (127, 240032, 0, 0, 0), + (127, 250022, 0, 0, 0), + (127, 280045, 0, 0, 0), + (127, 290003, 0, 0, 0), + (127, 300001, 0, 0, 0), + (127, 320033, 0, 0, 0), + (127, 330053, 0, 0, 0), + (127, 340002, 0, 0, 0), + (127, 1000162, 0, 0, 0), + (127, 1100113, 0, 0, 0), + (127, 1200013, 0, 0, 0), + (128, 1001, 0, 0, 0), + (128, 2001, 0, 1, 1), + (128, 4001, 0, 0, 0), + (128, 5001, 0, 0, 0), + (128, 6001, 0, 0, 0), + (128, 10010, 10, 0, 0), + (128, 10010, 11, 0, 0), + (128, 11004, 10, 0, 0), + (128, 11004, 11, 0, 0), + (128, 12007, 10, 0, 0), + (128, 12029, 11, 0, 0), + (128, 13011, 10, 0, 0), + (128, 15001, 0, 0, 0), + (128, 20128, 0, 0, 0), + (128, 22009, 0, 0, 0), + (128, 31153, 0, 0, 0), + (128, 36001, 0, 0, 0), + (128, 37001, 0, 0, 0), + (128, 40023, 0, 0, 0), + (128, 100002, 10, 0, 0), + (128, 100002, 11, 0, 0), + (128, 110104, 10, 1, 1), + (128, 110109, 11, 1, 1), + (128, 130004, 0, 0, 0), + (128, 140009, 0, 0, 0), + (128, 160039, 0, 0, 0), + (128, 180023, 0, 0, 0), + (128, 190006, 0, 0, 0), + (128, 200023, 0, 0, 0), + (128, 230001, 0, 0, 0), + (128, 240005, 0, 0, 0), + (128, 250002, 0, 0, 0), + (128, 280023, 0, 0, 0), + (128, 290004, 0, 0, 0), + (128, 300001, 0, 0, 0), + (128, 320027, 0, 0, 0), + (128, 330043, 0, 0, 0), + (128, 340002, 0, 0, 0), + (128, 1000018, 0, 0, 0), + (128, 1100020, 0, 0, 0), + (128, 1200035, 0, 0, 0), + (129, 1001, 0, 1, 1), + (129, 2001, 0, 1, 1), + (129, 4001, 0, 0, 0), + (129, 5001, 0, 0, 0), + (129, 6001, 0, 0, 0), + (129, 10010, 10, 0, 0), + (129, 10010, 11, 0, 0), + (129, 11004, 10, 0, 0), + (129, 11004, 11, 0, 0), + (129, 12008, 10, 0, 0), + (129, 12021, 11, 0, 0), + (129, 13011, 10, 0, 0), + (129, 15001, 0, 0, 0), + (129, 20129, 0, 0, 0), + (129, 22009, 0, 0, 0), + (129, 25006, 0, 0, 0), + (129, 31153, 0, 0, 0), + (129, 36001, 0, 0, 0), + (129, 37001, 0, 0, 0), + (129, 40049, 0, 0, 0), + (129, 100002, 10, 0, 0), + (129, 100002, 11, 0, 0), + (129, 110033, 10, 1, 1), + (129, 110033, 11, 1, 1), + (129, 130004, 0, 0, 0), + (129, 140009, 0, 0, 0), + (129, 160040, 0, 0, 0), + (129, 180023, 0, 0, 0), + (129, 190006, 0, 0, 0), + (129, 200023, 0, 0, 0), + (129, 230001, 0, 0, 0), + (129, 240006, 0, 0, 0), + (129, 250002, 0, 0, 0), + (129, 280028, 0, 0, 0), + (129, 290003, 0, 0, 0), + (129, 300001, 0, 0, 0), + (129, 320027, 0, 0, 0), + (129, 330043, 0, 0, 0), + (129, 340002, 0, 0, 0), + (129, 1000051, 0, 0, 0), + (129, 1100034, 0, 0, 0), + (129, 1200035, 0, 0, 0), + (130, 1001, 0, 1, 1), + (130, 2001, 0, 1, 1), + (130, 4001, 0, 0, 0), + (130, 5001, 0, 0, 0), + (130, 6001, 0, 0, 0), + (130, 10002, 10, 0, 0), + (130, 10010, 11, 0, 0), + (130, 11004, 10, 0, 0), + (130, 11004, 11, 0, 0), + (130, 12009, 10, 0, 0), + (130, 12029, 11, 0, 0), + (130, 13009, 11, 0, 0), + (130, 13011, 10, 0, 0), + (130, 15001, 0, 0, 0), + (130, 20130, 0, 0, 0), + (130, 22006, 0, 0, 0), + (130, 31153, 0, 0, 0), + (130, 36001, 0, 0, 0), + (130, 37001, 0, 0, 0), + (130, 40055, 0, 0, 0), + (130, 100002, 10, 0, 0), + (130, 100002, 11, 0, 0), + (130, 110040, 10, 1, 1), + (130, 110040, 11, 1, 1), + (130, 130004, 0, 0, 0), + (130, 140022, 0, 0, 0), + (130, 160040, 0, 0, 0), + (130, 180023, 0, 0, 0), + (130, 190006, 0, 0, 0), + (130, 200023, 0, 0, 0), + (130, 230003, 0, 0, 0), + (130, 240005, 0, 0, 0), + (130, 250002, 0, 0, 0), + (130, 280023, 0, 0, 0), + (130, 290004, 0, 0, 0), + (130, 300001, 0, 0, 0), + (130, 320027, 0, 0, 0), + (130, 330043, 0, 0, 0), + (130, 340003, 0, 0, 0), + (130, 1000146, 0, 0, 0), + (130, 1100020, 0, 0, 0), + (130, 1200037, 0, 0, 0), + (131, 1001, 0, 1, 1), + (131, 2001, 0, 1, 1), + (131, 4001, 0, 0, 0), + (131, 5001, 0, 0, 0), + (131, 6001, 0, 0, 0), + (131, 10002, 10, 0, 0), + (131, 10010, 11, 0, 0), + (131, 11004, 10, 0, 0), + (131, 11004, 11, 0, 0), + (131, 12006, 10, 0, 0), + (131, 12027, 11, 0, 0), + (131, 13012, 10, 0, 0), + (131, 15001, 0, 0, 0), + (131, 20131, 0, 0, 0), + (131, 22002, 0, 0, 0), + (131, 31153, 0, 0, 0), + (131, 36001, 0, 0, 0), + (131, 37001, 0, 0, 0), + (131, 40034, 0, 0, 0), + (131, 100132, 10, 0, 0), + (131, 100132, 11, 0, 0), + (131, 110027, 10, 1, 1), + (131, 110027, 11, 1, 1), + (131, 130048, 0, 0, 0), + (131, 140008, 0, 0, 0), + (131, 160048, 0, 0, 0), + (131, 180022, 0, 0, 0), + (131, 190068, 0, 0, 0), + (131, 200022, 0, 0, 0), + (131, 230001, 0, 0, 0), + (131, 240001, 0, 0, 0), + (131, 250003, 0, 0, 0), + (131, 280022, 0, 0, 0), + (131, 290003, 0, 0, 0), + (131, 300001, 0, 0, 0), + (131, 320026, 0, 0, 0), + (131, 330020, 0, 0, 0), + (131, 340002, 0, 0, 0), + (131, 1000007, 0, 0, 0), + (131, 1100019, 0, 0, 0), + (131, 1200021, 0, 0, 0), + (132, 1001, 0, 1, 1), + (132, 2001, 0, 1, 1), + (132, 4001, 0, 0, 0), + (132, 5001, 0, 0, 0), + (132, 6001, 0, 0, 0), + (132, 10002, 10, 0, 0), + (132, 10010, 11, 0, 0), + (132, 11004, 10, 0, 0), + (132, 11004, 11, 0, 0), + (132, 12006, 10, 0, 0), + (132, 12022, 11, 0, 0), + (132, 13012, 10, 0, 0), + (132, 15001, 0, 0, 0), + (132, 20132, 0, 0, 0), + (132, 22008, 0, 0, 0), + (132, 31153, 0, 0, 0), + (132, 36001, 0, 0, 0), + (132, 37001, 0, 0, 0), + (132, 40032, 0, 0, 0), + (132, 100132, 10, 0, 0), + (132, 100132, 11, 0, 0), + (132, 110033, 10, 1, 1), + (132, 110033, 11, 1, 1), + (132, 130044, 0, 0, 0), + (132, 140004, 0, 0, 0), + (132, 160054, 0, 0, 0), + (132, 180016, 0, 0, 0), + (132, 190018, 0, 0, 0), + (132, 200006, 0, 0, 0), + (132, 230001, 0, 0, 0), + (132, 240001, 0, 0, 0), + (132, 250027, 0, 0, 0), + (132, 280003, 0, 0, 0), + (132, 290003, 0, 0, 0), + (132, 300001, 0, 0, 0), + (132, 320003, 0, 0, 0), + (132, 330052, 0, 0, 0), + (132, 340002, 0, 0, 0), + (132, 1000119, 0, 0, 0), + (132, 1100002, 0, 0, 0), + (132, 1200002, 0, 0, 0), + (133, 1001, 0, 1, 1), + (133, 2001, 0, 1, 1), + (133, 4001, 0, 0, 0), + (133, 5001, 0, 0, 0), + (133, 6001, 0, 0, 0), + (133, 10002, 10, 0, 0), + (133, 10010, 11, 0, 0), + (133, 11004, 10, 0, 0), + (133, 11004, 11, 0, 0), + (133, 12006, 10, 0, 0), + (133, 12022, 11, 0, 0), + (133, 13012, 10, 0, 0), + (133, 15001, 0, 0, 0), + (133, 20133, 0, 0, 0), + (133, 22008, 0, 0, 0), + (133, 31153, 0, 0, 0), + (133, 36001, 0, 0, 0), + (133, 37001, 0, 0, 0), + (133, 40033, 0, 0, 0), + (133, 100132, 10, 0, 0), + (133, 100132, 11, 0, 0), + (133, 110104, 10, 1, 1), + (133, 110109, 11, 1, 1), + (133, 130048, 0, 0, 0), + (133, 140004, 0, 0, 0), + (133, 160073, 0, 0, 0), + (133, 180015, 0, 0, 0), + (133, 190017, 0, 0, 0), + (133, 200029, 0, 0, 0), + (133, 230001, 0, 0, 0), + (133, 240005, 0, 0, 0), + (133, 250002, 0, 0, 0), + (133, 280036, 0, 0, 0), + (133, 290004, 0, 0, 0), + (133, 300001, 0, 0, 0), + (133, 320004, 0, 0, 0), + (133, 330066, 0, 0, 0), + (133, 340002, 0, 0, 0), + (133, 1000120, 0, 0, 0), + (133, 1100044, 0, 0, 0), + (133, 1200015, 0, 0, 0), + (134, 1001, 0, 1, 1), + (134, 2001, 0, 1, 1), + (134, 4001, 0, 0, 0), + (134, 5001, 0, 0, 0), + (134, 6001, 0, 0, 0), + (134, 10011, 10, 0, 0), + (134, 10011, 11, 0, 0), + (134, 11004, 10, 0, 0), + (134, 11004, 11, 0, 0), + (134, 12006, 10, 0, 0), + (134, 12022, 11, 0, 0), + (134, 13012, 10, 0, 0), + (134, 15001, 0, 0, 0), + (134, 20134, 0, 0, 0), + (134, 22001, 0, 0, 0), + (134, 31153, 0, 0, 0), + (134, 36001, 0, 0, 0), + (134, 37001, 0, 0, 0), + (134, 40054, 0, 0, 0), + (134, 100128, 10, 0, 0), + (134, 100128, 11, 0, 0), + (134, 110084, 10, 1, 1), + (134, 110100, 11, 1, 1), + (134, 130044, 0, 0, 0), + (134, 140014, 0, 0, 0), + (134, 160057, 0, 0, 0), + (134, 180016, 0, 0, 0), + (134, 190018, 0, 0, 0), + (134, 200006, 0, 0, 0), + (134, 230003, 0, 0, 0), + (134, 240005, 0, 0, 0), + (134, 250002, 0, 0, 0), + (134, 280003, 0, 0, 0), + (134, 290004, 0, 0, 0), + (134, 300001, 0, 0, 0), + (134, 320052, 0, 0, 0), + (134, 330021, 0, 0, 0), + (134, 340002, 0, 0, 0), + (134, 1000012, 0, 0, 0), + (134, 1100048, 0, 0, 0), + (134, 1200002, 0, 0, 0), + (135, 1001, 0, 1, 1), + (135, 2001, 0, 1, 1), + (135, 4001, 0, 0, 0), + (135, 5001, 0, 0, 0), + (135, 6001, 0, 0, 0), + (135, 10009, 11, 0, 0), + (135, 10014, 10, 0, 0), + (135, 11004, 10, 0, 0), + (135, 11004, 11, 0, 0), + (135, 12006, 10, 0, 0), + (135, 12028, 11, 0, 0), + (135, 13011, 10, 0, 0), + (135, 15001, 0, 0, 0), + (135, 20135, 0, 0, 0), + (135, 22008, 0, 0, 0), + (135, 31153, 0, 0, 0), + (135, 36001, 0, 0, 0), + (135, 37001, 0, 0, 0), + (135, 40036, 0, 0, 0), + (135, 100128, 10, 0, 0), + (135, 100128, 11, 0, 0), + (135, 110030, 10, 1, 1), + (135, 110030, 11, 1, 1), + (135, 130044, 0, 0, 0), + (135, 140009, 0, 0, 0), + (135, 160054, 0, 0, 0), + (135, 180016, 0, 0, 0), + (135, 190018, 0, 0, 0), + (135, 200006, 0, 0, 0), + (135, 230001, 0, 0, 0), + (135, 240001, 0, 0, 0), + (135, 250027, 0, 0, 0), + (135, 280003, 0, 0, 0), + (135, 290003, 0, 0, 0), + (135, 300001, 0, 0, 0), + (135, 320003, 0, 0, 0), + (135, 330052, 0, 0, 0), + (135, 340002, 0, 0, 0), + (135, 1000119, 0, 0, 0), + (135, 1100002, 0, 0, 0), + (135, 1200002, 0, 0, 0), + (153, 1001, 0, 0, 0), + (153, 2001, 0, 1, 1), + (153, 4001, 0, 0, 0), + (153, 5001, 0, 0, 0), + (153, 6001, 0, 0, 0), + (153, 10010, 10, 0, 0), + (153, 10010, 11, 0, 0), + (153, 11004, 10, 0, 0), + (153, 11004, 11, 0, 0), + (153, 12006, 10, 0, 0), + (153, 12009, 11, 0, 0), + (153, 15001, 0, 0, 0), + (153, 20138, 0, 0, 0), + (153, 23003, 0, 0, 0), + (153, 34001, 10, 0, 0), + (153, 34001, 11, 0, 0), + (153, 35001, 0, 0, 0), + (153, 36001, 0, 0, 0), + (153, 37001, 0, 0, 0), + (153, 100002, 10, 0, 0), + (153, 100002, 11, 0, 0), + (153, 110001, 10, 1, 1), + (153, 110001, 11, 1, 1), + (153, 130026, 0, 0, 0), + (153, 140016, 0, 0, 0), + (153, 160021, 0, 0, 0), + (153, 180019, 0, 0, 0), + (153, 190021, 0, 0, 0), + (153, 200019, 0, 0, 0), + (153, 230001, 0, 0, 0), + (153, 240003, 0, 0, 0), + (153, 250001, 0, 0, 0), + (153, 280019, 0, 0, 0), + (153, 290003, 0, 0, 0), + (153, 300001, 0, 0, 0), + (153, 320023, 0, 0, 0), + (153, 330006, 0, 0, 0), + (153, 340001, 0, 0, 0), + (153, 1000020, 0, 0, 0), + (153, 1100016, 0, 0, 0), + (153, 1200018, 0, 0, 0), + (159, 1001, 0, 1, 1), + (159, 2001, 0, 1, 1), + (159, 4001, 0, 0, 0), + (159, 5001, 0, 0, 0), + (159, 6001, 0, 0, 0), + (159, 10001, 10, 0, 0), + (159, 10004, 11, 0, 0), + (159, 11004, 10, 0, 0), + (159, 11004, 11, 0, 0), + (159, 12009, 10, 0, 0), + (159, 12029, 11, 0, 0), + (159, 15001, 0, 0, 0), + (159, 20104, 0, 0, 0), + (159, 22014, 0, 0, 0), + (159, 31153, 0, 0, 0), + (159, 36001, 0, 0, 0), + (159, 37001, 0, 0, 0), + (159, 40006, 0, 0, 0), + (159, 100002, 10, 0, 0), + (159, 100002, 11, 0, 0), + (159, 110032, 10, 1, 1), + (159, 110032, 11, 1, 1), + (159, 130042, 0, 0, 0), + (159, 140016, 0, 0, 0), + (159, 160026, 0, 0, 0), + (159, 180018, 0, 0, 0), + (159, 190077, 0, 0, 0), + (159, 200042, 0, 0, 0), + (159, 230001, 0, 0, 0), + (159, 240001, 0, 0, 0), + (159, 250030, 0, 0, 0), + (159, 280030, 0, 0, 0), + (159, 290002, 0, 0, 0), + (159, 300001, 0, 0, 0), + (159, 320040, 0, 0, 0), + (159, 330035, 0, 0, 0), + (159, 340002, 0, 0, 0), + (159, 1000001, 0, 0, 0), + (159, 1100119, 0, 0, 0), + (159, 1200048, 0, 0, 0), + (171, 1001, 0, 1, 1), + (171, 2001, 0, 1, 1), + (171, 4001, 0, 0, 0), + (171, 5001, 0, 0, 0), + (171, 6001, 0, 0, 0), + (171, 10003, 10, 0, 0), + (171, 10010, 11, 0, 0), + (171, 11004, 10, 0, 0), + (171, 11004, 11, 0, 0), + (171, 12009, 10, 0, 0), + (171, 12029, 11, 0, 0), + (171, 15001, 0, 0, 0), + (171, 20111, 0, 0, 0), + (171, 22014, 0, 0, 0), + (171, 31153, 0, 0, 0), + (171, 36001, 0, 0, 0), + (171, 37001, 0, 0, 0), + (171, 40062, 0, 0, 0), + (171, 100002, 10, 0, 0), + (171, 100002, 11, 0, 0), + (171, 110044, 10, 0, 0), + (171, 110044, 11, 0, 0), + (171, 130039, 0, 0, 0), + (171, 140019, 0, 0, 0), + (171, 160034, 0, 0, 0), + (171, 180059, 0, 0, 0), + (171, 190029, 0, 0, 0), + (171, 200012, 0, 0, 0), + (171, 230005, 0, 0, 0), + (171, 240002, 0, 0, 0), + (171, 250005, 0, 0, 0), + (171, 280004, 0, 0, 0), + (171, 290007, 0, 0, 0), + (171, 300011, 0, 0, 0), + (171, 320007, 0, 0, 0), + (171, 330033, 0, 0, 0), + (171, 340003, 0, 0, 0), + (171, 1000006, 0, 0, 0), + (171, 1100043, 0, 0, 0), + (171, 1200005, 0, 0, 0), + (173, 1001, 0, 1, 1), + (173, 2001, 0, 1, 1), + (173, 4001, 0, 0, 0), + (173, 5001, 0, 0, 0), + (173, 6001, 0, 0, 0), + (173, 10001, 10, 0, 0), + (173, 10004, 11, 0, 0), + (173, 11004, 10, 0, 0), + (173, 11004, 11, 0, 0), + (173, 12007, 10, 0, 0), + (173, 12009, 11, 0, 0), + (173, 15001, 0, 0, 0), + (173, 20146, 0, 0, 0), + (173, 36001, 0, 0, 0), + (173, 37001, 0, 0, 0), + (173, 40031, 0, 0, 0), + (173, 100002, 10, 0, 0), + (173, 100002, 11, 0, 0), + (173, 110040, 10, 1, 1), + (173, 110040, 11, 1, 1), + (173, 130048, 0, 0, 0), + (173, 140006, 0, 0, 0), + (173, 160012, 0, 0, 0), + (173, 180003, 0, 0, 0), + (173, 190016, 0, 0, 0), + (173, 200002, 0, 0, 0), + (173, 230001, 0, 0, 0), + (173, 240006, 0, 0, 0), + (173, 250002, 0, 0, 0), + (173, 280016, 0, 0, 0), + (173, 290003, 0, 0, 0), + (173, 300001, 0, 0, 0), + (173, 320020, 0, 0, 0), + (173, 330056, 0, 0, 0), + (173, 340002, 0, 0, 0), + (173, 1000074, 0, 0, 0), + (173, 1100001, 0, 0, 0), + (173, 1200034, 0, 0, 0), + (174, 1001, 0, 1, 1), + (174, 2001, 0, 1, 1), + (174, 4001, 0, 0, 0), + (174, 5001, 0, 0, 0), + (174, 6001, 0, 0, 0), + (174, 10010, 11, 0, 0), + (174, 10012, 10, 0, 0), + (174, 11004, 10, 0, 0), + (174, 11004, 11, 0, 0), + (174, 12007, 10, 0, 0), + (174, 12009, 11, 0, 0), + (174, 15001, 0, 0, 0), + (174, 20147, 0, 0, 0), + (174, 36001, 0, 0, 0), + (174, 37001, 0, 0, 0), + (174, 40001, 0, 0, 0), + (174, 100136, 10, 0, 0), + (174, 100136, 11, 0, 0), + (174, 110141, 10, 1, 1), + (174, 110141, 11, 1, 1), + (174, 130022, 0, 0, 0), + (174, 140015, 0, 0, 0), + (174, 160012, 0, 0, 0), + (174, 180001, 0, 0, 0), + (174, 190016, 0, 0, 0), + (174, 200002, 0, 0, 0), + (174, 230001, 0, 0, 0), + (174, 240006, 0, 0, 0), + (174, 250002, 0, 0, 0), + (174, 280016, 0, 0, 0), + (174, 290003, 0, 0, 0), + (174, 300001, 0, 0, 0), + (174, 320020, 0, 0, 0), + (174, 330056, 0, 0, 0), + (174, 340002, 0, 0, 0), + (174, 1000074, 0, 0, 0), + (174, 1100001, 0, 0, 0), + (174, 1200034, 0, 0, 0), + (175, 1001, 0, 1, 1), + (175, 2001, 0, 1, 1), + (175, 4001, 0, 0, 0), + (175, 5001, 0, 0, 0), + (175, 6001, 0, 0, 0), + (175, 10010, 11, 0, 0), + (175, 10012, 10, 0, 0), + (175, 11004, 10, 0, 0), + (175, 11004, 11, 0, 0), + (175, 12007, 10, 0, 0), + (175, 12009, 11, 0, 0), + (175, 15001, 0, 0, 0), + (175, 20148, 0, 0, 0), + (175, 36001, 0, 0, 0), + (175, 37001, 0, 0, 0), + (175, 40001, 0, 0, 0), + (175, 100136, 10, 0, 0), + (175, 100136, 11, 0, 0), + (175, 110141, 10, 1, 1), + (175, 110141, 11, 1, 1), + (175, 130022, 0, 0, 0), + (175, 140015, 0, 0, 0), + (175, 160017, 0, 0, 0), + (175, 180002, 0, 0, 0), + (175, 190015, 0, 0, 0), + (175, 200003, 0, 0, 0), + (175, 230003, 0, 0, 0), + (175, 240005, 0, 0, 0), + (175, 250002, 0, 0, 0), + (175, 280002, 0, 0, 0), + (175, 290004, 0, 0, 0), + (175, 300001, 0, 0, 0), + (175, 320002, 0, 0, 0), + (175, 330056, 0, 0, 0), + (175, 340002, 0, 0, 0), + (175, 1000147, 0, 0, 0), + (175, 1100014, 0, 0, 0), + (175, 1200001, 0, 0, 0), + (176, 1001, 0, 1, 1), + (176, 2001, 0, 1, 1), + (176, 4001, 0, 0, 0), + (176, 5001, 0, 0, 0), + (176, 6001, 0, 0, 0), + (176, 10001, 10, 0, 0), + (176, 10004, 11, 0, 0), + (176, 11004, 10, 0, 0), + (176, 11004, 11, 0, 0), + (176, 12007, 10, 0, 0), + (176, 12009, 11, 0, 0), + (176, 15001, 0, 0, 0), + (176, 20149, 0, 0, 0), + (176, 36001, 0, 0, 0), + (176, 37001, 0, 0, 0), + (176, 40031, 0, 0, 0), + (176, 100002, 10, 0, 0), + (176, 100002, 11, 0, 0), + (176, 110040, 10, 1, 1), + (176, 110040, 11, 1, 1), + (176, 130048, 0, 0, 0), + (176, 140006, 0, 0, 0), + (176, 160012, 0, 0, 0), + (176, 180003, 0, 0, 0), + (176, 190016, 0, 0, 0), + (176, 200002, 0, 0, 0), + (176, 230001, 0, 0, 0), + (176, 240006, 0, 0, 0), + (176, 250002, 0, 0, 0), + (176, 280016, 0, 0, 0), + (176, 290003, 0, 0, 0), + (176, 300001, 0, 0, 0), + (176, 320020, 0, 0, 0), + (176, 330056, 0, 0, 0), + (176, 340002, 0, 0, 0), + (176, 1000074, 0, 0, 0), + (176, 1100001, 0, 0, 0), + (176, 1200034, 0, 0, 0), + (177, 1001, 0, 1, 1), + (177, 2001, 0, 1, 1), + (177, 4001, 0, 0, 0), + (177, 5001, 0, 0, 0), + (177, 6001, 0, 0, 0), + (177, 10001, 10, 0, 0), + (177, 10004, 11, 0, 0), + (177, 11004, 10, 0, 0), + (177, 11004, 11, 0, 0), + (177, 12007, 10, 0, 0), + (177, 12009, 11, 0, 0), + (177, 15001, 0, 0, 0), + (177, 20150, 0, 0, 0), + (177, 36001, 0, 0, 0), + (177, 37001, 0, 0, 0), + (177, 40031, 0, 0, 0), + (177, 100002, 10, 0, 0), + (177, 100002, 11, 0, 0), + (177, 110040, 10, 1, 1), + (177, 110040, 11, 1, 1), + (177, 130048, 0, 0, 0), + (177, 140006, 0, 0, 0), + (177, 160025, 0, 0, 0), + (177, 180052, 0, 0, 0), + (177, 190020, 0, 0, 0), + (177, 200004, 0, 0, 0), + (177, 230001, 0, 0, 0), + (177, 240005, 0, 0, 0), + (177, 250001, 0, 0, 0), + (177, 280018, 0, 0, 0), + (177, 290003, 0, 0, 0), + (177, 300001, 0, 0, 0), + (177, 320022, 0, 0, 0), + (177, 330035, 0, 0, 0), + (177, 340001, 0, 0, 0), + (177, 1000136, 0, 0, 0), + (177, 1100101, 0, 0, 0), + (177, 1200038, 0, 0, 0), + (178, 1001, 0, 1, 1), + (178, 2001, 0, 1, 1), + (178, 4001, 0, 0, 0), + (178, 5001, 0, 0, 0), + (178, 6001, 0, 0, 0), + (178, 10002, 10, 0, 0), + (178, 10010, 11, 0, 0), + (178, 11004, 10, 0, 0), + (178, 11004, 11, 0, 0), + (178, 12007, 10, 0, 0), + (178, 12009, 11, 0, 0), + (178, 15001, 0, 0, 0), + (178, 20151, 0, 0, 0), + (178, 36001, 0, 0, 0), + (178, 37001, 0, 0, 0), + (178, 40031, 0, 0, 0), + (178, 100002, 10, 0, 0), + (178, 100002, 11, 0, 0), + (178, 110040, 10, 1, 1), + (178, 110040, 11, 1, 1), + (178, 130048, 0, 0, 0), + (178, 140006, 0, 0, 0), + (178, 160028, 0, 0, 0), + (178, 180018, 0, 0, 0), + (178, 190077, 0, 0, 0), + (178, 200042, 0, 0, 0), + (178, 230001, 0, 0, 0), + (178, 240001, 0, 0, 0), + (178, 250001, 0, 0, 0), + (178, 280030, 0, 0, 0), + (178, 290003, 0, 0, 0), + (178, 300001, 0, 0, 0), + (178, 320040, 0, 0, 0), + (178, 330035, 0, 0, 0), + (178, 340002, 0, 0, 0), + (178, 1000099, 0, 0, 0), + (178, 1100119, 0, 0, 0), + (178, 1200048, 0, 0, 0), + (179, 1001, 0, 1, 1), + (179, 2001, 0, 1, 1), + (179, 4001, 0, 0, 0), + (179, 5001, 0, 0, 0), + (179, 6001, 0, 0, 0), + (179, 10001, 10, 0, 0), + (179, 10004, 11, 0, 0), + (179, 11004, 10, 0, 0), + (179, 11004, 11, 0, 0), + (179, 12007, 10, 0, 0), + (179, 12009, 11, 0, 0), + (179, 15001, 0, 0, 0), + (179, 20152, 0, 0, 0), + (179, 36001, 0, 0, 0), + (179, 37001, 0, 0, 0), + (179, 40031, 0, 0, 0), + (179, 100002, 10, 0, 0), + (179, 100002, 11, 0, 0), + (179, 110040, 10, 1, 1), + (179, 110040, 11, 1, 1), + (179, 130048, 0, 0, 0), + (179, 140006, 0, 0, 0), + (179, 160012, 0, 0, 0), + (179, 180003, 0, 0, 0), + (179, 190016, 0, 0, 0), + (179, 200002, 0, 0, 0), + (179, 230001, 0, 0, 0), + (179, 240006, 0, 0, 0), + (179, 250002, 0, 0, 0), + (179, 280016, 0, 0, 0), + (179, 290003, 0, 0, 0), + (179, 300001, 0, 0, 0), + (179, 320020, 0, 0, 0), + (179, 330056, 0, 0, 0), + (179, 340002, 0, 0, 0), + (179, 1000074, 0, 0, 0), + (179, 1100001, 0, 0, 0), + (179, 1200034, 0, 0, 0), + (180, 1001, 0, 1, 1), + (180, 2001, 0, 1, 1), + (180, 4001, 0, 0, 0), + (180, 5001, 0, 0, 0), + (180, 6001, 0, 0, 0), + (180, 10001, 10, 0, 0), + (180, 10004, 11, 0, 0), + (180, 11004, 10, 0, 0), + (180, 11004, 11, 0, 0), + (180, 12007, 10, 0, 0), + (180, 12009, 11, 0, 0), + (180, 15001, 0, 0, 0), + (180, 20153, 0, 0, 0), + (180, 36001, 0, 0, 0), + (180, 37001, 0, 0, 0), + (180, 40031, 0, 0, 0), + (180, 100002, 10, 0, 0), + (180, 100002, 11, 0, 0), + (180, 110040, 10, 1, 1), + (180, 110040, 11, 1, 1), + (180, 130048, 0, 0, 0), + (180, 140006, 0, 0, 0), + (180, 160042, 0, 0, 0), + (180, 180028, 0, 0, 0), + (180, 190025, 0, 0, 0), + (180, 200027, 0, 0, 0), + (180, 230003, 0, 0, 0), + (180, 240005, 0, 0, 0), + (180, 250002, 0, 0, 0), + (180, 280029, 0, 0, 0), + (180, 290003, 0, 0, 0), + (180, 300001, 0, 0, 0), + (180, 320027, 0, 0, 0), + (180, 330018, 0, 0, 0), + (180, 340002, 0, 0, 0), + (180, 1000092, 0, 0, 0), + (180, 1100037, 0, 0, 0), + (180, 1200035, 0, 0, 0), + (184, 1001, 0, 1, 1), + (184, 2001, 0, 1, 1), + (184, 4001, 0, 0, 0), + (184, 5001, 0, 0, 0), + (184, 6001, 0, 0, 0), + (184, 10011, 10, 0, 0), + (184, 10011, 11, 0, 0), + (184, 11004, 10, 0, 0), + (184, 11004, 11, 0, 0), + (184, 12006, 10, 0, 0), + (184, 12022, 11, 0, 0), + (184, 15001, 0, 0, 0), + (184, 20157, 0, 0, 0), + (184, 22008, 0, 0, 0), + (184, 31153, 0, 0, 0), + (184, 36001, 0, 0, 0), + (184, 37001, 0, 0, 0), + (184, 40033, 0, 0, 0), + (184, 100132, 10, 0, 0), + (184, 100132, 11, 0, 0), + (184, 110045, 10, 1, 1), + (184, 110045, 11, 1, 1), + (184, 130001, 0, 0, 0), + (184, 140020, 0, 0, 0), + (184, 160055, 0, 0, 0), + (184, 180036, 0, 0, 0), + (184, 190017, 0, 0, 0), + (184, 200029, 0, 0, 0), + (184, 230001, 0, 0, 0), + (184, 240005, 0, 0, 0), + (184, 250002, 0, 0, 0), + (184, 280034, 0, 0, 0), + (184, 290004, 0, 0, 0), + (184, 300001, 0, 0, 0), + (184, 320089, 0, 0, 0), + (184, 330034, 0, 0, 0), + (184, 340002, 0, 0, 0), + (184, 1000113, 0, 0, 0), + (184, 1100044, 0, 0, 0), + (184, 1200015, 0, 0, 0), + (190, 1001, 0, 1, 1), + (190, 2001, 0, 1, 1), + (190, 4001, 0, 0, 0), + (190, 5001, 0, 0, 0), + (190, 6001, 0, 0, 0), + (190, 10007, 10, 0, 0), + (190, 10007, 11, 0, 0), + (190, 11004, 10, 0, 0), + (190, 11004, 11, 0, 0), + (190, 12006, 10, 0, 0), + (190, 12022, 11, 0, 0), + (190, 15001, 0, 0, 0), + (190, 20131, 0, 0, 0), + (190, 22008, 0, 0, 0), + (190, 31153, 0, 0, 0), + (190, 36001, 0, 0, 0), + (190, 37001, 0, 0, 0), + (190, 40034, 0, 0, 0), + (190, 100132, 10, 0, 0), + (190, 100132, 11, 0, 0), + (190, 110104, 10, 1, 1), + (190, 110109, 11, 1, 1), + (190, 130048, 0, 0, 0), + (190, 140007, 0, 0, 0), + (190, 160050, 0, 0, 0), + (190, 180053, 0, 0, 0), + (190, 190024, 0, 0, 0), + (190, 200007, 0, 0, 0), + (190, 230003, 0, 0, 0), + (190, 240005, 0, 0, 0), + (190, 250003, 0, 0, 0), + (190, 280010, 0, 0, 0), + (190, 290003, 0, 0, 0), + (190, 300001, 0, 0, 0), + (190, 320053, 0, 0, 0), + (190, 330043, 0, 0, 0), + (190, 340002, 0, 0, 0), + (190, 1000007, 0, 0, 0), + (190, 1100019, 0, 0, 0), + (190, 1200021, 0, 0, 0), + (208, 1001, 0, 1, 1), + (208, 2001, 0, 1, 1), + (208, 4001, 0, 0, 0), + (208, 5001, 0, 0, 0), + (208, 6001, 0, 0, 0), + (208, 10009, 11, 0, 0), + (208, 10010, 10, 0, 0), + (208, 11004, 10, 0, 0), + (208, 11004, 11, 0, 0), + (208, 12009, 11, 0, 0), + (208, 12010, 10, 0, 0), + (208, 15001, 0, 0, 0), + (208, 20127, 0, 0, 0), + (208, 22009, 0, 0, 0), + (208, 31153, 0, 0, 0), + (208, 36001, 0, 0, 0), + (208, 37001, 0, 0, 0), + (208, 40015, 0, 0, 0), + (208, 100002, 10, 0, 0), + (208, 100002, 11, 0, 0), + (208, 110044, 10, 1, 1), + (208, 110044, 11, 1, 1), + (208, 130049, 0, 0, 0), + (208, 140018, 0, 0, 0), + (208, 160001, 0, 0, 0), + (208, 180049, 0, 0, 0), + (208, 190013, 0, 0, 0), + (208, 200057, 0, 0, 0), + (208, 230001, 0, 0, 0), + (208, 240001, 0, 0, 0), + (208, 250022, 0, 0, 0), + (208, 280045, 0, 0, 0), + (208, 290003, 0, 0, 0), + (208, 300001, 0, 0, 0), + (208, 320033, 0, 0, 0), + (208, 330053, 0, 0, 0), + (208, 340002, 0, 0, 0), + (208, 1000162, 0, 0, 0), + (208, 1100113, 0, 0, 0), + (208, 1200013, 0, 0, 0), + (236, 1001, 0, 1, 1), + (236, 2001, 0, 1, 1), + (236, 4001, 0, 0, 0), + (236, 5001, 0, 0, 0), + (236, 6001, 0, 0, 0), + (236, 10010, 10, 0, 0), + (236, 10010, 11, 0, 0), + (236, 11004, 10, 0, 0), + (236, 11004, 11, 0, 0), + (236, 12007, 10, 0, 0), + (236, 12029, 11, 0, 0), + (236, 15001, 0, 0, 0), + (236, 20113, 0, 0, 0), + (236, 22010, 0, 0, 0), + (236, 31153, 0, 0, 0), + (236, 36001, 0, 0, 0), + (236, 37001, 0, 0, 0), + (236, 40016, 0, 0, 0), + (236, 100002, 10, 0, 0), + (236, 100002, 11, 0, 0), + (236, 110032, 10, 1, 1), + (236, 110032, 11, 1, 1), + (236, 130049, 0, 0, 0), + (236, 140009, 0, 0, 0), + (236, 160006, 0, 0, 0), + (236, 180014, 0, 0, 0), + (236, 190016, 0, 0, 0), + (236, 200002, 0, 0, 0), + (236, 230001, 0, 0, 0), + (236, 240001, 0, 0, 0), + (236, 250026, 0, 0, 0), + (236, 280024, 0, 0, 0), + (236, 290003, 0, 0, 0), + (236, 300001, 0, 0, 0), + (236, 320020, 0, 0, 0), + (236, 330052, 0, 0, 0), + (236, 340002, 0, 0, 0), + (236, 1000123, 0, 0, 0), + (236, 1100001, 0, 0, 0), + (236, 1200034, 0, 0, 0), + (320, 1001, 0, 0, 0), + (320, 2001, 0, 0, 0), + (320, 4001, 0, 0, 0), + (320, 5001, 0, 0, 0), + (320, 6001, 0, 0, 0), + (320, 10014, 11, 0, 0), + (320, 10021, 10, 0, 0), + (320, 11009, 10, 0, 0), + (320, 11009, 11, 0, 0), + (320, 12009, 11, 0, 0), + (320, 12010, 10, 0, 0), + (320, 13011, 10, 0, 0), + (320, 13012, 11, 0, 0), + (320, 15001, 0, 0, 0), + (320, 20207, 0, 0, 0), + (320, 22010, 0, 0, 0), + (320, 31152, 0, 0, 0), + (320, 35003, 10, 0, 0), + (320, 35003, 11, 0, 0), + (320, 36001, 0, 0, 0), + (320, 37001, 0, 0, 0), + (320, 40060, 0, 0, 0), + (320, 100002, 10, 0, 0), + (320, 100002, 11, 0, 0), + (320, 110026, 11, 0, 0), + (320, 110044, 10, 0, 0), + (320, 130035, 0, 0, 0), + (320, 140011, 0, 0, 0), + (320, 160032, 0, 0, 0), + (320, 180017, 0, 0, 0), + (320, 190019, 0, 0, 0), + (320, 200001, 0, 0, 0), + (320, 230003, 0, 0, 0), + (320, 240005, 0, 0, 0), + (320, 250008, 0, 0, 0), + (320, 280040, 0, 0, 0), + (320, 290002, 0, 0, 0), + (320, 300010, 0, 0, 0), + (320, 320006, 0, 0, 0), + (320, 330027, 0, 0, 0), + (320, 340002, 0, 0, 0), + (320, 1000005, 0, 0, 0), + (320, 1100040, 0, 0, 0), + (320, 1200029, 0, 0, 0), + (335, 1001, 0, 0, 0), + (335, 2001, 0, 0, 0), + (335, 4001, 0, 0, 0), + (335, 5001, 0, 0, 0), + (335, 6001, 0, 0, 0), + (335, 10002, 10, 0, 0), + (335, 10010, 11, 0, 0), + (335, 11006, 10, 0, 0), + (335, 11006, 11, 0, 0), + (335, 12009, 10, 0, 0), + (335, 12029, 11, 0, 0), + (335, 15001, 0, 0, 0), + (335, 20210, 0, 0, 0), + (335, 22014, 0, 0, 0), + (335, 31153, 0, 0, 0), + (335, 36001, 0, 0, 0), + (335, 37001, 0, 0, 0), + (335, 40013, 0, 0, 0), + (335, 100002, 10, 0, 0), + (335, 100002, 11, 0, 0), + (335, 110031, 10, 0, 0), + (335, 110031, 11, 0, 0), + (335, 130034, 0, 0, 0), + (335, 140011, 0, 0, 0), + (335, 160027, 0, 0, 0), + (335, 180030, 0, 0, 0), + (335, 190020, 0, 0, 0), + (335, 200004, 0, 0, 0), + (335, 230001, 0, 0, 0), + (335, 240001, 0, 0, 0), + (335, 250001, 0, 0, 0), + (335, 280018, 0, 0, 0), + (335, 290001, 0, 0, 0), + (335, 300001, 0, 0, 0), + (335, 320022, 0, 0, 0), + (335, 330003, 0, 0, 0), + (335, 340002, 0, 0, 0), + (335, 1000138, 0, 0, 0), + (335, 1100005, 0, 0, 0), + (335, 1200017, 0, 0, 0), + (336, 1001, 0, 0, 0), + (336, 2001, 0, 0, 0), + (336, 4001, 0, 0, 0), + (336, 5001, 0, 0, 0), + (336, 6001, 0, 0, 0), + (336, 10002, 10, 0, 0), + (336, 10010, 11, 0, 0), + (336, 11006, 10, 0, 0), + (336, 11006, 11, 0, 0), + (336, 12010, 10, 0, 0), + (336, 12022, 11, 0, 0), + (336, 15001, 0, 0, 0), + (336, 20211, 0, 0, 0), + (336, 22014, 0, 0, 0), + (336, 30001, 0, 0, 0), + (336, 31153, 0, 0, 0), + (336, 36001, 0, 0, 0), + (336, 37001, 0, 0, 0), + (336, 40039, 0, 0, 0), + (336, 100002, 10, 0, 0), + (336, 100002, 11, 0, 0), + (336, 110025, 10, 0, 0), + (336, 110025, 11, 0, 0), + (336, 130034, 0, 0, 0), + (336, 140011, 0, 0, 0), + (336, 160033, 0, 0, 0), + (336, 180051, 0, 0, 0), + (336, 190027, 0, 0, 0), + (336, 200028, 0, 0, 0), + (336, 230001, 0, 0, 0), + (336, 240001, 0, 0, 0), + (336, 250001, 0, 0, 0), + (336, 280008, 0, 0, 0), + (336, 290002, 0, 0, 0), + (336, 300002, 0, 0, 0), + (336, 320011, 0, 0, 0), + (336, 330033, 0, 0, 0), + (336, 340003, 0, 0, 0), + (336, 1000005, 0, 0, 0), + (336, 1100040, 0, 0, 0), + (336, 1200029, 0, 0, 0), + (337, 1001, 0, 0, 0), + (337, 2001, 0, 0, 0), + (337, 4001, 0, 0, 0), + (337, 5001, 0, 0, 0), + (337, 6001, 0, 0, 0), + (337, 10002, 10, 0, 0), + (337, 10010, 11, 0, 0), + (337, 11006, 10, 0, 0), + (337, 11006, 11, 0, 0), + (337, 12009, 10, 0, 0), + (337, 12029, 11, 0, 0), + (337, 15001, 0, 0, 0), + (337, 20212, 0, 0, 0), + (337, 22014, 0, 0, 0), + (337, 29001, 0, 0, 0), + (337, 30001, 0, 0, 0), + (337, 31153, 0, 0, 0), + (337, 36001, 0, 0, 0), + (337, 37001, 0, 0, 0), + (337, 40062, 0, 0, 0), + (337, 100002, 10, 0, 0), + (337, 100002, 11, 0, 0), + (337, 110025, 10, 0, 0), + (337, 110025, 11, 0, 0), + (337, 130034, 0, 0, 0), + (337, 140009, 0, 0, 0), + (337, 160019, 0, 0, 0), + (337, 180030, 0, 0, 0), + (337, 190020, 0, 0, 0), + (337, 200004, 0, 0, 0), + (337, 230001, 0, 0, 0), + (337, 240001, 0, 0, 0), + (337, 250001, 0, 0, 0), + (337, 280018, 0, 0, 0), + (337, 290002, 0, 0, 0), + (337, 300002, 0, 0, 0), + (337, 320022, 0, 0, 0), + (337, 330062, 0, 0, 0), + (337, 340002, 0, 0, 0), + (337, 1000137, 0, 0, 0), + (337, 1100101, 0, 0, 0), + (337, 1200017, 0, 0, 0), + (338, 1001, 0, 0, 0), + (338, 2001, 0, 0, 0), + (338, 4001, 0, 0, 0), + (338, 5001, 0, 0, 0), + (338, 6001, 0, 0, 0), + (338, 10002, 10, 0, 0), + (338, 10010, 11, 0, 0), + (338, 11007, 10, 0, 0), + (338, 11007, 11, 0, 0), + (338, 12010, 10, 0, 0), + (338, 12022, 11, 0, 0), + (338, 13008, 10, 0, 0), + (338, 15001, 0, 0, 0), + (338, 20213, 0, 0, 0), + (338, 22001, 0, 0, 0), + (338, 31153, 0, 0, 0), + (338, 36001, 0, 0, 0), + (338, 37001, 0, 0, 0), + (338, 40058, 0, 0, 0), + (338, 100128, 10, 0, 0), + (338, 100128, 11, 0, 0), + (338, 110026, 10, 0, 0), + (338, 110026, 11, 0, 0), + (338, 130044, 0, 0, 0), + (338, 140008, 0, 0, 0), + (338, 160078, 0, 0, 0), + (338, 180037, 0, 0, 0), + (338, 190069, 0, 0, 0), + (338, 200053, 0, 0, 0), + (338, 230004, 0, 0, 0), + (338, 240005, 0, 0, 0), + (338, 250006, 0, 0, 0), + (338, 280042, 0, 0, 0), + (338, 290007, 0, 0, 0), + (338, 300001, 0, 0, 0), + (338, 320065, 0, 0, 0), + (338, 330019, 0, 0, 0), + (338, 340003, 0, 0, 0), + (338, 1000011, 0, 0, 0), + (338, 1100045, 0, 0, 0), + (338, 1200041, 0, 0, 0), + (339, 1001, 0, 0, 0), + (339, 2001, 0, 0, 0), + (339, 4001, 0, 0, 0), + (339, 5001, 0, 0, 0), + (339, 6001, 0, 0, 0), + (339, 10002, 10, 0, 0), + (339, 10010, 11, 0, 0), + (339, 11006, 10, 0, 0), + (339, 11006, 11, 0, 0), + (339, 12010, 10, 0, 0), + (339, 12022, 11, 0, 0), + (339, 15001, 0, 0, 0), + (339, 20214, 0, 0, 0), + (339, 22001, 0, 0, 0), + (339, 31153, 0, 0, 0), + (339, 36001, 0, 0, 0), + (339, 37001, 0, 0, 0), + (339, 40054, 0, 0, 0), + (339, 100128, 10, 0, 0), + (339, 100128, 11, 0, 0), + (339, 110026, 10, 0, 0), + (339, 110026, 11, 0, 0), + (339, 130044, 0, 0, 0), + (339, 140011, 0, 0, 0), + (339, 160055, 0, 0, 0), + (339, 180015, 0, 0, 0), + (339, 190017, 0, 0, 0), + (339, 200029, 0, 0, 0), + (339, 230001, 0, 0, 0), + (339, 240001, 0, 0, 0), + (339, 250003, 0, 0, 0), + (339, 280034, 0, 0, 0), + (339, 290007, 0, 0, 0), + (339, 300001, 0, 0, 0), + (339, 320089, 0, 0, 0), + (339, 330034, 0, 0, 0), + (339, 340002, 0, 0, 0), + (339, 1000038, 0, 0, 0), + (339, 1100044, 0, 0, 0), + (339, 1200015, 0, 0, 0), + (340, 1001, 0, 0, 0), + (340, 2001, 0, 0, 0), + (340, 4001, 0, 0, 0), + (340, 5001, 0, 0, 0), + (340, 6001, 0, 0, 0), + (340, 10002, 10, 0, 0), + (340, 10010, 11, 0, 0), + (340, 11007, 10, 0, 0), + (340, 11007, 11, 0, 0), + (340, 12010, 10, 0, 0), + (340, 12022, 11, 0, 0), + (340, 13006, 11, 0, 0), + (340, 13008, 10, 0, 0), + (340, 15001, 0, 0, 0), + (340, 20215, 0, 0, 0), + (340, 22001, 0, 0, 0), + (340, 31153, 0, 0, 0), + (340, 36001, 0, 0, 0), + (340, 37001, 0, 0, 0), + (340, 40054, 0, 0, 0), + (340, 100128, 10, 0, 0), + (340, 100128, 11, 0, 0), + (340, 110041, 10, 0, 0), + (340, 110041, 11, 0, 0), + (340, 130044, 0, 0, 0), + (340, 140009, 0, 0, 0), + (340, 160057, 0, 0, 0), + (340, 180016, 0, 0, 0), + (340, 190018, 0, 0, 0), + (340, 200006, 0, 0, 0), + (340, 230001, 0, 0, 0), + (340, 240005, 0, 0, 0), + (340, 250003, 0, 0, 0), + (340, 280003, 0, 0, 0), + (340, 290007, 0, 0, 0), + (340, 300001, 0, 0, 0), + (340, 320052, 0, 0, 0), + (340, 330021, 0, 0, 0), + (340, 340002, 0, 0, 0), + (340, 1000012, 0, 0, 0), + (340, 1100048, 0, 0, 0), + (340, 1200002, 0, 0, 0), + (341, 1001, 0, 0, 0), + (341, 2001, 0, 0, 0), + (341, 4001, 0, 0, 0), + (341, 5001, 0, 0, 0), + (341, 6001, 0, 0, 0), + (341, 10002, 10, 0, 0), + (341, 10010, 11, 0, 0), + (341, 11006, 10, 0, 0), + (341, 11006, 11, 0, 0), + (341, 12009, 10, 0, 0), + (341, 12030, 11, 0, 0), + (341, 15001, 0, 0, 0), + (341, 20216, 0, 0, 0), + (341, 22008, 0, 0, 0), + (341, 31153, 0, 0, 0), + (341, 36001, 0, 0, 0), + (341, 37001, 0, 0, 0), + (341, 40036, 0, 0, 0), + (341, 100128, 10, 0, 0), + (341, 100128, 11, 0, 0), + (341, 110025, 10, 0, 0), + (341, 110025, 11, 0, 0), + (341, 130044, 0, 0, 0), + (341, 140007, 0, 0, 0), + (341, 160057, 0, 0, 0), + (341, 180016, 0, 0, 0), + (341, 190018, 0, 0, 0), + (341, 200006, 0, 0, 0), + (341, 230001, 0, 0, 0), + (341, 240026, 0, 0, 0), + (341, 250027, 0, 0, 0), + (341, 280003, 0, 0, 0), + (341, 290015, 0, 0, 0), + (341, 300001, 0, 0, 0), + (341, 320003, 0, 0, 0), + (341, 330034, 0, 0, 0), + (341, 340002, 0, 0, 0), + (341, 1000117, 0, 0, 0), + (341, 1100002, 0, 0, 0), + (341, 1200002, 0, 0, 0), + (342, 1001, 0, 0, 0), + (342, 2001, 0, 0, 0), + (342, 4001, 0, 0, 0), + (342, 5001, 0, 0, 0), + (342, 6001, 0, 0, 0), + (342, 10009, 11, 0, 0), + (342, 10010, 10, 0, 0), + (342, 11006, 10, 0, 0), + (342, 11006, 11, 0, 0), + (342, 12008, 11, 0, 0), + (342, 12009, 10, 0, 0), + (342, 15001, 0, 0, 0), + (342, 20217, 0, 0, 0), + (342, 22009, 0, 0, 0), + (342, 31153, 0, 0, 0), + (342, 36001, 0, 0, 0), + (342, 37001, 0, 0, 0), + (342, 40022, 0, 0, 0), + (342, 100002, 10, 0, 0), + (342, 100002, 11, 0, 0), + (342, 110025, 10, 0, 0), + (342, 110025, 11, 0, 0), + (342, 130033, 0, 0, 0), + (342, 140010, 0, 0, 0), + (342, 160009, 0, 0, 0), + (342, 180014, 0, 0, 0), + (342, 190016, 0, 0, 0), + (342, 200002, 0, 0, 0), + (342, 230001, 0, 0, 0), + (342, 240001, 0, 0, 0), + (342, 250002, 0, 0, 0), + (342, 280024, 0, 0, 0), + (342, 290004, 0, 0, 0), + (342, 300001, 0, 0, 0), + (342, 320020, 0, 0, 0), + (342, 330053, 0, 0, 0), + (342, 340002, 0, 0, 0), + (342, 1000121, 0, 0, 0), + (342, 1100001, 0, 0, 0), + (342, 1200034, 0, 0, 0), + (343, 1001, 0, 0, 0), + (343, 2001, 0, 0, 0), + (343, 4001, 0, 0, 0), + (343, 5001, 0, 0, 0), + (343, 6001, 0, 0, 0), + (343, 10009, 11, 0, 0), + (343, 10010, 10, 0, 0), + (343, 11006, 10, 0, 0), + (343, 11006, 11, 0, 0), + (343, 12009, 10, 0, 0), + (343, 12030, 11, 0, 0), + (343, 15001, 0, 0, 0), + (343, 20218, 0, 0, 0), + (343, 22009, 0, 0, 0), + (343, 31153, 0, 0, 0), + (343, 36001, 0, 0, 0), + (343, 37001, 0, 0, 0), + (343, 40041, 0, 0, 0), + (343, 100002, 10, 0, 0), + (343, 100002, 11, 0, 0), + (343, 110025, 10, 0, 0), + (343, 110025, 11, 0, 0), + (343, 130033, 0, 0, 0), + (343, 140011, 0, 0, 0), + (343, 160014, 0, 0, 0), + (343, 180002, 0, 0, 0), + (343, 190015, 0, 0, 0), + (343, 200003, 0, 0, 0), + (343, 230001, 0, 0, 0), + (343, 240001, 0, 0, 0), + (343, 250002, 0, 0, 0), + (343, 280002, 0, 0, 0), + (343, 290004, 0, 0, 0), + (343, 300001, 0, 0, 0), + (343, 320002, 0, 0, 0), + (343, 330018, 0, 0, 0), + (343, 340002, 0, 0, 0), + (343, 1000075, 0, 0, 0), + (343, 1100014, 0, 0, 0), + (343, 1200001, 0, 0, 0), + (344, 1001, 0, 0, 0), + (344, 2001, 0, 0, 0), + (344, 4001, 0, 0, 0), + (344, 5001, 0, 0, 0), + (344, 6001, 0, 0, 0), + (344, 10002, 10, 0, 0), + (344, 10010, 11, 0, 0), + (344, 11006, 10, 0, 0), + (344, 11006, 11, 0, 0), + (344, 12009, 10, 0, 0), + (344, 12030, 11, 0, 0), + (344, 15001, 0, 0, 0), + (344, 20219, 0, 0, 0), + (344, 22009, 0, 0, 0), + (344, 31153, 0, 0, 0), + (344, 36001, 0, 0, 0), + (344, 37001, 0, 0, 0), + (344, 40025, 0, 0, 0), + (344, 100002, 10, 0, 0), + (344, 100002, 11, 0, 0), + (344, 110026, 10, 0, 0), + (344, 110026, 11, 0, 0), + (344, 130033, 0, 0, 0), + (344, 140009, 0, 0, 0), + (344, 160012, 0, 0, 0), + (344, 180014, 0, 0, 0), + (344, 190016, 0, 0, 0), + (344, 200002, 0, 0, 0), + (344, 230001, 0, 0, 0), + (344, 240001, 0, 0, 0), + (344, 250002, 0, 0, 0), + (344, 280016, 0, 0, 0), + (344, 290004, 0, 0, 0), + (344, 300001, 0, 0, 0), + (344, 320020, 0, 0, 0), + (344, 330018, 0, 0, 0), + (344, 340002, 0, 0, 0), + (344, 1000122, 0, 0, 0), + (344, 1100001, 0, 0, 0), + (344, 1200034, 0, 0, 0), + (345, 1001, 0, 0, 0), + (345, 2001, 0, 0, 0), + (345, 4001, 0, 0, 0), + (345, 5001, 0, 0, 0), + (345, 6001, 0, 0, 0), + (345, 10002, 10, 0, 0), + (345, 10010, 11, 0, 0), + (345, 11007, 10, 0, 0), + (345, 11007, 11, 0, 0), + (345, 12010, 10, 0, 0), + (345, 12022, 11, 0, 0), + (345, 15001, 0, 0, 0), + (345, 20220, 0, 0, 0), + (345, 22009, 0, 0, 0), + (345, 29001, 0, 0, 0), + (345, 31153, 0, 0, 0), + (345, 36001, 0, 0, 0), + (345, 37001, 0, 0, 0), + (345, 40025, 0, 0, 0), + (345, 100002, 10, 0, 0), + (345, 100002, 11, 0, 0), + (345, 110027, 10, 0, 0), + (345, 110027, 11, 0, 0), + (345, 130033, 0, 0, 0), + (345, 140011, 0, 0, 0), + (345, 160007, 0, 0, 0), + (345, 180014, 0, 0, 0), + (345, 190016, 0, 0, 0), + (345, 200047, 0, 0, 0), + (345, 230002, 0, 0, 0), + (345, 240005, 0, 0, 0), + (345, 250002, 0, 0, 0), + (345, 280024, 0, 0, 0), + (345, 290004, 0, 0, 0), + (345, 300003, 0, 0, 0), + (345, 320029, 0, 0, 0), + (345, 330025, 0, 0, 0), + (345, 340003, 0, 0, 0), + (345, 1000125, 0, 0, 0), + (345, 1100022, 0, 0, 0), + (345, 1200023, 0, 0, 0), + (346, 1001, 0, 0, 0), + (346, 2001, 0, 0, 0), + (346, 4001, 0, 0, 0), + (346, 5001, 0, 0, 0), + (346, 6001, 0, 0, 0), + (346, 10002, 10, 0, 0), + (346, 10010, 11, 0, 0), + (346, 11006, 10, 0, 0), + (346, 11006, 11, 0, 0), + (346, 12009, 11, 0, 0), + (346, 12010, 10, 0, 0), + (346, 15001, 0, 0, 0), + (346, 20221, 0, 0, 0), + (346, 22009, 0, 0, 0), + (346, 30001, 0, 0, 0), + (346, 31153, 0, 0, 0), + (346, 36001, 0, 0, 0), + (346, 37001, 0, 0, 0), + (346, 40061, 0, 0, 0), + (346, 100002, 10, 0, 0), + (346, 100002, 11, 0, 0), + (346, 110104, 10, 0, 0), + (346, 110109, 11, 0, 0), + (346, 130033, 0, 0, 0), + (346, 140008, 0, 0, 0), + (346, 160014, 0, 0, 0), + (346, 180002, 0, 0, 0), + (346, 190015, 0, 0, 0), + (346, 200003, 0, 0, 0), + (346, 230001, 0, 0, 0), + (346, 240001, 0, 0, 0), + (346, 250002, 0, 0, 0), + (346, 280002, 0, 0, 0), + (346, 290004, 0, 0, 0), + (346, 300001, 0, 0, 0), + (346, 320002, 0, 0, 0), + (346, 330018, 0, 0, 0), + (346, 340002, 0, 0, 0), + (346, 1000075, 0, 0, 0), + (346, 1100014, 0, 0, 0), + (346, 1200001, 0, 0, 0), + (347, 1001, 0, 0, 0), + (347, 2001, 0, 0, 0), + (347, 4001, 0, 0, 0), + (347, 5001, 0, 0, 0), + (347, 6001, 0, 0, 0), + (347, 10002, 10, 0, 0), + (347, 10010, 11, 0, 0), + (347, 11006, 10, 0, 0), + (347, 11006, 11, 0, 0), + (347, 12009, 11, 0, 0), + (347, 12010, 10, 0, 0), + (347, 15001, 0, 0, 0), + (347, 20222, 0, 0, 0), + (347, 22004, 0, 0, 0), + (347, 31153, 0, 0, 0), + (347, 36001, 0, 0, 0), + (347, 37001, 0, 0, 0), + (347, 40028, 0, 0, 0), + (347, 100002, 10, 0, 0), + (347, 100002, 11, 0, 0), + (347, 110041, 10, 0, 0), + (347, 110041, 11, 0, 0), + (347, 130033, 0, 0, 0), + (347, 140011, 0, 0, 0), + (347, 160014, 0, 0, 0), + (347, 180002, 0, 0, 0), + (347, 190015, 0, 0, 0), + (347, 200003, 0, 0, 0), + (347, 230001, 0, 0, 0), + (347, 240001, 0, 0, 0), + (347, 250002, 0, 0, 0), + (347, 280002, 0, 0, 0), + (347, 290004, 0, 0, 0), + (347, 300001, 0, 0, 0), + (347, 320002, 0, 0, 0), + (347, 330018, 0, 0, 0), + (347, 340002, 0, 0, 0), + (347, 1000075, 0, 0, 0), + (347, 1100014, 0, 0, 0), + (347, 1200001, 0, 0, 0), + (348, 1001, 0, 0, 0), + (348, 2001, 0, 0, 0), + (348, 4001, 0, 0, 0), + (348, 5001, 0, 0, 0), + (348, 6001, 0, 0, 0), + (348, 10001, 10, 0, 0), + (348, 10010, 11, 0, 0), + (348, 11006, 10, 0, 0), + (348, 11006, 11, 0, 0), + (348, 12008, 10, 0, 0), + (348, 12029, 11, 0, 0), + (348, 15001, 0, 0, 0), + (348, 20223, 0, 0, 0), + (348, 22009, 0, 0, 0), + (348, 31153, 0, 0, 0), + (348, 36001, 0, 0, 0), + (348, 37001, 0, 0, 0), + (348, 40029, 0, 0, 0), + (348, 100002, 10, 0, 0), + (348, 100002, 11, 0, 0), + (348, 110025, 10, 0, 0), + (348, 110025, 11, 0, 0), + (348, 130033, 0, 0, 0), + (348, 140007, 0, 0, 0), + (348, 160012, 0, 0, 0), + (348, 180003, 0, 0, 0), + (348, 190016, 0, 0, 0), + (348, 200002, 0, 0, 0), + (348, 230001, 0, 0, 0), + (348, 240005, 0, 0, 0), + (348, 250002, 0, 0, 0), + (348, 280016, 0, 0, 0), + (348, 290004, 0, 0, 0), + (348, 300001, 0, 0, 0), + (348, 320020, 0, 0, 0), + (348, 330056, 0, 0, 0), + (348, 340002, 0, 0, 0), + (348, 1000074, 0, 0, 0), + (348, 1100001, 0, 0, 0), + (348, 1200034, 0, 0, 0), + (349, 1001, 0, 0, 0), + (349, 2001, 0, 0, 0), + (349, 4001, 0, 0, 0), + (349, 5001, 0, 0, 0), + (349, 6001, 0, 0, 0), + (349, 10002, 10, 0, 0), + (349, 10010, 11, 0, 0), + (349, 11006, 10, 0, 0), + (349, 11006, 11, 0, 0), + (349, 12009, 11, 0, 0), + (349, 12010, 10, 0, 0), + (349, 15001, 0, 0, 0), + (349, 20224, 0, 0, 0), + (349, 22009, 0, 0, 0), + (349, 31153, 0, 0, 0), + (349, 36001, 0, 0, 0), + (349, 37001, 0, 0, 0), + (349, 40046, 0, 0, 0), + (349, 100002, 10, 0, 0), + (349, 100002, 11, 0, 0), + (349, 110041, 10, 0, 0), + (349, 110041, 11, 0, 0), + (349, 130033, 0, 0, 0), + (349, 140017, 0, 0, 0), + (349, 160037, 0, 0, 0), + (349, 180020, 0, 0, 0), + (349, 190022, 0, 0, 0), + (349, 200052, 0, 0, 0), + (349, 230001, 0, 0, 0), + (349, 240001, 0, 0, 0), + (349, 250002, 0, 0, 0), + (349, 280027, 0, 0, 0), + (349, 290004, 0, 0, 0), + (349, 300001, 0, 0, 0), + (349, 320037, 0, 0, 0), + (349, 330043, 0, 0, 0), + (349, 340002, 0, 0, 0), + (349, 1000017, 0, 0, 0), + (349, 1100032, 0, 0, 0), + (349, 1200019, 0, 0, 0), + (350, 1001, 0, 0, 0), + (350, 2001, 0, 0, 0), + (350, 4001, 0, 0, 0), + (350, 5001, 0, 0, 0), + (350, 6001, 0, 0, 0), + (350, 10002, 10, 0, 0), + (350, 10010, 11, 0, 0), + (350, 11006, 10, 0, 0), + (350, 11006, 11, 0, 0), + (350, 12009, 11, 0, 0), + (350, 12010, 10, 0, 0), + (350, 15001, 0, 0, 0), + (350, 20225, 0, 0, 0), + (350, 22009, 0, 0, 0), + (350, 30001, 0, 0, 0), + (350, 31153, 0, 0, 0), + (350, 36001, 0, 0, 0), + (350, 37001, 0, 0, 0), + (350, 40038, 0, 0, 0), + (350, 100119, 10, 0, 0), + (350, 100119, 11, 0, 0), + (350, 110041, 10, 0, 0), + (350, 110041, 11, 0, 0), + (350, 130045, 0, 0, 0), + (350, 140011, 0, 0, 0), + (350, 160038, 0, 0, 0), + (350, 180026, 0, 0, 0), + (350, 190022, 0, 0, 0), + (350, 200020, 0, 0, 0), + (350, 230001, 0, 0, 0), + (350, 240001, 0, 0, 0), + (350, 250002, 0, 0, 0), + (350, 280027, 0, 0, 0), + (350, 290004, 0, 0, 0), + (350, 300003, 0, 0, 0), + (350, 320024, 0, 0, 0), + (350, 330043, 0, 0, 0), + (350, 340002, 0, 0, 0), + (350, 1000017, 0, 0, 0), + (350, 1100098, 0, 0, 0), + (350, 1200019, 0, 0, 0), + (351, 1001, 0, 0, 0), + (351, 2001, 0, 0, 0), + (351, 4001, 0, 0, 0), + (351, 5001, 0, 0, 0), + (351, 6001, 0, 0, 0), + (351, 10002, 10, 0, 0), + (351, 10010, 11, 0, 0), + (351, 11006, 10, 0, 0), + (351, 11006, 11, 0, 0), + (351, 12009, 11, 0, 0), + (351, 12010, 10, 0, 0), + (351, 15001, 0, 0, 0), + (351, 20226, 0, 0, 0), + (351, 22009, 0, 0, 0), + (351, 30001, 0, 0, 0), + (351, 31153, 0, 0, 0), + (351, 36001, 0, 0, 0), + (351, 37001, 0, 0, 0), + (351, 40027, 0, 0, 0), + (351, 100002, 10, 0, 0), + (351, 100002, 11, 0, 0), + (351, 110041, 10, 0, 0), + (351, 110041, 11, 0, 0), + (351, 130045, 0, 0, 0), + (351, 140009, 0, 0, 0), + (351, 160040, 0, 0, 0), + (351, 180023, 0, 0, 0), + (351, 190006, 0, 0, 0), + (351, 200023, 0, 0, 0), + (351, 230001, 0, 0, 0), + (351, 240001, 0, 0, 0), + (351, 250002, 0, 0, 0), + (351, 280028, 0, 0, 0), + (351, 290004, 0, 0, 0), + (351, 300002, 0, 0, 0), + (351, 320027, 0, 0, 0), + (351, 330043, 0, 0, 0), + (351, 340002, 0, 0, 0), + (351, 1000051, 0, 0, 0), + (351, 1100034, 0, 0, 0), + (351, 1200035, 0, 0, 0), + (352, 1001, 0, 0, 0), + (352, 2001, 0, 0, 0), + (352, 4001, 0, 0, 0), + (352, 5001, 0, 0, 0), + (352, 6001, 0, 0, 0), + (352, 10002, 10, 0, 0), + (352, 10010, 11, 0, 0), + (352, 11006, 10, 0, 0), + (352, 11006, 11, 0, 0), + (352, 12009, 10, 0, 0), + (352, 12030, 11, 0, 0), + (352, 15001, 0, 0, 0), + (352, 20227, 0, 0, 0), + (352, 22006, 0, 0, 0), + (352, 31153, 0, 0, 0), + (352, 36001, 0, 0, 0), + (352, 37001, 0, 0, 0), + (352, 40047, 0, 0, 0), + (352, 100002, 10, 0, 0), + (352, 100002, 11, 0, 0), + (352, 110027, 10, 0, 0), + (352, 110027, 11, 0, 0), + (352, 130033, 0, 0, 0), + (352, 140009, 0, 0, 0), + (352, 160040, 0, 0, 0), + (352, 180023, 0, 0, 0), + (352, 190006, 0, 0, 0), + (352, 200023, 0, 0, 0), + (352, 230001, 0, 0, 0), + (352, 240005, 0, 0, 0), + (352, 250002, 0, 0, 0), + (352, 280023, 0, 0, 0), + (352, 290004, 0, 0, 0), + (352, 300001, 0, 0, 0), + (352, 320027, 0, 0, 0), + (352, 330043, 0, 0, 0), + (352, 340002, 0, 0, 0), + (352, 1000016, 0, 0, 0), + (352, 1100020, 0, 0, 0), + (352, 1200037, 0, 0, 0), + (353, 1001, 0, 0, 0), + (353, 2001, 0, 0, 0), + (353, 4001, 0, 0, 0), + (353, 5001, 0, 0, 0), + (353, 6001, 0, 0, 0), + (353, 10002, 10, 0, 0), + (353, 10010, 11, 0, 0), + (353, 11006, 10, 0, 0), + (353, 11006, 11, 0, 0), + (353, 12009, 10, 0, 0), + (353, 12030, 11, 0, 0), + (353, 15001, 0, 0, 0), + (353, 20228, 0, 0, 0), + (353, 22006, 0, 0, 0), + (353, 31153, 0, 0, 0), + (353, 36001, 0, 0, 0), + (353, 37001, 0, 0, 0), + (353, 40031, 0, 0, 0), + (353, 100002, 10, 0, 0), + (353, 100002, 11, 0, 0), + (353, 110027, 10, 0, 0), + (353, 110027, 11, 0, 0), + (353, 130033, 0, 0, 0), + (353, 140007, 0, 0, 0), + (353, 160040, 0, 0, 0), + (353, 180023, 0, 0, 0), + (353, 190006, 0, 0, 0), + (353, 200023, 0, 0, 0), + (353, 230001, 0, 0, 0), + (353, 240005, 0, 0, 0), + (353, 250002, 0, 0, 0), + (353, 280023, 0, 0, 0), + (353, 290003, 0, 0, 0), + (353, 300002, 0, 0, 0), + (353, 320027, 0, 0, 0), + (353, 330059, 0, 0, 0), + (353, 340002, 0, 0, 0), + (353, 1000084, 0, 0, 0), + (353, 1100020, 0, 0, 0), + (353, 1200035, 0, 0, 0), + (354, 1001, 0, 0, 0), + (354, 2001, 0, 0, 0), + (354, 4001, 0, 0, 0), + (354, 5001, 0, 0, 0), + (354, 6001, 0, 0, 0), + (354, 10012, 10, 0, 0), + (354, 10012, 11, 0, 0), + (354, 11004, 10, 0, 0), + (354, 11004, 11, 0, 0), + (354, 12009, 10, 0, 0), + (354, 12027, 11, 0, 0), + (354, 15001, 0, 0, 0), + (354, 20124, 0, 0, 0), + (354, 22005, 0, 0, 0), + (354, 31153, 0, 0, 0), + (354, 36001, 0, 0, 0), + (354, 37001, 0, 0, 0), + (354, 40014, 0, 0, 0), + (354, 100002, 10, 0, 0), + (354, 100002, 11, 0, 0), + (354, 110047, 10, 0, 0), + (354, 110047, 11, 0, 0), + (354, 130033, 0, 0, 0), + (354, 140008, 0, 0, 0), + (354, 160010, 0, 0, 0), + (354, 180055, 0, 0, 0), + (354, 190071, 0, 0, 0), + (354, 200056, 0, 0, 0), + (354, 230001, 0, 0, 0), + (354, 240001, 0, 0, 0), + (354, 250021, 0, 0, 0), + (354, 280044, 0, 0, 0), + (354, 290003, 0, 0, 0), + (354, 300001, 0, 0, 0), + (354, 320092, 0, 0, 0), + (354, 330052, 0, 0, 0), + (354, 340002, 0, 0, 0), + (354, 1000154, 0, 0, 0), + (354, 1100112, 0, 0, 0), + (354, 1200042, 0, 0, 0), + (355, 1001, 0, 0, 0), + (355, 2001, 0, 0, 0), + (355, 4001, 0, 0, 0), + (355, 5001, 0, 0, 0), + (355, 6001, 0, 0, 0), + (355, 10001, 10, 0, 0), + (355, 10004, 11, 0, 0), + (355, 11004, 10, 0, 0), + (355, 11004, 11, 0, 0), + (355, 12003, 11, 0, 0), + (355, 12005, 10, 0, 0), + (355, 15001, 0, 0, 0), + (355, 20112, 0, 0, 0), + (355, 22014, 0, 0, 0), + (355, 31153, 0, 0, 0), + (355, 36001, 0, 0, 0), + (355, 37001, 0, 0, 0), + (355, 40004, 0, 0, 0), + (355, 100002, 10, 0, 0), + (355, 100002, 11, 0, 0), + (355, 110038, 10, 0, 0), + (355, 110038, 11, 0, 0), + (355, 130047, 0, 0, 0), + (355, 140024, 0, 0, 0), + (355, 160047, 0, 0, 0), + (355, 180019, 0, 0, 0), + (355, 190021, 0, 0, 0), + (355, 200019, 0, 0, 0), + (355, 230002, 0, 0, 0), + (355, 240001, 0, 0, 0), + (355, 250020, 0, 0, 0), + (355, 280019, 0, 0, 0), + (355, 290001, 0, 0, 0), + (355, 300001, 0, 0, 0), + (355, 320023, 0, 0, 0), + (355, 330006, 0, 0, 0), + (355, 340001, 0, 0, 0), + (355, 1000003, 0, 0, 0), + (355, 1100016, 0, 0, 0), + (355, 1200018, 0, 0, 0), + (356, 1001, 0, 0, 0), + (356, 2001, 0, 0, 0), + (356, 4001, 0, 0, 0), + (356, 5001, 0, 0, 0), + (356, 6001, 0, 0, 0), + (356, 10009, 11, 0, 0), + (356, 10010, 10, 0, 0), + (356, 11004, 10, 0, 0), + (356, 11004, 11, 0, 0), + (356, 12006, 10, 0, 0), + (356, 12028, 11, 0, 0), + (356, 15001, 0, 0, 0), + (356, 20103, 0, 0, 0), + (356, 22014, 0, 0, 0), + (356, 31153, 0, 0, 0), + (356, 36001, 0, 0, 0), + (356, 37001, 0, 0, 0), + (356, 40005, 0, 0, 0), + (356, 100002, 10, 0, 0), + (356, 100002, 11, 0, 0), + (356, 110012, 10, 0, 0), + (356, 110012, 11, 0, 0), + (356, 130012, 0, 0, 0), + (356, 140014, 0, 0, 0), + (356, 160022, 0, 0, 0), + (356, 180019, 0, 0, 0), + (356, 190021, 0, 0, 0), + (356, 200019, 0, 0, 0), + (356, 230001, 0, 0, 0), + (356, 240003, 0, 0, 0), + (356, 250020, 0, 0, 0), + (356, 280019, 0, 0, 0), + (356, 290001, 0, 0, 0), + (356, 300001, 0, 0, 0), + (356, 320023, 0, 0, 0), + (356, 330006, 0, 0, 0), + (356, 340001, 0, 0, 0), + (356, 1000004, 0, 0, 0), + (356, 1100016, 0, 0, 0), + (356, 1200018, 0, 0, 0), + (357, 1001, 0, 0, 0), + (357, 2001, 0, 0, 0), + (357, 4001, 0, 0, 0), + (357, 5001, 0, 0, 0), + (357, 6001, 0, 0, 0), + (357, 10001, 10, 0, 0), + (357, 10004, 11, 0, 0), + (357, 11004, 10, 0, 0), + (357, 11004, 11, 0, 0), + (357, 12009, 10, 0, 0), + (357, 12029, 11, 0, 0), + (357, 15001, 0, 0, 0), + (357, 20104, 0, 0, 0), + (357, 22014, 0, 0, 0), + (357, 31153, 0, 0, 0), + (357, 36001, 0, 0, 0), + (357, 37001, 0, 0, 0), + (357, 40006, 0, 0, 0), + (357, 100002, 10, 0, 0), + (357, 100002, 11, 0, 0), + (357, 110032, 10, 0, 0), + (357, 110032, 11, 0, 0), + (357, 130012, 0, 0, 0), + (357, 140016, 0, 0, 0), + (357, 160026, 0, 0, 0), + (357, 180018, 0, 0, 0), + (357, 190077, 0, 0, 0), + (357, 200066, 0, 0, 0), + (357, 230001, 0, 0, 0), + (357, 240001, 0, 0, 0), + (357, 250030, 0, 0, 0), + (357, 280030, 0, 0, 0), + (357, 290002, 0, 0, 0), + (357, 300001, 0, 0, 0), + (357, 320040, 0, 0, 0), + (357, 330035, 0, 0, 0), + (357, 340002, 0, 0, 0), + (357, 1000094, 0, 0, 0), + (357, 1100119, 0, 0, 0), + (357, 1200048, 0, 0, 0), + (358, 1001, 0, 0, 0), + (358, 2001, 0, 0, 0), + (358, 4001, 0, 0, 0), + (358, 5001, 0, 0, 0), + (358, 6001, 0, 0, 0), + (358, 10011, 10, 0, 0), + (358, 10011, 11, 0, 0), + (358, 11004, 10, 0, 0), + (358, 11004, 11, 0, 0), + (358, 12009, 10, 0, 0), + (358, 12022, 11, 0, 0), + (358, 15001, 0, 0, 0), + (358, 20105, 0, 0, 0), + (358, 22014, 0, 0, 0), + (358, 31153, 0, 0, 0), + (358, 36001, 0, 0, 0), + (358, 37001, 0, 0, 0), + (358, 40007, 0, 0, 0), + (358, 100002, 10, 0, 0), + (358, 100002, 11, 0, 0), + (358, 110032, 10, 0, 0), + (358, 110032, 11, 0, 0), + (358, 130012, 0, 0, 0), + (358, 140011, 0, 0, 0), + (358, 160026, 0, 0, 0), + (358, 180018, 0, 0, 0), + (358, 190077, 0, 0, 0), + (358, 200066, 0, 0, 0), + (358, 230001, 0, 0, 0), + (358, 240001, 0, 0, 0), + (358, 250030, 0, 0, 0), + (358, 280030, 0, 0, 0), + (358, 290002, 0, 0, 0), + (358, 300001, 0, 0, 0), + (358, 320040, 0, 0, 0), + (358, 330035, 0, 0, 0), + (358, 340002, 0, 0, 0), + (358, 1000001, 0, 0, 0), + (358, 1100119, 0, 0, 0), + (358, 1200048, 0, 0, 0), + (359, 1001, 0, 0, 0), + (359, 2001, 0, 0, 0), + (359, 4001, 0, 0, 0), + (359, 5001, 0, 0, 0), + (359, 6001, 0, 0, 0), + (359, 10011, 10, 0, 0), + (359, 10011, 11, 0, 0), + (359, 11004, 10, 0, 0), + (359, 11004, 11, 0, 0), + (359, 12009, 10, 0, 0), + (359, 12029, 11, 0, 0), + (359, 15001, 0, 0, 0), + (359, 20106, 0, 0, 0), + (359, 22014, 0, 0, 0), + (359, 31153, 0, 0, 0), + (359, 36001, 0, 0, 0), + (359, 37001, 0, 0, 0), + (359, 40008, 0, 0, 0), + (359, 100002, 10, 0, 0), + (359, 100002, 11, 0, 0), + (359, 110032, 10, 0, 0), + (359, 110032, 11, 0, 0), + (359, 130012, 0, 0, 0), + (359, 140003, 0, 0, 0), + (359, 160026, 0, 0, 0), + (359, 180018, 0, 0, 0), + (359, 190077, 0, 0, 0), + (359, 200042, 0, 0, 0), + (359, 230001, 0, 0, 0), + (359, 240001, 0, 0, 0), + (359, 250030, 0, 0, 0), + (359, 280030, 0, 0, 0), + (359, 290002, 0, 0, 0), + (359, 300001, 0, 0, 0), + (359, 320040, 0, 0, 0), + (359, 330035, 0, 0, 0), + (359, 340002, 0, 0, 0), + (359, 1000001, 0, 0, 0), + (359, 1100119, 0, 0, 0), + (359, 1200048, 0, 0, 0), + (360, 1001, 0, 0, 0), + (360, 2001, 0, 0, 0), + (360, 4001, 0, 0, 0), + (360, 5001, 0, 0, 0), + (360, 6001, 0, 0, 0), + (360, 10001, 10, 0, 0), + (360, 10004, 11, 0, 0), + (360, 11004, 10, 0, 0), + (360, 11004, 11, 0, 0), + (360, 12007, 10, 0, 0), + (360, 12029, 11, 0, 0), + (360, 15001, 0, 0, 0), + (360, 20113, 0, 0, 0), + (360, 22009, 0, 0, 0), + (360, 31153, 0, 0, 0), + (360, 36001, 0, 0, 0), + (360, 37001, 0, 0, 0), + (360, 40016, 0, 0, 0), + (360, 100002, 10, 0, 0), + (360, 100002, 11, 0, 0), + (360, 110032, 10, 0, 0), + (360, 110032, 11, 0, 0), + (360, 130022, 0, 0, 0), + (360, 140009, 0, 0, 0), + (360, 160006, 0, 0, 0), + (360, 180014, 0, 0, 0), + (360, 190016, 0, 0, 0), + (360, 200002, 0, 0, 0), + (360, 230001, 0, 0, 0), + (360, 240001, 0, 0, 0), + (360, 250026, 0, 0, 0), + (360, 280024, 0, 0, 0), + (360, 290003, 0, 0, 0), + (360, 300001, 0, 0, 0), + (360, 320020, 0, 0, 0), + (360, 330054, 0, 0, 0), + (360, 340002, 0, 0, 0), + (360, 1000123, 0, 0, 0), + (360, 1100022, 0, 0, 0), + (360, 1200034, 0, 0, 0), + (361, 1001, 0, 0, 0), + (361, 2001, 0, 0, 0), + (361, 4001, 0, 0, 0), + (361, 5001, 0, 0, 0), + (361, 6001, 0, 0, 0), + (361, 10011, 10, 0, 0), + (361, 10011, 11, 0, 0), + (361, 11004, 10, 0, 0), + (361, 11004, 11, 0, 0), + (361, 12007, 10, 0, 0), + (361, 12027, 11, 0, 0), + (361, 15001, 0, 0, 0), + (361, 20115, 0, 0, 0), + (361, 22009, 0, 0, 0), + (361, 31153, 0, 0, 0), + (361, 36001, 0, 0, 0), + (361, 37001, 0, 0, 0), + (361, 40017, 0, 0, 0), + (361, 100002, 10, 0, 0), + (361, 100002, 11, 0, 0), + (361, 110032, 10, 0, 0), + (361, 110032, 11, 0, 0), + (361, 130022, 0, 0, 0), + (361, 140009, 0, 0, 0), + (361, 160006, 0, 0, 0), + (361, 180014, 0, 0, 0), + (361, 190016, 0, 0, 0), + (361, 200002, 0, 0, 0), + (361, 230001, 0, 0, 0), + (361, 240001, 0, 0, 0), + (361, 250026, 0, 0, 0), + (361, 280024, 0, 0, 0), + (361, 290004, 0, 0, 0), + (361, 300001, 0, 0, 0), + (361, 320030, 0, 0, 0), + (361, 330053, 0, 0, 0), + (361, 340002, 0, 0, 0), + (361, 1000015, 0, 0, 0), + (361, 1100001, 0, 0, 0), + (361, 1200034, 0, 0, 0), + (362, 1001, 0, 0, 0), + (362, 2001, 0, 0, 0), + (362, 4001, 0, 0, 0), + (362, 5001, 0, 0, 0), + (362, 6001, 0, 0, 0), + (362, 10006, 11, 0, 0), + (362, 10015, 10, 0, 0), + (362, 11006, 10, 0, 0), + (362, 11006, 11, 0, 0), + (362, 12020, 10, 0, 0), + (362, 12028, 11, 0, 0), + (362, 13007, 10, 0, 0), + (362, 15001, 0, 0, 0), + (362, 20114, 0, 0, 0), + (362, 22009, 0, 0, 0), + (362, 31153, 0, 0, 0), + (362, 36001, 0, 0, 0), + (362, 37001, 0, 0, 0), + (362, 40018, 0, 0, 0), + (362, 100002, 10, 0, 0), + (362, 100002, 11, 0, 0), + (362, 110012, 10, 0, 0), + (362, 110012, 11, 0, 0), + (362, 130016, 0, 0, 0), + (362, 140009, 0, 0, 0), + (362, 160006, 0, 0, 0), + (362, 180014, 0, 0, 0), + (362, 190016, 0, 0, 0), + (362, 200002, 0, 0, 0), + (362, 230001, 0, 0, 0), + (362, 240001, 0, 0, 0), + (362, 250026, 0, 0, 0), + (362, 280024, 0, 0, 0), + (362, 290001, 0, 0, 0), + (362, 300001, 0, 0, 0), + (362, 320030, 0, 0, 0), + (362, 330052, 0, 0, 0), + (362, 340002, 0, 0, 0), + (362, 1000015, 0, 0, 0), + (362, 1100001, 0, 0, 0), + (362, 1200034, 0, 0, 0), + (363, 1001, 0, 0, 0), + (363, 2001, 0, 0, 0), + (363, 4001, 0, 0, 0), + (363, 5001, 0, 0, 0), + (363, 6001, 0, 0, 0), + (363, 10011, 10, 0, 0), + (363, 10011, 11, 0, 0), + (363, 11004, 10, 0, 0), + (363, 11004, 11, 0, 0), + (363, 12006, 10, 0, 0), + (363, 12009, 11, 0, 0), + (363, 15001, 0, 0, 0), + (363, 20118, 0, 0, 0), + (363, 22009, 0, 0, 0), + (363, 31153, 0, 0, 0), + (363, 36001, 0, 0, 0), + (363, 37001, 0, 0, 0), + (363, 40019, 0, 0, 0), + (363, 100002, 10, 0, 0), + (363, 100002, 11, 0, 0), + (363, 110032, 10, 0, 0), + (363, 110032, 11, 0, 0), + (363, 130022, 0, 0, 0), + (363, 140016, 0, 0, 0), + (363, 160011, 0, 0, 0), + (363, 180062, 0, 0, 0), + (363, 190067, 0, 0, 0), + (363, 200048, 0, 0, 0), + (363, 230001, 0, 0, 0), + (363, 240001, 0, 0, 0), + (363, 250026, 0, 0, 0), + (363, 280051, 0, 0, 0), + (363, 290004, 0, 0, 0), + (363, 300001, 0, 0, 0), + (363, 320100, 0, 0, 0), + (363, 330056, 0, 0, 0), + (363, 340002, 0, 0, 0), + (363, 1000057, 0, 0, 0), + (363, 1100120, 0, 0, 0), + (363, 1200049, 0, 0, 0), + (364, 1001, 0, 0, 0), + (364, 2001, 0, 0, 0), + (364, 4001, 0, 0, 0), + (364, 5001, 0, 0, 0), + (364, 6001, 0, 0, 0), + (364, 10021, 10, 0, 0), + (364, 10026, 11, 0, 0), + (364, 11006, 10, 0, 0), + (364, 11006, 11, 0, 0), + (364, 12007, 11, 0, 0), + (364, 12021, 10, 0, 0), + (364, 15001, 0, 0, 0), + (364, 20117, 0, 0, 0), + (364, 22009, 0, 0, 0), + (364, 31153, 0, 0, 0), + (364, 36001, 0, 0, 0), + (364, 37001, 0, 0, 0), + (364, 40021, 0, 0, 0), + (364, 100002, 10, 0, 0), + (364, 100002, 11, 0, 0), + (364, 110044, 10, 0, 0), + (364, 110044, 11, 0, 0), + (364, 130016, 0, 0, 0), + (364, 140005, 0, 0, 0), + (364, 160009, 0, 0, 0), + (364, 180014, 0, 0, 0), + (364, 190016, 0, 0, 0), + (364, 200002, 0, 0, 0), + (364, 230001, 0, 0, 0), + (364, 240006, 0, 0, 0), + (364, 250002, 0, 0, 0), + (364, 280024, 0, 0, 0), + (364, 290004, 0, 0, 0), + (364, 300001, 0, 0, 0), + (364, 320030, 0, 0, 0), + (364, 330057, 0, 0, 0), + (364, 340003, 0, 0, 0), + (364, 1000073, 0, 0, 0), + (364, 1100025, 0, 0, 0), + (364, 1200023, 0, 0, 0), + (365, 1001, 0, 0, 0), + (365, 2001, 0, 0, 0), + (365, 4001, 0, 0, 0), + (365, 5001, 0, 0, 0), + (365, 6001, 0, 0, 0), + (365, 10011, 10, 0, 0), + (365, 10011, 11, 0, 0), + (365, 11004, 10, 0, 0), + (365, 11004, 11, 0, 0), + (365, 12006, 11, 0, 0), + (365, 12009, 10, 0, 0), + (365, 15001, 0, 0, 0), + (365, 20116, 0, 0, 0), + (365, 22009, 0, 0, 0), + (365, 31153, 0, 0, 0), + (365, 36001, 0, 0, 0), + (365, 37001, 0, 0, 0), + (365, 40022, 0, 0, 0), + (365, 100002, 10, 0, 0), + (365, 100002, 11, 0, 0), + (365, 110035, 10, 0, 0), + (365, 110035, 11, 0, 0), + (365, 130022, 0, 0, 0), + (365, 140009, 0, 0, 0), + (365, 160006, 0, 0, 0), + (365, 180014, 0, 0, 0), + (365, 190016, 0, 0, 0), + (365, 200002, 0, 0, 0), + (365, 230001, 0, 0, 0), + (365, 240032, 0, 0, 0), + (365, 250026, 0, 0, 0), + (365, 280016, 0, 0, 0), + (365, 290004, 0, 0, 0), + (365, 300001, 0, 0, 0), + (365, 320020, 0, 0, 0), + (365, 330053, 0, 0, 0), + (365, 340002, 0, 0, 0), + (365, 1000070, 0, 0, 0), + (365, 1100001, 0, 0, 0), + (365, 1200034, 0, 0, 0), + (366, 1001, 0, 0, 0), + (366, 2001, 0, 0, 0), + (366, 4001, 0, 0, 0), + (366, 5001, 0, 0, 0), + (366, 6001, 0, 0, 0), + (366, 10010, 10, 0, 0), + (366, 10010, 11, 0, 0), + (366, 11004, 10, 0, 0), + (366, 11004, 11, 0, 0), + (366, 12009, 10, 0, 0), + (366, 12029, 11, 0, 0), + (366, 15001, 0, 0, 0), + (366, 20109, 0, 0, 0), + (366, 22014, 0, 0, 0), + (366, 31153, 0, 0, 0), + (366, 36001, 0, 0, 0), + (366, 37001, 0, 0, 0), + (366, 40011, 0, 0, 0), + (366, 100002, 10, 0, 0), + (366, 100002, 11, 0, 0), + (366, 110032, 10, 0, 0), + (366, 110032, 11, 0, 0), + (366, 130042, 0, 0, 0), + (366, 140003, 0, 0, 0), + (366, 160025, 0, 0, 0), + (366, 180030, 0, 0, 0), + (366, 190020, 0, 0, 0), + (366, 200004, 0, 0, 0), + (366, 230001, 0, 0, 0), + (366, 240001, 0, 0, 0), + (366, 250001, 0, 0, 0), + (366, 280018, 0, 0, 0), + (366, 290003, 0, 0, 0), + (366, 300001, 0, 0, 0), + (366, 320022, 0, 0, 0), + (366, 330003, 0, 0, 0), + (366, 340002, 0, 0, 0), + (366, 1000138, 0, 0, 0), + (366, 1100005, 0, 0, 0), + (366, 1200017, 0, 0, 0), + (367, 1001, 0, 0, 0), + (367, 2001, 0, 0, 0), + (367, 4001, 0, 0, 0), + (367, 5001, 0, 0, 0), + (367, 6001, 0, 0, 0), + (367, 10010, 10, 0, 0), + (367, 10010, 11, 0, 0), + (367, 11004, 10, 0, 0), + (367, 11004, 11, 0, 0), + (367, 12009, 10, 0, 0), + (367, 12029, 11, 0, 0), + (367, 15001, 0, 0, 0), + (367, 20108, 0, 0, 0), + (367, 22014, 0, 0, 0), + (367, 31153, 0, 0, 0), + (367, 36001, 0, 0, 0), + (367, 37001, 0, 0, 0), + (367, 40013, 0, 0, 0), + (367, 100002, 10, 0, 0), + (367, 100002, 11, 0, 0), + (367, 110044, 10, 0, 0), + (367, 110044, 11, 0, 0), + (367, 130042, 0, 0, 0), + (367, 140019, 0, 0, 0), + (367, 160025, 0, 0, 0), + (367, 180030, 0, 0, 0), + (367, 190020, 0, 0, 0), + (367, 200004, 0, 0, 0), + (367, 230001, 0, 0, 0), + (367, 240001, 0, 0, 0), + (367, 250001, 0, 0, 0), + (367, 280018, 0, 0, 0), + (367, 290001, 0, 0, 0), + (367, 300001, 0, 0, 0), + (367, 320022, 0, 0, 0), + (367, 330003, 0, 0, 0), + (367, 340002, 0, 0, 0), + (367, 1000138, 0, 0, 0), + (367, 1100005, 0, 0, 0), + (367, 1200017, 0, 0, 0), + (368, 1001, 0, 0, 0), + (368, 2001, 0, 0, 0), + (368, 4001, 0, 0, 0), + (368, 5001, 0, 0, 0), + (368, 6001, 0, 0, 0), + (368, 10010, 10, 0, 0), + (368, 10010, 11, 0, 0), + (368, 11004, 10, 0, 0), + (368, 11004, 11, 0, 0), + (368, 12006, 10, 0, 0), + (368, 12022, 11, 0, 0), + (368, 15001, 0, 0, 0), + (368, 20128, 0, 0, 0), + (368, 22009, 0, 0, 0), + (368, 31153, 0, 0, 0), + (368, 36001, 0, 0, 0), + (368, 37001, 0, 0, 0), + (368, 40023, 0, 0, 0), + (368, 100002, 10, 0, 0), + (368, 100002, 11, 0, 0), + (368, 110033, 10, 0, 0), + (368, 110033, 11, 0, 0), + (368, 130016, 0, 0, 0), + (368, 140009, 0, 0, 0), + (368, 160039, 0, 0, 0), + (368, 180023, 0, 0, 0), + (368, 190006, 0, 0, 0), + (368, 200023, 0, 0, 0), + (368, 230001, 0, 0, 0), + (368, 240005, 0, 0, 0), + (368, 250002, 0, 0, 0), + (368, 280023, 0, 0, 0), + (368, 290004, 0, 0, 0), + (368, 300001, 0, 0, 0), + (368, 320027, 0, 0, 0), + (368, 330043, 0, 0, 0), + (368, 340002, 0, 0, 0), + (368, 1000018, 0, 0, 0), + (368, 1100020, 0, 0, 0), + (368, 1200035, 0, 0, 0), + (369, 1001, 0, 0, 0), + (369, 2001, 0, 0, 0), + (369, 4001, 0, 0, 0), + (369, 5001, 0, 0, 0), + (369, 6001, 0, 0, 0), + (369, 10010, 10, 0, 0), + (369, 10010, 11, 0, 0), + (369, 11004, 10, 0, 0), + (369, 11004, 11, 0, 0), + (369, 12006, 10, 0, 0), + (369, 12022, 11, 0, 0), + (369, 15001, 0, 0, 0), + (369, 20119, 0, 0, 0), + (369, 22009, 0, 0, 0), + (369, 31153, 0, 0, 0), + (369, 36001, 0, 0, 0), + (369, 37001, 0, 0, 0), + (369, 40024, 0, 0, 0), + (369, 100002, 10, 0, 0), + (369, 100002, 11, 0, 0), + (369, 110032, 10, 0, 0), + (369, 110032, 11, 0, 0), + (369, 130022, 0, 0, 0), + (369, 140016, 0, 0, 0), + (369, 160006, 0, 0, 0), + (369, 180014, 0, 0, 0), + (369, 190016, 0, 0, 0), + (369, 200002, 0, 0, 0), + (369, 230001, 0, 0, 0), + (369, 240023, 0, 0, 0), + (369, 250026, 0, 0, 0), + (369, 280016, 0, 0, 0), + (369, 290004, 0, 0, 0), + (369, 300001, 0, 0, 0), + (369, 320020, 0, 0, 0), + (369, 330053, 0, 0, 0), + (369, 340002, 0, 0, 0), + (369, 1000070, 0, 0, 0), + (369, 1100001, 0, 0, 0), + (369, 1200034, 0, 0, 0), + (370, 1001, 0, 0, 0), + (370, 2001, 0, 0, 0), + (370, 4001, 0, 0, 0), + (370, 5001, 0, 0, 0), + (370, 6001, 0, 0, 0), + (370, 10002, 10, 0, 0), + (370, 10010, 11, 0, 0), + (370, 11004, 10, 0, 0), + (370, 11004, 11, 0, 0), + (370, 12006, 10, 0, 0), + (370, 12022, 11, 0, 0), + (370, 15001, 0, 0, 0), + (370, 20120, 0, 0, 0), + (370, 22009, 0, 0, 0), + (370, 31153, 0, 0, 0), + (370, 36001, 0, 0, 0), + (370, 37001, 0, 0, 0), + (370, 40025, 0, 0, 0), + (370, 100003, 10, 0, 0), + (370, 100003, 11, 0, 0), + (370, 110032, 10, 0, 0), + (370, 110032, 11, 0, 0), + (370, 130022, 0, 0, 0), + (370, 140016, 0, 0, 0), + (370, 160009, 0, 0, 0), + (370, 180014, 0, 0, 0), + (370, 190016, 0, 0, 0), + (370, 200002, 0, 0, 0), + (370, 230001, 0, 0, 0), + (370, 240023, 0, 0, 0), + (370, 250026, 0, 0, 0), + (370, 280016, 0, 0, 0), + (370, 290004, 0, 0, 0), + (370, 300001, 0, 0, 0), + (370, 320020, 0, 0, 0), + (370, 330053, 0, 0, 0), + (370, 340002, 0, 0, 0), + (370, 1000121, 0, 0, 0), + (370, 1100001, 0, 0, 0), + (370, 1200034, 0, 0, 0), + (371, 1001, 0, 0, 0), + (371, 2001, 0, 0, 0), + (371, 4001, 0, 0, 0), + (371, 5001, 0, 0, 0), + (371, 6001, 0, 0, 0), + (371, 10002, 10, 0, 0), + (371, 10010, 11, 0, 0), + (371, 11004, 10, 0, 0), + (371, 11004, 11, 0, 0), + (371, 12006, 10, 0, 0), + (371, 12009, 11, 0, 0), + (371, 15001, 0, 0, 0), + (371, 20126, 0, 0, 0), + (371, 22009, 0, 0, 0), + (371, 31153, 0, 0, 0), + (371, 36001, 0, 0, 0), + (371, 37001, 0, 0, 0), + (371, 40026, 0, 0, 0), + (371, 100002, 10, 0, 0), + (371, 100002, 11, 0, 0), + (371, 110027, 10, 0, 0), + (371, 110027, 11, 0, 0), + (371, 130022, 0, 0, 0), + (371, 140009, 0, 0, 0), + (371, 160037, 0, 0, 0), + (371, 180020, 0, 0, 0), + (371, 190022, 0, 0, 0), + (371, 200020, 0, 0, 0), + (371, 230001, 0, 0, 0), + (371, 240001, 0, 0, 0), + (371, 250002, 0, 0, 0), + (371, 280027, 0, 0, 0), + (371, 290004, 0, 0, 0), + (371, 300001, 0, 0, 0), + (371, 320024, 0, 0, 0), + (371, 330018, 0, 0, 0), + (371, 340002, 0, 0, 0), + (371, 1000017, 0, 0, 0), + (371, 1100098, 0, 0, 0), + (371, 1200019, 0, 0, 0), + (372, 1001, 0, 0, 0), + (372, 2001, 0, 0, 0), + (372, 4001, 0, 0, 0), + (372, 5001, 0, 0, 0), + (372, 6001, 0, 0, 0), + (372, 10010, 10, 0, 0), + (372, 10010, 11, 0, 0), + (372, 11004, 10, 0, 0), + (372, 11004, 11, 0, 0), + (372, 12006, 10, 0, 0), + (372, 12009, 11, 0, 0), + (372, 15001, 0, 0, 0), + (372, 20129, 0, 0, 0), + (372, 22009, 0, 0, 0), + (372, 25006, 0, 0, 0), + (372, 31153, 0, 0, 0), + (372, 36001, 0, 0, 0), + (372, 37001, 0, 0, 0), + (372, 40049, 0, 0, 0), + (372, 100002, 10, 0, 0), + (372, 100002, 11, 0, 0), + (372, 110033, 10, 0, 0), + (372, 110033, 11, 0, 0), + (372, 130016, 0, 0, 0), + (372, 140009, 0, 0, 0), + (372, 160040, 0, 0, 0), + (372, 180023, 0, 0, 0), + (372, 190006, 0, 0, 0), + (372, 200023, 0, 0, 0), + (372, 230001, 0, 0, 0), + (372, 240006, 0, 0, 0), + (372, 250002, 0, 0, 0), + (372, 280028, 0, 0, 0), + (372, 290003, 0, 0, 0), + (372, 300001, 0, 0, 0), + (372, 320027, 0, 0, 0), + (372, 330043, 0, 0, 0), + (372, 340002, 0, 0, 0), + (372, 1000051, 0, 0, 0), + (372, 1100034, 0, 0, 0), + (372, 1200035, 0, 0, 0), + (373, 1001, 0, 0, 0), + (373, 2001, 0, 0, 0), + (373, 4001, 0, 0, 0), + (373, 5001, 0, 0, 0), + (373, 6001, 0, 0, 0), + (373, 10002, 10, 0, 0), + (373, 10010, 11, 0, 0), + (373, 11004, 10, 0, 0), + (373, 11004, 11, 0, 0), + (373, 12006, 10, 0, 0), + (373, 12022, 11, 0, 0), + (373, 13010, 10, 0, 0), + (373, 15001, 0, 0, 0), + (373, 20133, 0, 0, 0), + (373, 22008, 0, 0, 0), + (373, 31153, 0, 0, 0), + (373, 36001, 0, 0, 0), + (373, 37001, 0, 0, 0), + (373, 40033, 0, 0, 0), + (373, 100132, 10, 0, 0), + (373, 100132, 11, 0, 0), + (373, 110045, 10, 0, 0), + (373, 110045, 11, 0, 0), + (373, 130022, 0, 0, 0), + (373, 140004, 0, 0, 0), + (373, 160073, 0, 0, 0), + (373, 180015, 0, 0, 0), + (373, 190017, 0, 0, 0), + (373, 200029, 0, 0, 0), + (373, 230001, 0, 0, 0), + (373, 240005, 0, 0, 0), + (373, 250002, 0, 0, 0), + (373, 280036, 0, 0, 0), + (373, 290004, 0, 0, 0), + (373, 300001, 0, 0, 0), + (373, 320004, 0, 0, 0), + (373, 330066, 0, 0, 0), + (373, 340002, 0, 0, 0), + (373, 1000120, 0, 0, 0), + (373, 1100044, 0, 0, 0), + (373, 1200015, 0, 0, 0), + (374, 1001, 0, 0, 0), + (374, 2001, 0, 0, 0), + (374, 4001, 0, 0, 0), + (374, 5001, 0, 0, 0), + (374, 6001, 0, 0, 0), + (374, 10002, 10, 0, 0), + (374, 10009, 11, 0, 0), + (374, 11004, 10, 0, 0), + (374, 11004, 11, 0, 0), + (374, 12006, 10, 0, 0), + (374, 12022, 11, 0, 0), + (374, 15001, 0, 0, 0), + (374, 20140, 0, 0, 0), + (374, 22009, 0, 0, 0), + (374, 31153, 0, 0, 0), + (374, 36001, 0, 0, 0), + (374, 37001, 0, 0, 0), + (374, 40042, 0, 0, 0), + (374, 100002, 10, 0, 0), + (374, 100002, 11, 0, 0), + (374, 110027, 10, 1, 1), + (374, 110027, 11, 1, 1), + (374, 130033, 0, 0, 0), + (374, 140011, 0, 0, 0), + (374, 160012, 0, 0, 0), + (374, 180014, 0, 0, 0), + (374, 190016, 0, 0, 0), + (374, 200024, 0, 0, 0), + (374, 230001, 0, 0, 0), + (374, 240001, 0, 0, 0), + (374, 250002, 0, 0, 0), + (374, 280016, 0, 0, 0), + (374, 290004, 0, 0, 0), + (374, 300002, 0, 0, 0), + (374, 320020, 0, 0, 0), + (374, 330008, 0, 0, 0), + (374, 340002, 0, 0, 0), + (374, 1000122, 0, 0, 0), + (374, 1100001, 0, 0, 0), + (374, 1200034, 0, 0, 0), + (375, 1001, 0, 0, 0), + (375, 2001, 0, 0, 0), + (375, 4001, 0, 0, 0), + (375, 5001, 0, 0, 0), + (375, 6001, 0, 0, 0), + (375, 10001, 11, 0, 0), + (375, 10021, 10, 0, 0), + (375, 11010, 10, 0, 0), + (375, 11010, 11, 0, 0), + (375, 12009, 10, 0, 0), + (375, 12030, 11, 0, 0), + (375, 13007, 10, 0, 0), + (375, 13009, 11, 0, 0), + (375, 15001, 0, 0, 0), + (375, 20106, 0, 0, 0), + (375, 22014, 0, 0, 0), + (375, 31153, 0, 0, 0), + (375, 36001, 0, 0, 0), + (375, 37001, 0, 0, 0), + (375, 40008, 0, 0, 0), + (375, 100002, 10, 0, 0), + (375, 100002, 11, 0, 0), + (375, 110084, 10, 0, 0), + (375, 110084, 11, 0, 0), + (375, 130026, 0, 0, 0), + (375, 140011, 0, 0, 0), + (375, 160026, 0, 0, 0), + (375, 180018, 0, 0, 0), + (375, 190077, 0, 0, 0), + (375, 200066, 0, 0, 0), + (375, 230001, 0, 0, 0), + (375, 240001, 0, 0, 0), + (375, 250001, 0, 0, 0), + (375, 280030, 0, 0, 0), + (375, 290001, 0, 0, 0), + (375, 300001, 0, 0, 0), + (375, 320098, 0, 0, 0), + (375, 330035, 0, 0, 0), + (375, 340002, 0, 0, 0), + (375, 1000096, 0, 0, 0), + (375, 1100119, 0, 0, 0), + (375, 1200048, 0, 0, 0), + (377, 1001, 0, 0, 0), + (377, 2001, 0, 0, 0), + (377, 4001, 0, 0, 0), + (377, 5001, 0, 0, 0), + (377, 6001, 0, 0, 0), + (377, 10001, 11, 0, 0), + (377, 10021, 10, 0, 0), + (377, 11010, 10, 0, 0), + (377, 11010, 11, 0, 0), + (377, 12009, 10, 0, 0), + (377, 12027, 11, 0, 0), + (377, 13007, 11, 0, 0), + (377, 13008, 10, 0, 0), + (377, 15001, 0, 0, 0), + (377, 20113, 0, 0, 0), + (377, 22009, 0, 0, 0), + (377, 31153, 0, 0, 0), + (377, 36001, 0, 0, 0), + (377, 37001, 0, 0, 0), + (377, 40016, 0, 0, 0), + (377, 100002, 10, 0, 0), + (377, 100002, 11, 0, 0), + (377, 110084, 10, 0, 0), + (377, 110084, 11, 0, 0), + (377, 130033, 0, 0, 0), + (377, 140005, 0, 0, 0), + (377, 160006, 0, 0, 0), + (377, 180014, 0, 0, 0), + (377, 190016, 0, 0, 0), + (377, 200002, 0, 0, 0), + (377, 230001, 0, 0, 0), + (377, 240001, 0, 0, 0), + (377, 250002, 0, 0, 0), + (377, 280024, 0, 0, 0), + (377, 290004, 0, 0, 0), + (377, 300001, 0, 0, 0), + (377, 320020, 0, 0, 0), + (377, 330056, 0, 0, 0), + (377, 340002, 0, 0, 0), + (377, 1000070, 0, 0, 0), + (377, 1100022, 0, 0, 0), + (377, 1200034, 0, 0, 0), + (378, 1001, 0, 0, 0), + (378, 2001, 0, 0, 0), + (378, 4001, 0, 0, 0), + (378, 5001, 0, 0, 0), + (378, 6001, 0, 0, 0), + (378, 10001, 11, 0, 0), + (378, 10021, 10, 0, 0), + (378, 11010, 10, 0, 0), + (378, 11010, 11, 0, 0), + (378, 12031, 11, 0, 0), + (378, 12033, 10, 0, 0), + (378, 13010, 11, 0, 0), + (378, 13011, 10, 0, 0), + (378, 15001, 0, 0, 0), + (378, 20127, 0, 0, 0), + (378, 22009, 0, 0, 0), + (378, 31153, 0, 0, 0), + (378, 36001, 0, 0, 0), + (378, 37001, 0, 0, 0), + (378, 40015, 0, 0, 0), + (378, 100002, 10, 0, 0), + (378, 100002, 11, 0, 0), + (378, 110084, 10, 0, 0), + (378, 110084, 11, 0, 0), + (378, 130033, 0, 0, 0), + (378, 140006, 0, 0, 0), + (378, 160001, 0, 0, 0), + (378, 180049, 0, 0, 0), + (378, 190013, 0, 0, 0), + (378, 200057, 0, 0, 0), + (378, 230001, 0, 0, 0), + (378, 240006, 0, 0, 0), + (378, 250002, 0, 0, 0), + (378, 280045, 0, 0, 0), + (378, 290004, 0, 0, 0), + (378, 300001, 0, 0, 0), + (378, 320033, 0, 0, 0), + (378, 330034, 0, 0, 0), + (378, 340002, 0, 0, 0), + (378, 1000060, 0, 0, 0), + (378, 1100113, 0, 0, 0), + (378, 1200013, 0, 0, 0), + (379, 1001, 0, 0, 0), + (379, 2001, 0, 0, 0), + (379, 4001, 0, 0, 0), + (379, 5001, 0, 0, 0), + (379, 6001, 0, 0, 0), + (379, 10001, 11, 0, 0), + (379, 10021, 10, 0, 0), + (379, 11010, 10, 0, 0), + (379, 11010, 11, 0, 0), + (379, 12008, 10, 0, 0), + (379, 12027, 11, 0, 0), + (379, 13007, 11, 0, 0), + (379, 13008, 10, 0, 0), + (379, 15001, 0, 0, 0), + (379, 20103, 0, 0, 0), + (379, 22014, 0, 0, 0), + (379, 31153, 0, 0, 0), + (379, 36001, 0, 0, 0), + (379, 37001, 0, 0, 0), + (379, 40005, 0, 0, 0), + (379, 100002, 10, 0, 0), + (379, 100002, 11, 0, 0), + (379, 110084, 10, 0, 0), + (379, 110084, 11, 0, 0), + (379, 130034, 0, 0, 0), + (379, 140007, 0, 0, 0), + (379, 160025, 0, 0, 0), + (379, 180030, 0, 0, 0), + (379, 190020, 0, 0, 0), + (379, 200004, 0, 0, 0), + (379, 230001, 0, 0, 0), + (379, 240006, 0, 0, 0), + (379, 250001, 0, 0, 0), + (379, 280018, 0, 0, 0), + (379, 290002, 0, 0, 0), + (379, 300001, 0, 0, 0), + (379, 320087, 0, 0, 0), + (379, 330035, 0, 0, 0), + (379, 340002, 0, 0, 0), + (379, 1000137, 0, 0, 0), + (379, 1100005, 0, 0, 0), + (379, 1200017, 0, 0, 0), + (383, 1001, 0, 0, 0), + (383, 2001, 0, 0, 0), + (383, 4001, 0, 0, 0), + (383, 5001, 0, 0, 0), + (383, 6001, 0, 0, 0), + (383, 10010, 10, 0, 0), + (383, 10010, 11, 0, 0), + (383, 11004, 10, 0, 0), + (383, 11004, 11, 0, 0), + (383, 12006, 10, 0, 0), + (383, 12009, 11, 0, 0), + (383, 15001, 0, 0, 0), + (383, 20129, 0, 0, 0), + (383, 22009, 0, 0, 0), + (383, 31153, 0, 0, 0), + (383, 36001, 0, 0, 0), + (383, 37001, 0, 0, 0), + (383, 40049, 0, 0, 0), + (383, 100002, 10, 0, 0), + (383, 100002, 11, 0, 0), + (383, 110104, 10, 0, 0), + (383, 110109, 11, 0, 0), + (383, 130033, 0, 0, 0), + (383, 140011, 0, 0, 0), + (383, 160025, 0, 0, 0), + (383, 180030, 0, 0, 0), + (383, 190020, 0, 0, 0), + (383, 200004, 0, 0, 0), + (383, 230001, 0, 0, 0), + (383, 240006, 0, 0, 0), + (383, 250001, 0, 0, 0), + (383, 280041, 0, 0, 0), + (383, 290002, 0, 0, 0), + (383, 300001, 0, 0, 0), + (383, 320022, 0, 0, 0), + (383, 330018, 0, 0, 0), + (383, 340002, 0, 0, 0), + (383, 1000138, 0, 0, 0), + (383, 1100005, 0, 0, 0), + (383, 1200017, 0, 0, 0), + (384, 1001, 0, 0, 0), + (384, 2001, 0, 0, 0), + (384, 4001, 0, 0, 0), + (384, 5001, 0, 0, 0), + (384, 6001, 0, 0, 0), + (384, 10002, 10, 0, 0), + (384, 10010, 11, 0, 0), + (384, 11009, 10, 0, 0), + (384, 11009, 11, 0, 0), + (384, 12007, 10, 0, 0), + (384, 12029, 11, 0, 0), + (384, 13008, 10, 0, 0), + (384, 15001, 0, 0, 0), + (384, 20108, 0, 0, 0), + (384, 22014, 0, 0, 0), + (384, 29002, 0, 0, 0), + (384, 30005, 0, 0, 0), + (384, 31153, 0, 0, 0), + (384, 36001, 0, 0, 0), + (384, 37001, 0, 0, 0), + (384, 40010, 0, 0, 0), + (384, 100002, 10, 0, 0), + (384, 100002, 11, 0, 0), + (384, 110083, 10, 0, 0), + (384, 110084, 11, 0, 0), + (384, 130034, 0, 0, 0), + (384, 140017, 0, 0, 0), + (384, 160027, 0, 0, 0), + (384, 180030, 0, 0, 0), + (384, 190020, 0, 0, 0), + (384, 200004, 0, 0, 0), + (384, 230001, 0, 0, 0), + (384, 240006, 0, 0, 0), + (384, 250001, 0, 0, 0), + (384, 280041, 0, 0, 0), + (384, 290002, 0, 0, 0), + (384, 300002, 0, 0, 0), + (384, 320022, 0, 0, 0), + (384, 330020, 0, 0, 0), + (384, 340002, 0, 0, 0), + (384, 1000138, 0, 0, 0), + (384, 1100101, 0, 0, 0), + (384, 1200038, 0, 0, 0), + (385, 1001, 0, 0, 0), + (385, 2001, 0, 0, 0), + (385, 4001, 0, 0, 0), + (385, 5001, 0, 0, 0), + (385, 6001, 0, 0, 0), + (385, 10011, 10, 0, 0), + (385, 10011, 11, 0, 0), + (385, 11004, 10, 0, 0), + (385, 11004, 11, 0, 0), + (385, 12009, 10, 0, 0), + (385, 12029, 11, 0, 0), + (385, 15001, 0, 0, 0), + (385, 20106, 0, 0, 0), + (385, 22014, 0, 0, 0), + (385, 31153, 0, 0, 0), + (385, 36001, 0, 0, 0), + (385, 37001, 0, 0, 0), + (385, 40008, 0, 0, 0), + (385, 100002, 10, 0, 0), + (385, 100002, 11, 0, 0), + (385, 110082, 10, 0, 0), + (385, 110082, 11, 0, 0), + (385, 130034, 0, 0, 0), + (385, 140003, 0, 0, 0), + (385, 160025, 0, 0, 0), + (385, 180030, 0, 0, 0), + (385, 190020, 0, 0, 0), + (385, 200004, 0, 0, 0), + (385, 230001, 0, 0, 0), + (385, 240001, 0, 0, 0), + (385, 250001, 0, 0, 0), + (385, 280041, 0, 0, 0), + (385, 290002, 0, 0, 0), + (385, 300001, 0, 0, 0), + (385, 320022, 0, 0, 0), + (385, 330053, 0, 0, 0), + (385, 340002, 0, 0, 0), + (385, 1000138, 0, 0, 0), + (385, 1100005, 0, 0, 0), + (385, 1200017, 0, 0, 0), + (386, 1001, 0, 0, 0), + (386, 2001, 0, 0, 0), + (386, 4001, 0, 0, 0), + (386, 5001, 0, 0, 0), + (386, 6001, 0, 0, 0), + (386, 10009, 11, 0, 0), + (386, 10010, 10, 0, 0), + (386, 11004, 10, 0, 0), + (386, 11004, 11, 0, 0), + (386, 12009, 11, 0, 0), + (386, 12010, 10, 0, 0), + (386, 15001, 0, 0, 0), + (386, 20127, 0, 0, 0), + (386, 22009, 0, 0, 0), + (386, 31153, 0, 0, 0), + (386, 36001, 0, 0, 0), + (386, 37001, 0, 0, 0), + (386, 40015, 0, 0, 0), + (386, 100002, 10, 0, 0), + (386, 100002, 11, 0, 0), + (386, 110082, 10, 0, 0), + (386, 110082, 11, 0, 0), + (386, 130033, 0, 0, 0), + (386, 140001, 0, 0, 0), + (386, 160012, 0, 0, 0), + (386, 180003, 0, 0, 0), + (386, 190016, 0, 0, 0), + (386, 200002, 0, 0, 0), + (386, 230001, 0, 0, 0), + (386, 240001, 0, 0, 0), + (386, 250002, 0, 0, 0), + (386, 280024, 0, 0, 0), + (386, 290004, 0, 0, 0), + (386, 300001, 0, 0, 0), + (386, 320020, 0, 0, 0), + (386, 330066, 0, 0, 0), + (386, 340002, 0, 0, 0), + (386, 1000043, 0, 0, 0), + (386, 1100001, 0, 0, 0), + (386, 1200034, 0, 0, 0), + (387, 1001, 0, 0, 0), + (387, 2001, 0, 0, 0), + (387, 4001, 0, 0, 0), + (387, 5001, 0, 0, 0), + (387, 6001, 0, 0, 0), + (387, 10002, 10, 0, 0), + (387, 10010, 11, 0, 0), + (387, 11004, 10, 0, 0), + (387, 11004, 11, 0, 0), + (387, 12006, 10, 0, 0), + (387, 12009, 11, 0, 0), + (387, 15001, 0, 0, 0), + (387, 20121, 0, 0, 0), + (387, 22009, 0, 0, 0), + (387, 31153, 0, 0, 0), + (387, 36001, 0, 0, 0), + (387, 37001, 0, 0, 0), + (387, 40030, 0, 0, 0), + (387, 100002, 10, 0, 0), + (387, 100002, 11, 0, 0), + (387, 110104, 10, 0, 0), + (387, 110109, 11, 0, 0), + (387, 130033, 0, 0, 0), + (387, 140016, 0, 0, 0), + (387, 160012, 0, 0, 0), + (387, 180003, 0, 0, 0), + (387, 190016, 0, 0, 0), + (387, 200032, 0, 0, 0), + (387, 230001, 0, 0, 0), + (387, 240006, 0, 0, 0), + (387, 250002, 0, 0, 0), + (387, 280016, 0, 0, 0), + (387, 290004, 0, 0, 0), + (387, 320020, 0, 0, 0), + (387, 330044, 0, 0, 0), + (387, 340002, 0, 0, 0), + (387, 1000122, 0, 0, 0), + (387, 1100001, 0, 0, 0), + (387, 1200023, 0, 0, 0), + (388, 1001, 0, 0, 0), + (388, 2001, 0, 0, 0), + (388, 4001, 0, 0, 0), + (388, 5001, 0, 0, 0), + (388, 6001, 0, 0, 0), + (388, 10010, 10, 0, 0), + (388, 10010, 11, 0, 0), + (388, 11004, 10, 0, 0), + (388, 11004, 11, 0, 0), + (388, 12009, 10, 0, 0), + (388, 12029, 11, 0, 0), + (388, 15001, 0, 0, 0), + (388, 20109, 0, 0, 0), + (388, 22014, 0, 0, 0), + (388, 31153, 0, 0, 0), + (388, 36001, 0, 0, 0), + (388, 37001, 0, 0, 0), + (388, 40011, 0, 0, 0), + (388, 100002, 10, 0, 0), + (388, 100002, 11, 0, 0), + (388, 110104, 10, 0, 0), + (388, 110109, 11, 0, 0), + (388, 130034, 0, 0, 0), + (388, 140016, 0, 0, 0), + (388, 160025, 0, 0, 0), + (388, 180030, 0, 0, 0), + (388, 190020, 0, 0, 0), + (388, 200031, 0, 0, 0), + (388, 230001, 0, 0, 0), + (388, 240006, 0, 0, 0), + (388, 250001, 0, 0, 0), + (388, 280041, 0, 0, 0), + (388, 290002, 0, 0, 0), + (388, 300001, 0, 0, 0), + (388, 320022, 0, 0, 0), + (388, 330065, 0, 0, 0), + (388, 340002, 0, 0, 0), + (388, 1000136, 0, 0, 0), + (388, 1100005, 0, 0, 0), + (388, 1200038, 0, 0, 0), + (389, 1001, 0, 0, 0), + (389, 2001, 0, 0, 0), + (389, 4001, 0, 0, 0), + (389, 5001, 0, 0, 0), + (389, 6001, 0, 0, 0), + (389, 10002, 10, 0, 0), + (389, 10010, 11, 0, 0), + (389, 11004, 10, 0, 0), + (389, 11004, 11, 0, 0), + (389, 12006, 10, 0, 0), + (389, 12022, 11, 0, 0), + (389, 15001, 0, 0, 0), + (389, 20132, 0, 0, 0), + (389, 22008, 0, 0, 0), + (389, 31153, 0, 0, 0), + (389, 36001, 0, 0, 0), + (389, 37001, 0, 0, 0), + (389, 40032, 0, 0, 0), + (389, 100132, 10, 0, 0), + (389, 100132, 11, 0, 0), + (389, 110104, 10, 0, 0), + (389, 110109, 11, 0, 0), + (389, 130044, 0, 0, 0), + (389, 140011, 0, 0, 0), + (389, 160054, 0, 0, 0), + (389, 180016, 0, 0, 0), + (389, 190018, 0, 0, 0), + (389, 200006, 0, 0, 0), + (389, 230001, 0, 0, 0), + (389, 240006, 0, 0, 0), + (389, 250003, 0, 0, 0), + (389, 280037, 0, 0, 0), + (389, 290003, 0, 0, 0), + (389, 300001, 0, 0, 0), + (389, 320003, 0, 0, 0), + (389, 330034, 0, 0, 0), + (389, 340002, 0, 0, 0), + (389, 1000117, 0, 0, 0), + (389, 1100002, 0, 0, 0), + (389, 1200033, 0, 0, 0), + (390, 1001, 0, 0, 0), + (390, 2001, 0, 0, 0), + (390, 4001, 0, 0, 0), + (390, 5001, 0, 0, 0), + (390, 6001, 0, 0, 0), + (390, 10001, 10, 0, 0), + (390, 10004, 11, 0, 0), + (390, 11009, 10, 0, 0), + (390, 11009, 11, 0, 0), + (390, 12007, 10, 0, 0), + (390, 12029, 11, 0, 0), + (390, 15001, 0, 0, 0), + (390, 20113, 0, 0, 0), + (390, 22009, 0, 0, 0), + (390, 31153, 0, 0, 0), + (390, 36001, 0, 0, 0), + (390, 37001, 0, 0, 0), + (390, 40016, 0, 0, 0), + (390, 100002, 10, 0, 0), + (390, 100002, 11, 0, 0), + (390, 110104, 10, 0, 0), + (390, 110109, 11, 0, 0), + (390, 130034, 0, 0, 0), + (390, 140019, 0, 0, 0), + (390, 160012, 0, 0, 0), + (390, 180014, 0, 0, 0), + (390, 190016, 0, 0, 0), + (390, 200002, 0, 0, 0), + (390, 230001, 0, 0, 0), + (390, 240006, 0, 0, 0), + (390, 250002, 0, 0, 0), + (390, 280024, 0, 0, 0), + (390, 290004, 0, 0, 0), + (390, 300001, 0, 0, 0), + (390, 320020, 0, 0, 0), + (390, 330018, 0, 0, 0), + (390, 340002, 0, 0, 0), + (390, 1000074, 0, 0, 0), + (390, 1100025, 0, 0, 0), + (390, 1200023, 0, 0, 0), + (391, 1001, 0, 0, 0), + (391, 2001, 0, 0, 0), + (391, 4001, 0, 0, 0), + (391, 5001, 0, 0, 0), + (391, 6001, 0, 0, 0), + (391, 10009, 11, 0, 0), + (391, 10010, 10, 0, 0), + (391, 11009, 10, 0, 0), + (391, 11009, 11, 0, 0), + (391, 12007, 10, 0, 0), + (391, 12029, 11, 0, 0), + (391, 13006, 10, 0, 0), + (391, 15001, 0, 0, 0), + (391, 20103, 0, 0, 0), + (391, 22014, 0, 0, 0), + (391, 31153, 0, 0, 0), + (391, 36001, 0, 0, 0), + (391, 37001, 0, 0, 0), + (391, 40005, 0, 0, 0), + (391, 100002, 10, 0, 0), + (391, 100002, 11, 0, 0), + (391, 110104, 10, 0, 0), + (391, 110109, 11, 0, 0), + (391, 130034, 0, 0, 0), + (391, 140007, 0, 0, 0), + (391, 160025, 0, 0, 0), + (391, 180030, 0, 0, 0), + (391, 190020, 0, 0, 0), + (391, 200004, 0, 0, 0), + (391, 230001, 0, 0, 0), + (391, 240006, 0, 0, 0), + (391, 250001, 0, 0, 0), + (391, 280041, 0, 0, 0), + (391, 290002, 0, 0, 0), + (391, 300001, 0, 0, 0), + (391, 320087, 0, 0, 0), + (391, 330020, 0, 0, 0), + (391, 340002, 0, 0, 0), + (391, 1000138, 0, 0, 0), + (391, 1100101, 0, 0, 0), + (391, 1200017, 0, 0, 0), + (392, 1001, 0, 0, 0), + (392, 2001, 0, 0, 0), + (392, 4001, 0, 0, 0), + (392, 5001, 0, 0, 0), + (392, 6001, 0, 0, 0), + (392, 10002, 10, 0, 0), + (392, 10010, 11, 0, 0), + (392, 11009, 10, 0, 0), + (392, 11009, 11, 0, 0), + (392, 12008, 10, 0, 0), + (392, 12029, 11, 0, 0), + (392, 13007, 10, 0, 0), + (392, 15001, 0, 0, 0), + (392, 20131, 0, 0, 0), + (392, 22008, 0, 0, 0), + (392, 31153, 0, 0, 0), + (392, 36001, 0, 0, 0), + (392, 37001, 0, 0, 0), + (392, 40034, 0, 0, 0), + (392, 100132, 10, 0, 0), + (392, 100132, 11, 0, 0), + (392, 110084, 10, 0, 0), + (392, 110084, 11, 0, 0), + (392, 130048, 0, 0, 0), + (392, 140013, 0, 0, 0), + (392, 160048, 0, 0, 0), + (392, 180022, 0, 0, 0), + (392, 190068, 0, 0, 0), + (392, 200022, 0, 0, 0), + (392, 230001, 0, 0, 0), + (392, 240006, 0, 0, 0), + (392, 250003, 0, 0, 0), + (392, 280022, 0, 0, 0), + (392, 290004, 0, 0, 0), + (392, 300001, 0, 0, 0), + (392, 320026, 0, 0, 0), + (392, 330053, 0, 0, 0), + (392, 340002, 0, 0, 0), + (392, 1000007, 0, 0, 0), + (392, 1100019, 0, 0, 0), + (392, 1200021, 0, 0, 0), + (393, 1001, 0, 0, 0), + (393, 2001, 0, 0, 0), + (393, 4001, 0, 0, 0), + (393, 5001, 0, 0, 0), + (393, 6001, 0, 0, 0), + (393, 10011, 10, 0, 0), + (393, 10011, 11, 0, 0), + (393, 11009, 10, 0, 0), + (393, 11009, 11, 0, 0), + (393, 12008, 10, 0, 0), + (393, 12027, 11, 0, 0), + (393, 13008, 10, 0, 0), + (393, 15001, 0, 0, 0), + (393, 20105, 0, 0, 0), + (393, 22014, 0, 0, 0), + (393, 31153, 0, 0, 0), + (393, 36001, 0, 0, 0), + (393, 37001, 0, 0, 0), + (393, 40007, 0, 0, 0), + (393, 100002, 10, 0, 0), + (393, 100002, 11, 0, 0), + (393, 110104, 10, 0, 0), + (393, 110109, 11, 0, 0), + (393, 130026, 0, 0, 0), + (393, 140011, 0, 0, 0), + (393, 160027, 0, 0, 0), + (393, 180034, 0, 0, 0), + (393, 190020, 0, 0, 0), + (393, 200004, 0, 0, 0), + (393, 230001, 0, 0, 0), + (393, 240006, 0, 0, 0), + (393, 250001, 0, 0, 0), + (393, 280041, 0, 0, 0), + (393, 290002, 0, 0, 0), + (393, 300007, 0, 0, 0), + (393, 320022, 0, 0, 0), + (393, 330034, 0, 0, 0), + (393, 340002, 0, 0, 0), + (393, 1000138, 0, 0, 0), + (393, 1100101, 0, 0, 0), + (393, 1200038, 0, 0, 0), + (394, 1001, 0, 0, 0), + (394, 2001, 0, 0, 0), + (394, 4001, 0, 0, 0), + (394, 5001, 0, 0, 0), + (394, 6001, 0, 0, 0), + (394, 10002, 11, 0, 0), + (394, 10022, 10, 0, 0), + (394, 11009, 10, 0, 0), + (394, 11009, 11, 0, 0), + (394, 12007, 10, 0, 0), + (394, 12023, 11, 0, 0), + (394, 13006, 11, 0, 0), + (394, 13008, 10, 0, 0), + (394, 15001, 0, 0, 0), + (394, 20120, 0, 0, 0), + (394, 22009, 0, 0, 0), + (394, 30003, 0, 0, 0), + (394, 31153, 0, 0, 0), + (394, 36001, 0, 0, 0), + (394, 37001, 0, 0, 0), + (394, 40025, 0, 0, 0), + (394, 100003, 10, 0, 0), + (394, 100003, 11, 0, 0), + (394, 110083, 10, 0, 0), + (394, 110084, 11, 0, 0), + (394, 130033, 0, 0, 0), + (394, 140011, 0, 0, 0), + (394, 160009, 0, 0, 0), + (394, 180014, 0, 0, 0), + (394, 190016, 0, 0, 0), + (394, 200002, 0, 0, 0), + (394, 230001, 0, 0, 0), + (394, 240006, 0, 0, 0), + (394, 250002, 0, 0, 0), + (394, 280016, 0, 0, 0), + (394, 290004, 0, 0, 0), + (394, 300001, 0, 0, 0), + (394, 320020, 0, 0, 0), + (394, 330053, 0, 0, 0), + (394, 340002, 0, 0, 0), + (394, 1000121, 0, 0, 0), + (394, 1100001, 0, 0, 0), + (394, 1200034, 0, 0, 0), + (395, 1001, 0, 0, 0), + (395, 2001, 0, 0, 0), + (395, 4001, 0, 0, 0), + (395, 5001, 0, 0, 0), + (395, 6001, 0, 0, 0), + (395, 10021, 10, 0, 0), + (395, 10021, 11, 0, 0), + (395, 11008, 10, 0, 0), + (395, 11008, 11, 0, 0), + (395, 12037, 10, 0, 0), + (395, 12039, 11, 0, 0), + (395, 15001, 0, 0, 0), + (395, 20112, 0, 0, 0), + (395, 22014, 0, 0, 0), + (395, 31151, 0, 0, 0), + (395, 36001, 0, 0, 0), + (395, 37001, 0, 0, 0), + (395, 40004, 0, 0, 0), + (395, 100005, 10, 0, 0), + (395, 100005, 11, 0, 0), + (395, 110104, 10, 0, 0), + (395, 110109, 11, 0, 0), + (395, 130036, 0, 0, 0), + (395, 140020, 0, 0, 0), + (395, 160017, 0, 0, 0), + (395, 180013, 0, 0, 0), + (395, 190015, 0, 0, 0), + (395, 200051, 0, 0, 0), + (395, 230002, 0, 0, 0), + (395, 240006, 0, 0, 0), + (395, 250006, 0, 0, 0), + (395, 280006, 0, 0, 0), + (395, 290005, 0, 0, 0), + (395, 300008, 0, 0, 0), + (395, 320031, 0, 0, 0), + (395, 330027, 0, 0, 0), + (395, 340003, 0, 0, 0), + (395, 1000025, 0, 0, 0), + (395, 1100027, 0, 0, 0), + (395, 1200024, 0, 0, 0), + (396, 1001, 0, 0, 0), + (396, 2001, 0, 0, 0), + (396, 4001, 0, 0, 0), + (396, 5001, 0, 0, 0), + (396, 6001, 0, 0, 0), + (396, 10030, 10, 0, 0), + (396, 10030, 11, 0, 0), + (396, 11008, 10, 0, 0), + (396, 11008, 11, 0, 0), + (396, 12038, 11, 0, 0), + (396, 12040, 10, 0, 0), + (396, 14003, 11, 0, 0), + (396, 15001, 0, 0, 0), + (396, 20113, 0, 0, 0), + (396, 22009, 0, 0, 0), + (396, 31153, 0, 0, 0), + (396, 36001, 0, 0, 0), + (396, 37001, 0, 0, 0), + (396, 40016, 0, 0, 0), + (396, 100129, 10, 0, 0), + (396, 100129, 11, 0, 0), + (396, 110080, 10, 0, 0), + (396, 110109, 11, 0, 0), + (396, 130046, 0, 0, 0), + (396, 140019, 0, 0, 0), + (396, 160017, 0, 0, 0), + (396, 180013, 0, 0, 0), + (396, 190015, 0, 0, 0), + (396, 200051, 0, 0, 0), + (396, 230004, 0, 0, 0), + (396, 240006, 0, 0, 0), + (396, 250006, 0, 0, 0), + (396, 280006, 0, 0, 0), + (396, 290005, 0, 0, 0), + (396, 300008, 0, 0, 0), + (396, 320031, 0, 0, 0), + (396, 330027, 0, 0, 0), + (396, 340003, 0, 0, 0), + (396, 1000025, 0, 0, 0), + (396, 1100027, 0, 0, 0), + (396, 1200024, 0, 0, 0), + (397, 1001, 0, 0, 0), + (397, 2001, 0, 0, 0), + (397, 4001, 0, 0, 0), + (397, 5001, 0, 0, 0), + (397, 6001, 0, 0, 0), + (397, 10030, 10, 0, 0), + (397, 10030, 11, 0, 0), + (397, 11008, 10, 0, 0), + (397, 11008, 11, 0, 0), + (397, 12038, 11, 0, 0), + (397, 12040, 10, 0, 0), + (397, 15001, 0, 0, 0), + (397, 20128, 0, 0, 0), + (397, 22009, 0, 0, 0), + (397, 25005, 0, 0, 0), + (397, 31153, 0, 0, 0), + (397, 36001, 0, 0, 0), + (397, 37001, 0, 0, 0), + (397, 40023, 0, 0, 0), + (397, 100095, 10, 0, 0), + (397, 100095, 11, 0, 0), + (397, 110094, 10, 0, 0), + (397, 110094, 11, 0, 0), + (397, 130036, 0, 0, 0), + (397, 140020, 0, 0, 0), + (397, 160017, 0, 0, 0), + (397, 180013, 0, 0, 0), + (397, 190015, 0, 0, 0), + (397, 200051, 0, 0, 0), + (397, 230004, 0, 0, 0), + (397, 240006, 0, 0, 0), + (397, 250004, 0, 0, 0), + (397, 280006, 0, 0, 0), + (397, 290005, 0, 0, 0), + (397, 300008, 0, 0, 0), + (397, 320031, 0, 0, 0), + (397, 330027, 0, 0, 0), + (397, 340003, 0, 0, 0), + (397, 350005, 0, 0, 0), + (397, 1000025, 0, 0, 0), + (397, 1100014, 0, 0, 0), + (397, 1200024, 0, 0, 0), + (398, 1001, 0, 0, 0), + (398, 2001, 0, 0, 0), + (398, 4001, 0, 0, 0), + (398, 5001, 0, 0, 0), + (398, 6001, 0, 0, 0), + (398, 10021, 10, 0, 0), + (398, 10021, 11, 0, 0), + (398, 11008, 10, 0, 0), + (398, 11008, 11, 0, 0), + (398, 12038, 11, 0, 0), + (398, 12040, 10, 0, 0), + (398, 14003, 11, 0, 0), + (398, 15001, 0, 0, 0), + (398, 20125, 0, 0, 0), + (398, 22009, 0, 0, 0), + (398, 31153, 0, 0, 0), + (398, 36001, 0, 0, 0), + (398, 37001, 0, 0, 0), + (398, 40020, 0, 0, 0), + (398, 100096, 10, 0, 0), + (398, 100096, 11, 0, 0), + (398, 110080, 10, 0, 0), + (398, 110109, 11, 0, 0), + (398, 130046, 0, 0, 0), + (398, 140002, 0, 0, 0), + (398, 160017, 0, 0, 0), + (398, 180013, 0, 0, 0), + (398, 190015, 0, 0, 0), + (398, 200051, 0, 0, 0), + (398, 230004, 0, 0, 0), + (398, 240006, 0, 0, 0), + (398, 250004, 0, 0, 0), + (398, 280006, 0, 0, 0), + (398, 290005, 0, 0, 0), + (398, 300008, 0, 0, 0), + (398, 320031, 0, 0, 0), + (398, 330027, 0, 0, 0), + (398, 340003, 0, 0, 0), + (398, 1000025, 0, 0, 0), + (398, 1100026, 0, 0, 0), + (398, 1200024, 0, 0, 0), + (399, 1001, 0, 0, 0), + (399, 2001, 0, 0, 0), + (399, 4001, 0, 0, 0), + (399, 5001, 0, 0, 0), + (399, 6001, 0, 0, 0), + (399, 10030, 10, 0, 0), + (399, 10030, 11, 0, 0), + (399, 11008, 10, 0, 0), + (399, 11008, 11, 0, 0), + (399, 12038, 11, 0, 0), + (399, 12040, 10, 0, 0), + (399, 14003, 11, 0, 0), + (399, 15001, 0, 0, 0), + (399, 20117, 0, 0, 0), + (399, 22009, 0, 0, 0), + (399, 29002, 0, 0, 0), + (399, 30004, 0, 0, 0), + (399, 31153, 0, 0, 0), + (399, 36001, 0, 0, 0), + (399, 37001, 0, 0, 0), + (399, 40021, 0, 0, 0), + (399, 100127, 10, 0, 0), + (399, 100127, 11, 0, 0), + (399, 110172, 10, 0, 0), + (399, 110172, 11, 0, 0), + (399, 130016, 0, 0, 0), + (399, 140002, 0, 0, 0), + (399, 160032, 0, 0, 0), + (399, 180033, 0, 0, 0), + (399, 190026, 0, 0, 0), + (399, 200010, 0, 0, 0), + (399, 230001, 0, 0, 0), + (399, 240007, 0, 0, 0), + (399, 250007, 0, 0, 0), + (399, 280040, 0, 0, 0), + (399, 290005, 0, 0, 0), + (399, 300008, 0, 0, 0), + (399, 320043, 0, 0, 0), + (399, 330047, 0, 0, 0), + (399, 340003, 0, 0, 0), + (399, 1000033, 0, 0, 0), + (399, 1100039, 0, 0, 0), + (399, 1200029, 0, 0, 0), + (400, 1001, 0, 0, 0), + (400, 2001, 0, 0, 0), + (400, 4001, 0, 0, 0), + (400, 5001, 0, 0, 0), + (400, 6001, 0, 0, 0), + (400, 10021, 10, 0, 0), + (400, 10021, 11, 0, 0), + (400, 11008, 10, 0, 0), + (400, 11008, 11, 0, 0), + (400, 12038, 11, 0, 0), + (400, 12040, 10, 0, 0), + (400, 13010, 10, 0, 0), + (400, 14003, 11, 0, 0), + (400, 15001, 0, 0, 0), + (400, 20108, 0, 0, 0), + (400, 22014, 0, 0, 0), + (400, 31153, 0, 0, 0), + (400, 36001, 0, 0, 0), + (400, 37001, 0, 0, 0), + (400, 40010, 0, 0, 0), + (400, 100129, 10, 0, 0), + (400, 100129, 11, 0, 0), + (400, 110108, 10, 0, 0), + (400, 110109, 11, 0, 0), + (400, 130034, 0, 0, 0), + (400, 140019, 0, 0, 0), + (400, 160032, 0, 0, 0), + (400, 180033, 0, 0, 0), + (400, 190026, 0, 0, 0), + (400, 200010, 0, 0, 0), + (400, 230003, 0, 0, 0), + (400, 240007, 0, 0, 0), + (400, 250005, 0, 0, 0), + (400, 280040, 0, 0, 0), + (400, 290005, 0, 0, 0), + (400, 300008, 0, 0, 0), + (400, 320043, 0, 0, 0), + (400, 330047, 0, 0, 0), + (400, 340003, 0, 0, 0), + (400, 1000033, 0, 0, 0), + (400, 1100039, 0, 0, 0), + (400, 1200029, 0, 0, 0), + (401, 1001, 0, 0, 0), + (401, 2001, 0, 0, 0), + (401, 4001, 0, 0, 0), + (401, 5001, 0, 0, 0), + (401, 6001, 0, 0, 0), + (401, 10030, 10, 0, 0), + (401, 10030, 11, 0, 0), + (401, 11008, 10, 0, 0), + (401, 11008, 11, 0, 0), + (401, 12038, 11, 0, 0), + (401, 12040, 10, 0, 0), + (401, 13012, 10, 0, 0), + (401, 14003, 11, 0, 0), + (401, 15001, 0, 0, 0), + (401, 20134, 0, 0, 0), + (401, 22001, 0, 0, 0), + (401, 31153, 0, 0, 0), + (401, 36001, 0, 0, 0), + (401, 37001, 0, 0, 0), + (401, 40035, 0, 0, 0), + (401, 100005, 10, 0, 0), + (401, 100005, 11, 0, 0), + (401, 110104, 10, 0, 0), + (401, 110109, 11, 0, 0), + (401, 130046, 0, 0, 0), + (401, 140019, 0, 0, 0), + (401, 160078, 0, 0, 0), + (401, 180037, 0, 0, 0), + (401, 190069, 0, 0, 0), + (401, 200053, 0, 0, 0), + (401, 230003, 0, 0, 0), + (401, 240007, 0, 0, 0), + (401, 250007, 0, 0, 0), + (401, 280042, 0, 0, 0), + (401, 290005, 0, 0, 0), + (401, 300008, 0, 0, 0), + (401, 320012, 0, 0, 0), + (401, 330019, 0, 0, 0), + (401, 340003, 0, 0, 0), + (401, 1000011, 0, 0, 0), + (401, 1100045, 0, 0, 0), + (401, 1200039, 0, 0, 0), + (402, 1001, 0, 1, 1), + (402, 2001, 0, 1, 1), + (402, 4001, 0, 0, 0), + (402, 5001, 0, 0, 0), + (402, 6001, 0, 0, 0), + (402, 10009, 11, 0, 0), + (402, 10010, 10, 0, 0), + (402, 11004, 10, 0, 0), + (402, 11004, 11, 0, 0), + (402, 12012, 11, 0, 0), + (402, 12064, 10, 0, 0), + (402, 13002, 10, 0, 0), + (402, 13004, 11, 0, 0), + (402, 15001, 0, 0, 0), + (402, 20127, 0, 0, 0), + (402, 22009, 0, 0, 0), + (402, 31153, 0, 0, 0), + (402, 36001, 0, 0, 0), + (402, 37001, 0, 0, 0), + (402, 40015, 0, 0, 0), + (402, 100002, 10, 0, 0), + (402, 100002, 11, 0, 0), + (402, 110082, 10, 1, 1), + (402, 110084, 11, 1, 1), + (402, 130045, 0, 0, 0), + (402, 140018, 0, 0, 0), + (402, 160090, 0, 0, 0), + (402, 180049, 0, 0, 0), + (402, 190013, 0, 0, 0), + (402, 200057, 0, 0, 0), + (402, 230001, 0, 0, 0), + (402, 240001, 0, 0, 0), + (402, 250002, 0, 0, 0), + (402, 280054, 0, 0, 0), + (402, 290006, 0, 0, 0), + (402, 300011, 0, 0, 0), + (402, 320104, 0, 0, 0), + (402, 330033, 0, 0, 0), + (402, 340002, 0, 0, 0), + (402, 1000162, 0, 0, 0), + (402, 1100124, 0, 0, 0), + (402, 1200013, 0, 0, 0), + (403, 1001, 0, 0, 0), + (403, 2001, 0, 0, 0), + (403, 4001, 0, 0, 0), + (403, 5001, 0, 0, 0), + (403, 6001, 0, 0, 0), + (403, 10002, 10, 0, 0), + (403, 10002, 11, 0, 0), + (403, 11004, 10, 0, 0), + (403, 11011, 11, 0, 0), + (403, 12011, 10, 0, 0), + (403, 12011, 11, 0, 0), + (403, 13004, 10, 0, 0), + (403, 13006, 11, 0, 0), + (403, 14002, 10, 0, 0), + (403, 14002, 11, 0, 0), + (403, 15001, 0, 0, 0), + (403, 20140, 0, 0, 0), + (403, 22009, 0, 0, 0), + (403, 25005, 0, 0, 0), + (403, 29001, 0, 0, 0), + (403, 30003, 0, 0, 0), + (403, 31153, 0, 0, 0), + (403, 36001, 0, 0, 0), + (403, 37001, 0, 0, 0), + (403, 40042, 0, 0, 0), + (403, 100002, 10, 0, 0), + (403, 100002, 11, 0, 0), + (403, 110102, 10, 1, 1), + (403, 110103, 11, 1, 1), + (403, 130048, 0, 0, 0), + (403, 140009, 0, 0, 0), + (403, 150004, 0, 0, 0), + (403, 160012, 0, 0, 0), + (403, 180014, 0, 0, 0), + (403, 190016, 0, 0, 0), + (403, 200036, 0, 0, 0), + (403, 230001, 0, 0, 0), + (403, 240007, 0, 0, 0), + (403, 250002, 0, 0, 0), + (403, 280038, 0, 0, 0), + (403, 290006, 0, 0, 0), + (403, 300007, 0, 0, 0), + (403, 320078, 0, 0, 0), + (403, 330040, 0, 0, 0), + (403, 350003, 0, 0, 0), + (403, 1000071, 0, 0, 0), + (403, 1100068, 0, 0, 0), + (403, 1200023, 0, 0, 0), + (404, 1001, 0, 0, 0), + (404, 2001, 0, 0, 0), + (404, 4001, 0, 0, 0), + (404, 5001, 0, 0, 0), + (404, 6001, 0, 0, 0), + (404, 10014, 11, 0, 0), + (404, 10021, 10, 0, 0), + (404, 11009, 10, 0, 0), + (404, 11009, 11, 0, 0), + (404, 12011, 11, 0, 0), + (404, 12064, 10, 0, 0), + (404, 13013, 10, 0, 0), + (404, 13016, 11, 0, 0), + (404, 14003, 10, 0, 0), + (404, 14004, 0, 0, 0), + (404, 14004, 11, 0, 0), + (404, 15001, 0, 0, 0), + (404, 20207, 0, 0, 0), + (404, 22010, 0, 0, 0), + (404, 25005, 0, 0, 0), + (404, 29003, 0, 0, 0), + (404, 30006, 0, 0, 0), + (404, 31152, 0, 0, 0), + (404, 36001, 0, 0, 0), + (404, 37001, 0, 0, 0), + (404, 40060, 0, 0, 0), + (404, 100005, 10, 0, 0), + (404, 100005, 11, 0, 0), + (404, 110173, 10, 1, 1), + (404, 110174, 11, 1, 1), + (404, 130051, 0, 0, 0), + (404, 140007, 0, 0, 0), + (404, 150003, 0, 0, 0), + (404, 160097, 0, 0, 0), + (404, 180060, 0, 0, 0), + (404, 190028, 0, 0, 0), + (404, 200012, 0, 0, 0), + (404, 230005, 0, 0, 0), + (404, 240007, 0, 0, 0), + (404, 250005, 0, 0, 0), + (404, 280032, 0, 0, 0), + (404, 290005, 0, 0, 0), + (404, 320007, 0, 0, 0), + (404, 330022, 0, 0, 0), + (404, 350005, 0, 0, 0), + (404, 1000054, 0, 0, 0), + (404, 1100043, 0, 0, 0), + (404, 1200099, 0, 0, 0), + (405, 1001, 0, 0, 0), + (405, 2001, 0, 0, 0), + (405, 4001, 0, 0, 0), + (405, 5001, 0, 0, 0), + (405, 6001, 0, 0, 0), + (405, 10021, 10, 0, 0), + (405, 10026, 11, 0, 0), + (405, 11006, 10, 0, 0), + (405, 11006, 11, 0, 0), + (405, 12007, 11, 0, 0), + (405, 12021, 10, 0, 0), + (405, 13006, 10, 0, 0), + (405, 15001, 0, 0, 0), + (405, 20117, 0, 0, 0), + (405, 22009, 0, 0, 0), + (405, 31153, 0, 0, 0), + (405, 36001, 0, 0, 0), + (405, 37001, 0, 0, 0), + (405, 40021, 0, 0, 0), + (405, 100120, 10, 0, 0), + (405, 100120, 11, 0, 0), + (405, 110174, 10, 0, 0), + (405, 110174, 11, 0, 0), + (405, 130008, 0, 0, 0), + (405, 140005, 0, 0, 0), + (405, 160009, 0, 0, 0), + (405, 180014, 0, 0, 0), + (405, 190016, 0, 0, 0), + (405, 200036, 0, 0, 0), + (405, 230003, 0, 0, 0), + (405, 240006, 0, 0, 0), + (405, 250006, 0, 0, 0), + (405, 280068, 0, 0, 0), + (405, 290006, 0, 0, 0), + (405, 300006, 0, 0, 0), + (405, 320030, 0, 0, 0), + (405, 330070, 0, 0, 0), + (405, 340003, 0, 0, 0), + (405, 1000073, 0, 0, 0), + (405, 1100025, 0, 0, 0), + (405, 1200023, 0, 0, 0), + (406, 1001, 0, 1, 1), + (406, 2001, 0, 1, 1), + (406, 4001, 0, 0, 0), + (406, 5001, 0, 0, 0), + (406, 6001, 0, 0, 0), + (406, 10001, 11, 0, 0), + (406, 10021, 10, 0, 0), + (406, 11009, 10, 0, 0), + (406, 11009, 11, 0, 0), + (406, 12009, 11, 0, 0), + (406, 12010, 10, 0, 0), + (406, 13011, 10, 0, 0), + (406, 13012, 11, 0, 0), + (406, 15001, 0, 0, 0), + (406, 20207, 0, 0, 0), + (406, 22010, 0, 0, 0), + (406, 31152, 0, 0, 0), + (406, 36001, 0, 0, 0), + (406, 37001, 0, 0, 0), + (406, 40060, 0, 0, 0), + (406, 100005, 10, 0, 0), + (406, 100005, 11, 0, 0), + (406, 110174, 10, 1, 1), + (406, 110174, 11, 1, 1), + (406, 130003, 0, 0, 0), + (406, 140010, 0, 0, 0), + (406, 160032, 0, 0, 0), + (406, 180035, 0, 0, 0), + (406, 190053, 0, 0, 0), + (406, 200043, 0, 0, 0), + (406, 230003, 0, 0, 0), + (406, 240006, 0, 0, 0), + (406, 250006, 0, 0, 0), + (406, 280040, 0, 0, 0), + (406, 290006, 0, 0, 0), + (406, 300010, 0, 0, 0), + (406, 320042, 0, 0, 0), + (406, 330027, 0, 0, 0), + (406, 340004, 0, 0, 0), + (406, 1000052, 0, 0, 0), + (406, 1100040, 0, 0, 0), + (406, 1200029, 0, 0, 0), + (407, 1001, 0, 1, 1), + (407, 2001, 0, 1, 1), + (407, 4001, 0, 0, 0), + (407, 5001, 0, 0, 0), + (407, 6001, 0, 0, 0), + (407, 10001, 11, 0, 0), + (407, 10021, 10, 0, 0), + (407, 11006, 10, 0, 0), + (407, 11006, 11, 0, 0), + (407, 12008, 11, 0, 0), + (407, 12009, 10, 0, 0), + (407, 13006, 10, 0, 0), + (407, 15001, 0, 0, 0), + (407, 20213, 0, 0, 0), + (407, 22001, 0, 0, 0), + (407, 31153, 0, 0, 0), + (407, 36001, 0, 0, 0), + (407, 37001, 0, 0, 0), + (407, 40058, 0, 0, 0), + (407, 100003, 10, 0, 0), + (407, 100003, 11, 0, 0), + (407, 110174, 10, 1, 1), + (407, 110174, 11, 1, 1), + (407, 130003, 0, 0, 0), + (407, 140007, 0, 0, 0), + (407, 160078, 0, 0, 0), + (407, 180037, 0, 0, 0), + (407, 190087, 0, 0, 0), + (407, 200071, 0, 0, 0), + (407, 230003, 0, 0, 0), + (407, 240006, 0, 0, 0), + (407, 250006, 0, 0, 0), + (407, 280042, 0, 0, 0), + (407, 290006, 0, 0, 0), + (407, 300011, 0, 0, 0), + (407, 320012, 0, 0, 0), + (407, 330027, 0, 0, 0), + (407, 340003, 0, 0, 0), + (407, 1000011, 0, 0, 0), + (407, 1100045, 0, 0, 0), + (407, 1200039, 0, 0, 0), + (408, 1001, 0, 1, 1), + (408, 2001, 0, 1, 1), + (408, 4001, 0, 0, 0), + (408, 5001, 0, 0, 0), + (408, 6001, 0, 0, 0), + (408, 10001, 11, 0, 0), + (408, 10021, 10, 0, 0), + (408, 11007, 10, 0, 0), + (408, 11007, 11, 0, 0), + (408, 12006, 11, 0, 0), + (408, 12008, 10, 0, 0), + (408, 13007, 11, 0, 0), + (408, 13009, 10, 0, 0), + (408, 15001, 0, 0, 0), + (408, 20111, 0, 0, 0), + (408, 22014, 0, 0, 0), + (408, 29002, 0, 0, 0), + (408, 30003, 0, 0, 0), + (408, 31153, 0, 0, 0), + (408, 36001, 0, 0, 0), + (408, 37001, 0, 0, 0), + (408, 40013, 0, 0, 0), + (408, 100005, 10, 0, 0), + (408, 100005, 11, 0, 0), + (408, 110174, 10, 1, 1), + (408, 110174, 11, 1, 1), + (408, 130003, 0, 0, 0), + (408, 140009, 0, 0, 0), + (408, 160084, 0, 0, 0), + (408, 180034, 0, 0, 0), + (408, 190052, 0, 0, 0), + (408, 200011, 0, 0, 0), + (408, 230003, 0, 0, 0), + (408, 240002, 0, 0, 0), + (408, 250005, 0, 0, 0), + (408, 280071, 0, 0, 0), + (408, 290005, 0, 0, 0), + (408, 300009, 0, 0, 0), + (408, 320097, 0, 0, 0), + (408, 330070, 0, 0, 0), + (408, 340004, 0, 0, 0), + (408, 1000139, 0, 0, 0), + (408, 1100101, 0, 0, 0), + (408, 1200101, 0, 0, 0), + (409, 1001, 0, 1, 1), + (409, 2001, 0, 1, 1), + (409, 4001, 0, 0, 0), + (409, 5001, 0, 0, 0), + (409, 6001, 0, 0, 0), + (409, 10001, 11, 0, 0), + (409, 10021, 10, 0, 0), + (409, 11007, 10, 0, 0), + (409, 11007, 11, 0, 0), + (409, 12008, 11, 0, 0), + (409, 12009, 10, 0, 0), + (409, 15001, 0, 0, 0), + (409, 20220, 0, 0, 0), + (409, 22009, 0, 0, 0), + (409, 31153, 0, 0, 0), + (409, 36001, 0, 0, 0), + (409, 37001, 0, 0, 0), + (409, 40025, 0, 0, 0), + (409, 100004, 10, 0, 0), + (409, 100004, 11, 0, 0), + (409, 110174, 10, 1, 1), + (409, 110174, 11, 1, 1), + (409, 130003, 0, 0, 0), + (409, 140007, 0, 0, 0), + (409, 160007, 0, 0, 0), + (409, 180005, 0, 0, 0), + (409, 190062, 0, 0, 0), + (409, 200036, 0, 0, 0), + (409, 230003, 0, 0, 0), + (409, 240006, 0, 0, 0), + (409, 250006, 0, 0, 0), + (409, 280007, 0, 0, 0), + (409, 290005, 0, 0, 0), + (409, 300007, 0, 0, 0), + (409, 320029, 0, 0, 0), + (409, 330027, 0, 0, 0), + (409, 340004, 0, 0, 0), + (409, 1000073, 0, 0, 0), + (409, 1100025, 0, 0, 0), + (409, 1200023, 0, 0, 0), + (410, 1001, 0, 1, 1), + (410, 2001, 0, 1, 1), + (410, 4001, 0, 0, 0), + (410, 5001, 0, 0, 0), + (410, 6001, 0, 0, 0), + (410, 10001, 11, 0, 0), + (410, 10021, 0, 0, 0), + (410, 10021, 10, 0, 0), + (410, 11007, 10, 0, 0), + (410, 11007, 11, 0, 0), + (410, 12006, 11, 0, 0), + (410, 12009, 10, 0, 0), + (410, 13008, 11, 0, 0), + (410, 13011, 10, 0, 0), + (410, 15001, 0, 0, 0), + (410, 20130, 0, 0, 0), + (410, 22006, 0, 0, 0), + (410, 31153, 0, 0, 0), + (410, 36001, 0, 0, 0), + (410, 37001, 0, 0, 0), + (410, 40055, 0, 0, 0), + (410, 100003, 10, 0, 0), + (410, 100003, 11, 0, 0), + (410, 110174, 10, 1, 1), + (410, 110174, 11, 1, 1), + (410, 130003, 0, 0, 0), + (410, 140010, 0, 0, 0), + (410, 160042, 0, 0, 0), + (410, 180029, 0, 0, 0), + (410, 190050, 0, 0, 0), + (410, 200009, 0, 0, 0), + (410, 230003, 0, 0, 0), + (410, 240006, 0, 0, 0), + (410, 250006, 0, 0, 0), + (410, 280063, 0, 0, 0), + (410, 290005, 0, 0, 0), + (410, 300009, 0, 0, 0), + (410, 320076, 0, 0, 0), + (410, 330071, 0, 0, 0), + (410, 340004, 0, 0, 0), + (410, 1000131, 0, 0, 0), + (410, 1100037, 0, 0, 0), + (410, 1200107, 0, 0, 0), + (411, 1001, 0, 0, 0), + (411, 2001, 0, 0, 0), + (411, 4001, 0, 0, 0), + (411, 5001, 0, 0, 0), + (411, 6001, 0, 0, 0), + (411, 10002, 10, 0, 0), + (411, 10010, 11, 0, 0), + (411, 11004, 10, 0, 0), + (411, 11004, 11, 0, 0), + (411, 12006, 10, 0, 0), + (411, 12022, 11, 0, 0), + (411, 13012, 10, 0, 0), + (411, 15001, 0, 0, 0), + (411, 20132, 0, 0, 0), + (411, 22008, 0, 0, 0), + (411, 31153, 0, 0, 0), + (411, 36001, 0, 0, 0), + (411, 37001, 0, 0, 0), + (411, 40032, 0, 0, 0), + (411, 100132, 10, 0, 0), + (411, 100132, 11, 0, 0), + (411, 110067, 10, 0, 0), + (411, 110067, 11, 0, 0), + (411, 130044, 0, 0, 0), + (411, 140008, 0, 0, 0), + (411, 160055, 0, 0, 0), + (411, 180015, 0, 0, 0), + (411, 190017, 0, 0, 0), + (411, 200029, 0, 0, 0), + (411, 230003, 0, 0, 0), + (411, 240006, 0, 0, 0), + (411, 250002, 0, 0, 0), + (411, 280036, 0, 0, 0), + (411, 290007, 0, 0, 0), + (411, 300004, 0, 0, 0), + (411, 320004, 0, 0, 0), + (411, 330067, 0, 0, 0), + (411, 340002, 0, 0, 0), + (411, 1000113, 0, 0, 0), + (411, 1100044, 0, 0, 0), + (411, 1200015, 0, 0, 0), + (412, 1001, 0, 0, 0), + (412, 2001, 0, 0, 0), + (412, 4001, 0, 0, 0), + (412, 5001, 0, 0, 0), + (412, 6001, 0, 0, 0), + (412, 10010, 11, 0, 0), + (412, 10017, 10, 0, 0), + (412, 11009, 10, 0, 0), + (412, 11009, 11, 0, 0), + (412, 12008, 10, 0, 0), + (412, 12029, 11, 0, 0), + (412, 13007, 11, 0, 0), + (412, 13009, 10, 0, 0), + (412, 15001, 0, 0, 0), + (412, 16001, 0, 0, 0), + (412, 20111, 0, 0, 0), + (412, 22014, 0, 0, 0), + (412, 29002, 10, 0, 0), + (412, 30003, 11, 0, 0), + (412, 31153, 0, 0, 0), + (412, 36001, 0, 0, 0), + (412, 37001, 0, 0, 0), + (412, 40013, 0, 0, 0), + (412, 100112, 10, 0, 0), + (412, 100112, 11, 0, 0), + (412, 110083, 10, 0, 0), + (412, 110084, 11, 0, 0), + (412, 130039, 0, 0, 0), + (412, 140020, 0, 0, 0), + (412, 160027, 0, 0, 0), + (412, 180034, 0, 0, 0), + (412, 190001, 0, 0, 0), + (412, 200054, 0, 0, 0), + (412, 230003, 0, 0, 0), + (412, 240005, 0, 0, 0), + (412, 250001, 0, 0, 0), + (412, 280041, 0, 0, 0), + (412, 290002, 0, 0, 0), + (412, 300011, 0, 0, 0), + (412, 320087, 0, 0, 0), + (412, 330025, 0, 0, 0), + (412, 340003, 0, 0, 0), + (412, 1000139, 0, 0, 0), + (412, 1100005, 0, 0, 0), + (412, 1200038, 0, 0, 0), + (413, 1001, 0, 0, 0), + (413, 2001, 0, 0, 0), + (413, 4001, 0, 0, 0), + (413, 5001, 0, 0, 0), + (413, 6001, 0, 0, 0), + (413, 10006, 11, 0, 0), + (413, 10015, 10, 0, 0), + (413, 11006, 10, 0, 0), + (413, 11006, 11, 0, 0), + (413, 12021, 10, 0, 0), + (413, 12029, 11, 0, 0), + (413, 13006, 10, 0, 0), + (413, 15001, 0, 0, 0), + (413, 20114, 0, 0, 0), + (413, 22009, 0, 0, 0), + (413, 31153, 0, 0, 0), + (413, 36001, 0, 0, 0), + (413, 37001, 0, 0, 0), + (413, 40018, 0, 0, 0), + (413, 100002, 10, 0, 0), + (413, 100002, 11, 0, 0), + (413, 110167, 10, 0, 0), + (413, 110168, 11, 0, 0), + (413, 130030, 0, 0, 0), + (413, 140009, 0, 0, 0), + (413, 160009, 0, 0, 0), + (413, 180014, 0, 0, 0), + (413, 190016, 0, 0, 0), + (413, 200002, 0, 0, 0), + (413, 230001, 0, 0, 0), + (413, 240006, 0, 0, 0), + (413, 250002, 0, 0, 0), + (413, 280024, 0, 0, 0), + (413, 290004, 0, 0, 0), + (413, 300001, 0, 0, 0), + (413, 320020, 0, 0, 0), + (413, 330034, 0, 0, 0), + (413, 340002, 0, 0, 0), + (413, 1000073, 0, 0, 0), + (413, 1100001, 0, 0, 0), + (413, 1200023, 0, 0, 0), + (414, 1001, 0, 0, 0), + (414, 2001, 0, 0, 0), + (414, 4001, 0, 0, 0), + (414, 5001, 0, 0, 0), + (414, 6001, 0, 0, 0), + (414, 10006, 11, 0, 0), + (414, 10015, 10, 0, 0), + (414, 11006, 10, 0, 0), + (414, 11006, 11, 0, 0), + (414, 12021, 10, 0, 0), + (414, 12029, 11, 0, 0), + (414, 13006, 10, 0, 0), + (414, 15001, 0, 0, 0), + (414, 20114, 0, 0, 0), + (414, 22009, 0, 0, 0), + (414, 31153, 0, 0, 0), + (414, 36001, 0, 0, 0), + (414, 37001, 0, 0, 0), + (414, 40018, 0, 0, 0), + (414, 100002, 10, 0, 0), + (414, 100002, 11, 0, 0), + (414, 110084, 10, 0, 0), + (414, 110168, 11, 0, 0), + (414, 130030, 0, 0, 0), + (414, 140009, 0, 0, 0), + (414, 160012, 0, 0, 0), + (414, 180014, 0, 0, 0), + (414, 190016, 0, 0, 0), + (414, 200002, 0, 0, 0), + (414, 230001, 0, 0, 0), + (414, 240001, 0, 0, 0), + (414, 250002, 0, 0, 0), + (414, 280016, 0, 0, 0), + (414, 290001, 0, 0, 0), + (414, 300001, 0, 0, 0), + (414, 320020, 0, 0, 0), + (414, 330018, 0, 0, 0), + (414, 340002, 0, 0, 0), + (414, 1000122, 0, 0, 0), + (414, 1100001, 0, 0, 0), + (414, 1200034, 0, 0, 0), + (415, 1001, 0, 0, 0), + (415, 2001, 0, 0, 0), + (415, 4001, 0, 0, 0), + (415, 5001, 0, 0, 0), + (415, 6001, 0, 0, 0), + (415, 10006, 11, 0, 0), + (415, 10015, 10, 0, 0), + (415, 11006, 10, 0, 0), + (415, 11006, 11, 0, 0), + (415, 12021, 10, 0, 0), + (415, 12029, 11, 0, 0), + (415, 13006, 10, 0, 0), + (415, 15001, 0, 0, 0), + (415, 20114, 0, 0, 0), + (415, 22009, 0, 0, 0), + (415, 31153, 0, 0, 0), + (415, 36001, 0, 0, 0), + (415, 37001, 0, 0, 0), + (415, 40018, 0, 0, 0), + (415, 100002, 10, 0, 0), + (415, 100002, 11, 0, 0), + (415, 110012, 10, 0, 0), + (415, 110012, 11, 0, 0), + (415, 130032, 0, 0, 0), + (415, 140009, 0, 0, 0), + (415, 160006, 0, 0, 0), + (415, 180014, 0, 0, 0), + (415, 190016, 0, 0, 0), + (415, 200002, 0, 0, 0), + (415, 230001, 0, 0, 0), + (415, 240001, 0, 0, 0), + (415, 250002, 0, 0, 0), + (415, 280024, 0, 0, 0), + (415, 290001, 0, 0, 0), + (415, 300001, 0, 0, 0), + (415, 320030, 0, 0, 0), + (415, 330013, 0, 0, 0), + (415, 340002, 0, 0, 0), + (415, 1000015, 0, 0, 0), + (415, 1100001, 0, 0, 0), + (415, 1200034, 0, 0, 0), + (416, 1001, 0, 0, 0), + (416, 2001, 0, 0, 0), + (416, 4001, 0, 0, 0), + (416, 5001, 0, 0, 0), + (416, 6001, 0, 0, 0), + (416, 10002, 10, 0, 0), + (416, 10010, 11, 0, 0), + (416, 11004, 10, 0, 0), + (416, 11004, 11, 0, 0), + (416, 12006, 10, 0, 0), + (416, 12022, 11, 0, 0), + (416, 13012, 10, 0, 0), + (416, 15001, 0, 0, 0), + (416, 20133, 0, 0, 0), + (416, 22008, 0, 0, 0), + (416, 31153, 0, 0, 0), + (416, 36001, 0, 0, 0), + (416, 37001, 0, 0, 0), + (416, 40033, 0, 0, 0), + (416, 100132, 10, 0, 0), + (416, 100132, 11, 0, 0), + (416, 110045, 10, 0, 0), + (416, 110045, 11, 0, 0), + (416, 130048, 0, 0, 0), + (416, 140004, 0, 0, 0), + (416, 160073, 0, 0, 0), + (416, 180015, 0, 0, 0), + (416, 190017, 0, 0, 0), + (416, 200029, 0, 0, 0), + (416, 230001, 0, 0, 0), + (416, 240005, 0, 0, 0), + (416, 250002, 0, 0, 0), + (416, 280036, 0, 0, 0), + (416, 290004, 0, 0, 0), + (416, 300001, 0, 0, 0), + (416, 320004, 0, 0, 0), + (416, 330066, 0, 0, 0), + (416, 340002, 0, 0, 0), + (416, 1000120, 0, 0, 0), + (416, 1100044, 0, 0, 0), + (416, 1200015, 0, 0, 0), + (417, 1001, 0, 0, 0), + (417, 2001, 0, 0, 0), + (417, 4001, 0, 0, 0), + (417, 5001, 0, 0, 0), + (417, 6001, 0, 0, 0), + (417, 10010, 10, 0, 0), + (417, 10010, 11, 0, 0), + (417, 11004, 10, 0, 0), + (417, 11004, 11, 0, 0), + (417, 12027, 10, 0, 0), + (417, 12029, 11, 0, 0), + (417, 13010, 10, 0, 0), + (417, 15001, 0, 0, 0), + (417, 20108, 0, 0, 0), + (417, 22014, 0, 0, 0), + (417, 31153, 0, 0, 0), + (417, 36001, 0, 0, 0), + (417, 37001, 0, 0, 0), + (417, 40013, 0, 0, 0), + (417, 100002, 10, 0, 0), + (417, 100002, 11, 0, 0), + (417, 110171, 10, 0, 0), + (417, 110171, 11, 0, 0), + (417, 130034, 0, 0, 0), + (417, 140019, 0, 0, 0), + (417, 160025, 0, 0, 0), + (417, 180030, 0, 0, 0), + (417, 190020, 0, 0, 0), + (417, 200004, 0, 0, 0), + (417, 230001, 0, 0, 0), + (417, 240001, 0, 0, 0), + (417, 250001, 0, 0, 0), + (417, 280018, 0, 0, 0), + (417, 290001, 0, 0, 0), + (417, 300001, 0, 0, 0), + (417, 320022, 0, 0, 0), + (417, 330003, 0, 0, 0), + (417, 340002, 0, 0, 0), + (417, 1000138, 0, 0, 0), + (417, 1100005, 0, 0, 0), + (417, 1200017, 0, 0, 0), + (418, 1001, 0, 0, 0), + (418, 2001, 0, 0, 0), + (418, 4001, 0, 0, 0), + (418, 5001, 0, 0, 0), + (418, 6001, 0, 0, 0), + (418, 10002, 10, 0, 0), + (418, 10010, 11, 0, 0), + (418, 11004, 10, 0, 0), + (418, 11004, 11, 0, 0), + (418, 12009, 10, 0, 0), + (418, 12021, 11, 0, 0), + (418, 13009, 10, 0, 0), + (418, 15001, 0, 0, 0), + (418, 20121, 0, 0, 0), + (418, 22009, 0, 0, 0), + (418, 31153, 0, 0, 0), + (418, 36001, 0, 0, 0), + (418, 37001, 0, 0, 0), + (418, 40030, 0, 0, 0), + (418, 100002, 10, 0, 0), + (418, 100002, 11, 0, 0), + (418, 110139, 10, 0, 0), + (418, 110139, 11, 0, 0), + (418, 130023, 0, 0, 0), + (418, 140016, 0, 0, 0), + (418, 160012, 0, 0, 0), + (418, 180003, 0, 0, 0), + (418, 190016, 0, 0, 0), + (418, 200002, 0, 0, 0), + (418, 230001, 0, 0, 0), + (418, 240006, 0, 0, 0), + (418, 250002, 0, 0, 0), + (418, 280016, 0, 0, 0), + (418, 290004, 0, 0, 0), + (418, 300001, 0, 0, 0), + (418, 320020, 0, 0, 0), + (418, 330008, 0, 0, 0), + (418, 340002, 0, 0, 0), + (418, 1000122, 0, 0, 0), + (418, 1100001, 0, 0, 0), + (418, 1200034, 0, 0, 0), + (419, 1001, 0, 0, 0), + (419, 2001, 0, 0, 0), + (419, 4001, 0, 0, 0), + (419, 5001, 0, 0, 0), + (419, 6001, 0, 0, 0), + (419, 10021, 10, 0, 0), + (419, 10021, 11, 0, 0), + (419, 11008, 10, 0, 0), + (419, 11008, 11, 0, 0), + (419, 12039, 11, 0, 0), + (419, 12040, 10, 0, 0), + (419, 15001, 0, 0, 0), + (419, 20112, 0, 0, 0), + (419, 22014, 0, 0, 0), + (419, 31151, 0, 0, 0), + (419, 36001, 0, 0, 0), + (419, 37001, 0, 0, 0), + (419, 40004, 0, 0, 0), + (419, 100005, 10, 0, 0), + (419, 100005, 11, 0, 0), + (419, 110173, 10, 0, 0), + (419, 110174, 11, 0, 0), + (419, 130036, 0, 0, 0), + (419, 140020, 0, 0, 0), + (419, 160017, 0, 0, 0), + (419, 180013, 0, 0, 0), + (419, 190015, 0, 0, 0), + (419, 200051, 0, 0, 0), + (419, 230002, 0, 0, 0), + (419, 240006, 0, 0, 0), + (419, 250006, 0, 0, 0), + (419, 280006, 0, 0, 0), + (419, 290005, 0, 0, 0), + (419, 300008, 0, 0, 0), + (419, 320031, 0, 0, 0), + (419, 330027, 0, 0, 0), + (419, 340003, 0, 0, 0), + (419, 1000025, 0, 0, 0), + (419, 1100027, 0, 0, 0), + (419, 1200024, 0, 0, 0), + (420, 1001, 0, 0, 0), + (420, 2001, 0, 0, 0), + (420, 4001, 0, 0, 0), + (420, 5001, 0, 0, 0), + (420, 6001, 0, 0, 0), + (420, 10009, 11, 0, 0), + (420, 10010, 10, 0, 0), + (420, 11004, 10, 0, 0), + (420, 11004, 11, 0, 0), + (420, 12007, 11, 0, 0), + (420, 12008, 10, 0, 0), + (420, 15001, 0, 0, 0), + (420, 20103, 0, 0, 0), + (420, 22014, 0, 0, 0), + (420, 31153, 0, 0, 0), + (420, 36001, 0, 0, 0), + (420, 37001, 0, 0, 0), + (420, 40005, 0, 0, 0), + (420, 100002, 10, 0, 0), + (420, 100002, 11, 0, 0), + (420, 110100, 10, 0, 0), + (420, 110100, 11, 0, 0), + (420, 130012, 0, 0, 0), + (420, 140014, 0, 0, 0), + (420, 160022, 0, 0, 0), + (420, 180019, 0, 0, 0), + (420, 190021, 0, 0, 0), + (420, 200019, 0, 0, 0), + (420, 230001, 0, 0, 0), + (420, 240003, 0, 0, 0), + (420, 250001, 0, 0, 0), + (420, 280019, 0, 0, 0), + (420, 290001, 0, 0, 0), + (420, 300001, 0, 0, 0), + (420, 320023, 0, 0, 0), + (420, 330006, 0, 0, 0), + (420, 340001, 0, 0, 0), + (420, 1000004, 0, 0, 0), + (420, 1100016, 0, 0, 0), + (420, 1200018, 0, 0, 0), + (421, 1001, 0, 0, 0), + (421, 2001, 0, 0, 0), + (421, 4001, 0, 0, 0), + (421, 5001, 0, 0, 0), + (421, 6001, 0, 0, 0), + (421, 10011, 10, 0, 0), + (421, 10011, 11, 0, 0), + (421, 11004, 10, 0, 0), + (421, 11004, 11, 0, 0), + (421, 12008, 11, 0, 0), + (421, 12031, 10, 0, 0), + (421, 15001, 0, 0, 0), + (421, 20118, 0, 0, 0), + (421, 22009, 0, 0, 0), + (421, 31153, 0, 0, 0), + (421, 36001, 0, 0, 0), + (421, 37001, 0, 0, 0), + (421, 40019, 0, 0, 0), + (421, 100002, 10, 0, 0), + (421, 100002, 11, 0, 0), + (421, 110100, 10, 0, 0), + (421, 110100, 11, 0, 0), + (421, 130032, 0, 0, 0), + (421, 140016, 0, 0, 0), + (421, 160011, 0, 0, 0), + (421, 180062, 0, 0, 0), + (421, 190067, 0, 0, 0), + (421, 200048, 0, 0, 0), + (421, 230001, 0, 0, 0), + (421, 240001, 0, 0, 0), + (421, 250002, 0, 0, 0), + (421, 280051, 0, 0, 0), + (421, 290004, 0, 0, 0), + (421, 300001, 0, 0, 0), + (421, 320100, 0, 0, 0), + (421, 330056, 0, 0, 0), + (421, 340002, 0, 0, 0), + (421, 1000057, 0, 0, 0), + (421, 1100120, 0, 0, 0), + (421, 1200049, 0, 0, 0), + (422, 1001, 0, 0, 0), + (422, 2001, 0, 0, 0), + (422, 4001, 0, 0, 0), + (422, 5001, 0, 0, 0), + (422, 6001, 0, 0, 0), + (422, 10001, 10, 0, 0), + (422, 10004, 11, 0, 0), + (422, 11009, 10, 0, 0), + (422, 11009, 11, 0, 0), + (422, 12009, 11, 0, 0), + (422, 12031, 10, 0, 0), + (422, 15001, 0, 0, 0), + (422, 20113, 0, 0, 0), + (422, 22009, 0, 0, 0), + (422, 31153, 0, 0, 0), + (422, 36001, 0, 0, 0), + (422, 37001, 0, 0, 0), + (422, 40016, 0, 0, 0), + (422, 100002, 10, 0, 0), + (422, 100002, 11, 0, 0), + (422, 110171, 10, 0, 0), + (422, 110171, 11, 0, 0), + (422, 130034, 0, 0, 0), + (422, 140019, 0, 0, 0), + (422, 160012, 0, 0, 0), + (422, 180014, 0, 0, 0), + (422, 190016, 0, 0, 0), + (422, 200002, 0, 0, 0), + (422, 230001, 0, 0, 0), + (422, 240006, 0, 0, 0), + (422, 250002, 0, 0, 0), + (422, 280024, 0, 0, 0), + (422, 290004, 0, 0, 0), + (422, 300001, 0, 0, 0), + (422, 320020, 0, 0, 0), + (422, 330018, 0, 0, 0), + (422, 340002, 0, 0, 0), + (422, 1000074, 0, 0, 0), + (422, 1100025, 0, 0, 0), + (422, 1200023, 0, 0, 0), + (423, 1001, 0, 0, 0), + (423, 2001, 0, 0, 0), + (423, 4001, 0, 0, 0), + (423, 5001, 0, 0, 0), + (423, 6001, 0, 0, 0), + (423, 10009, 11, 0, 0), + (423, 10010, 10, 0, 0), + (423, 11004, 10, 0, 0), + (423, 11004, 11, 0, 0), + (423, 12025, 10, 0, 0), + (423, 12026, 11, 0, 0), + (423, 13002, 10, 0, 0), + (423, 13004, 11, 0, 0), + (423, 15001, 0, 0, 0), + (423, 20127, 0, 0, 0), + (423, 22009, 0, 0, 0), + (423, 31153, 0, 0, 0), + (423, 36001, 0, 0, 0), + (423, 37001, 0, 0, 0), + (423, 40015, 0, 0, 0), + (423, 100002, 10, 0, 0), + (423, 100002, 11, 0, 0), + (423, 110173, 10, 0, 0), + (423, 110173, 11, 0, 0), + (423, 130045, 0, 0, 0), + (423, 140018, 0, 0, 0), + (423, 160090, 0, 0, 0), + (423, 180049, 0, 0, 0), + (423, 190013, 0, 0, 0), + (423, 200057, 0, 0, 0), + (423, 230001, 0, 0, 0), + (423, 240001, 0, 0, 0), + (423, 250002, 0, 0, 0), + (423, 280054, 0, 0, 0), + (423, 290006, 0, 0, 0), + (423, 300011, 0, 0, 0), + (423, 320104, 0, 0, 0), + (423, 330033, 0, 0, 0), + (423, 340002, 0, 0, 0), + (423, 1000162, 0, 0, 0), + (423, 1100124, 0, 0, 0), + (423, 1200013, 0, 0, 0), + (424, 1001, 0, 0, 0), + (424, 2001, 0, 0, 0), + (424, 4001, 0, 0, 0), + (424, 5001, 0, 0, 0), + (424, 6001, 0, 0, 0), + (424, 10009, 11, 0, 0), + (424, 10010, 10, 0, 0), + (424, 11006, 10, 0, 0), + (424, 11006, 11, 0, 0), + (424, 12031, 11, 0, 0), + (424, 12032, 10, 0, 0), + (424, 15001, 0, 0, 0), + (424, 20218, 0, 0, 0), + (424, 22009, 0, 0, 0), + (424, 31153, 0, 0, 0), + (424, 36001, 0, 0, 0), + (424, 37001, 0, 0, 0), + (424, 40041, 0, 0, 0), + (424, 100002, 10, 0, 0), + (424, 100002, 11, 0, 0), + (424, 110172, 10, 0, 0), + (424, 110172, 11, 0, 0), + (424, 130033, 0, 0, 0), + (424, 140011, 0, 0, 0), + (424, 160014, 0, 0, 0), + (424, 180002, 0, 0, 0), + (424, 190015, 0, 0, 0), + (424, 200003, 0, 0, 0), + (424, 230001, 0, 0, 0), + (424, 240001, 0, 0, 0), + (424, 250002, 0, 0, 0), + (424, 280002, 0, 0, 0), + (424, 290004, 0, 0, 0), + (424, 300001, 0, 0, 0), + (424, 320002, 0, 0, 0), + (424, 330018, 0, 0, 0), + (424, 340002, 0, 0, 0), + (424, 1000075, 0, 0, 0), + (424, 1100014, 0, 0, 0), + (424, 1200001, 0, 0, 0), + (425, 1001, 0, 0, 0), + (425, 2001, 0, 0, 0), + (425, 4001, 0, 0, 0), + (425, 5001, 0, 0, 0), + (425, 6001, 0, 0, 0), + (425, 10003, 10, 0, 0), + (425, 10010, 11, 0, 0), + (425, 11004, 10, 0, 0), + (425, 11004, 11, 0, 0), + (425, 12031, 11, 0, 0), + (425, 12033, 10, 0, 0), + (425, 15001, 0, 0, 0), + (425, 20111, 0, 0, 0), + (425, 22014, 0, 0, 0), + (425, 31153, 0, 0, 0), + (425, 36001, 0, 0, 0), + (425, 37001, 0, 0, 0), + (425, 40062, 0, 0, 0), + (425, 100002, 10, 0, 0), + (425, 100002, 11, 0, 0), + (425, 110170, 10, 0, 0), + (425, 110170, 11, 0, 0), + (425, 130039, 0, 0, 0), + (425, 140019, 0, 0, 0), + (425, 160034, 0, 0, 0), + (425, 180059, 0, 0, 0), + (425, 190029, 0, 0, 0), + (425, 200012, 0, 0, 0), + (425, 230005, 0, 0, 0), + (425, 240002, 0, 0, 0), + (425, 250005, 0, 0, 0), + (425, 280004, 0, 0, 0), + (425, 290007, 0, 0, 0), + (425, 300011, 0, 0, 0), + (425, 320007, 0, 0, 0), + (425, 330033, 0, 0, 0), + (425, 340003, 0, 0, 0), + (425, 1000006, 0, 0, 0), + (425, 1100043, 0, 0, 0), + (425, 1200005, 0, 0, 0), + (426, 1001, 0, 0, 0), + (426, 2001, 0, 0, 0), + (426, 4001, 0, 0, 0), + (426, 5001, 0, 0, 0), + (426, 6001, 0, 0, 0), + (426, 10030, 10, 0, 0), + (426, 10030, 11, 0, 0), + (426, 11008, 10, 0, 0), + (426, 11008, 11, 0, 0), + (426, 12038, 11, 0, 0), + (426, 12040, 10, 0, 0), + (426, 13012, 10, 0, 0), + (426, 14003, 11, 0, 0), + (426, 15001, 0, 0, 0), + (426, 20134, 0, 0, 0), + (426, 22001, 0, 0, 0), + (426, 31153, 0, 0, 0), + (426, 36001, 0, 0, 0), + (426, 37001, 0, 0, 0), + (426, 40035, 0, 0, 0), + (426, 100005, 10, 0, 0), + (426, 100005, 11, 0, 0), + (426, 110109, 10, 0, 0), + (426, 110109, 11, 0, 0), + (426, 130046, 0, 0, 0), + (426, 140019, 0, 0, 0), + (426, 160078, 0, 0, 0), + (426, 180037, 0, 0, 0), + (426, 190069, 0, 0, 0), + (426, 200053, 0, 0, 0), + (426, 230003, 0, 0, 0), + (426, 240007, 0, 0, 0), + (426, 250007, 0, 0, 0), + (426, 280042, 0, 0, 0), + (426, 290005, 0, 0, 0), + (426, 300008, 0, 0, 0), + (426, 320012, 0, 0, 0), + (426, 330019, 0, 0, 0), + (426, 340003, 0, 0, 0), + (426, 1000011, 0, 0, 0), + (426, 1100045, 0, 0, 0), + (426, 1200039, 0, 0, 0), + (427, 1001, 0, 0, 0), + (427, 2001, 0, 0, 0), + (427, 4001, 0, 0, 0), + (427, 5001, 0, 0, 0), + (427, 6001, 0, 0, 0), + (427, 10012, 10, 0, 0), + (427, 10012, 11, 0, 0), + (427, 11004, 10, 0, 0), + (427, 11004, 11, 0, 0), + (427, 12031, 11, 0, 0), + (427, 12033, 10, 0, 0), + (427, 15001, 0, 0, 0), + (427, 20124, 0, 0, 0), + (427, 22005, 0, 0, 0), + (427, 31153, 0, 0, 0), + (427, 36001, 0, 0, 0), + (427, 37001, 0, 0, 0), + (427, 40014, 0, 0, 0), + (427, 100002, 10, 0, 0), + (427, 100002, 11, 0, 0), + (427, 110100, 10, 0, 0), + (427, 110101, 11, 0, 0), + (427, 130033, 0, 0, 0), + (427, 140008, 0, 0, 0), + (427, 160010, 0, 0, 0), + (427, 180055, 0, 0, 0), + (427, 190071, 0, 0, 0), + (427, 200056, 0, 0, 0), + (427, 230001, 0, 0, 0), + (427, 240001, 0, 0, 0), + (427, 250002, 0, 0, 0), + (427, 280044, 0, 0, 0), + (427, 290003, 0, 0, 0), + (427, 300001, 0, 0, 0), + (427, 320092, 0, 0, 0), + (427, 330052, 0, 0, 0), + (427, 340002, 0, 0, 0), + (427, 1000154, 0, 0, 0), + (427, 1100112, 0, 0, 0), + (427, 1200042, 0, 0, 0), + (428, 1001, 0, 0, 0), + (428, 2001, 0, 0, 0), + (428, 4001, 0, 0, 0), + (428, 5001, 0, 0, 0), + (428, 6001, 0, 0, 0), + (428, 10006, 11, 0, 0), + (428, 10015, 10, 0, 0), + (428, 11006, 10, 0, 0), + (428, 11006, 11, 0, 0), + (428, 12027, 11, 0, 0), + (428, 12030, 10, 0, 0), + (428, 13007, 10, 0, 0), + (428, 15001, 0, 0, 0), + (428, 20114, 0, 0, 0), + (428, 22009, 0, 0, 0), + (428, 31153, 0, 0, 0), + (428, 36001, 0, 0, 0), + (428, 37001, 0, 0, 0), + (428, 40018, 0, 0, 0), + (428, 100002, 10, 0, 0), + (428, 100002, 11, 0, 0), + (428, 110168, 10, 0, 0), + (428, 110168, 11, 0, 0), + (428, 130016, 0, 0, 0), + (428, 140009, 0, 0, 0), + (428, 160006, 0, 0, 0), + (428, 180014, 0, 0, 0), + (428, 190016, 0, 0, 0), + (428, 200002, 0, 0, 0), + (428, 230001, 0, 0, 0), + (428, 240001, 0, 0, 0), + (428, 250002, 0, 0, 0), + (428, 280024, 0, 0, 0), + (428, 290001, 0, 0, 0), + (428, 300001, 0, 0, 0), + (428, 320030, 0, 0, 0), + (428, 330013, 0, 0, 0), + (428, 340002, 0, 0, 0), + (428, 1000015, 0, 0, 0), + (428, 1100001, 0, 0, 0), + (428, 1200034, 0, 0, 0), + (429, 1001, 0, 0, 0), + (429, 2001, 0, 0, 0), + (429, 4001, 0, 0, 0), + (429, 5001, 0, 0, 0), + (429, 6001, 0, 0, 0), + (429, 10011, 10, 0, 0), + (429, 10011, 11, 0, 0), + (429, 11004, 10, 0, 0), + (429, 11004, 11, 0, 0), + (429, 12031, 10, 0, 0), + (429, 12031, 11, 0, 0), + (429, 15001, 0, 0, 0), + (429, 20115, 0, 0, 0), + (429, 22009, 0, 0, 0), + (429, 31153, 0, 0, 0), + (429, 36001, 0, 0, 0), + (429, 37001, 0, 0, 0), + (429, 40017, 0, 0, 0), + (429, 100004, 10, 0, 0), + (429, 100004, 11, 0, 0), + (429, 110091, 10, 0, 0), + (429, 110091, 11, 0, 0), + (429, 130021, 0, 0, 0), + (429, 140009, 0, 0, 0), + (429, 160006, 0, 0, 0), + (429, 180014, 0, 0, 0), + (429, 190016, 0, 0, 0), + (429, 200002, 0, 0, 0), + (429, 230001, 0, 0, 0), + (429, 240001, 0, 0, 0), + (429, 250002, 0, 0, 0), + (429, 280024, 0, 0, 0), + (429, 290004, 0, 0, 0), + (429, 300001, 0, 0, 0), + (429, 320030, 0, 0, 0), + (429, 330053, 0, 0, 0), + (429, 340002, 0, 0, 0), + (429, 1000015, 0, 0, 0), + (429, 1100001, 0, 0, 0), + (429, 1200034, 0, 0, 0), + (430, 1001, 0, 0, 0), + (430, 2001, 0, 0, 0), + (430, 4001, 0, 0, 0), + (430, 5001, 0, 0, 0), + (430, 6001, 0, 0, 0), + (430, 10011, 10, 0, 0), + (430, 10011, 11, 0, 0), + (430, 11004, 10, 0, 0), + (430, 11004, 11, 0, 0), + (430, 12031, 10, 0, 0), + (430, 12031, 11, 0, 0), + (430, 15001, 0, 0, 0), + (430, 20105, 0, 0, 0), + (430, 22014, 0, 0, 0), + (430, 31153, 0, 0, 0), + (430, 36001, 0, 0, 0), + (430, 37001, 0, 0, 0), + (430, 40007, 0, 0, 0), + (430, 100002, 10, 0, 0), + (430, 100002, 11, 0, 0), + (430, 110091, 10, 0, 0), + (430, 110091, 11, 0, 0), + (430, 130047, 0, 0, 0), + (430, 140008, 0, 0, 0), + (430, 160026, 0, 0, 0), + (430, 180018, 0, 0, 0), + (430, 190077, 0, 0, 0), + (430, 200066, 0, 0, 0), + (430, 230001, 0, 0, 0), + (430, 240001, 0, 0, 0), + (430, 250001, 0, 0, 0), + (430, 280030, 0, 0, 0), + (430, 290002, 0, 0, 0), + (430, 300001, 0, 0, 0), + (430, 320098, 0, 0, 0), + (430, 330058, 0, 0, 0), + (430, 340002, 0, 0, 0), + (430, 1000001, 0, 0, 0), + (430, 1100119, 0, 0, 0), + (430, 1200048, 0, 0, 0), + (431, 1001, 0, 0, 0), + (431, 2001, 0, 0, 0), + (431, 4001, 0, 0, 0), + (431, 5001, 0, 0, 0), + (431, 6001, 0, 0, 0), + (431, 10030, 10, 0, 0), + (431, 10030, 11, 0, 0), + (431, 11008, 10, 0, 0), + (431, 11008, 11, 0, 0), + (431, 12038, 11, 0, 0), + (431, 12040, 10, 0, 0), + (431, 15001, 0, 0, 0), + (431, 20128, 0, 0, 0), + (431, 22009, 0, 0, 0), + (431, 25005, 0, 0, 0), + (431, 31153, 0, 0, 0), + (431, 36001, 0, 0, 0), + (431, 37001, 0, 0, 0), + (431, 40023, 0, 0, 0), + (431, 100095, 10, 0, 0), + (431, 100095, 11, 0, 0), + (431, 110174, 10, 0, 0), + (431, 110174, 11, 0, 0), + (431, 130036, 0, 0, 0), + (431, 140020, 0, 0, 0), + (431, 160017, 0, 0, 0), + (431, 180013, 0, 0, 0), + (431, 190015, 0, 0, 0), + (431, 200051, 0, 0, 0), + (431, 230004, 0, 0, 0), + (431, 240006, 0, 0, 0), + (431, 250004, 0, 0, 0), + (431, 280006, 0, 0, 0), + (431, 290005, 0, 0, 0), + (431, 300008, 0, 0, 0), + (431, 320031, 0, 0, 0), + (431, 330027, 0, 0, 0), + (431, 340003, 0, 0, 0), + (431, 350005, 0, 0, 0), + (431, 1000025, 0, 0, 0), + (431, 1100014, 0, 0, 0), + (431, 1200024, 0, 0, 0), + (432, 1001, 0, 0, 0), + (432, 2001, 0, 0, 0), + (432, 4001, 0, 0, 0), + (432, 5001, 0, 0, 0), + (432, 6001, 0, 0, 0), + (432, 10009, 11, 0, 0), + (432, 10010, 10, 0, 0), + (432, 11004, 10, 0, 0), + (432, 11004, 11, 0, 0), + (432, 12004, 11, 0, 0), + (432, 12006, 10, 0, 0), + (432, 15001, 0, 0, 0), + (432, 20101, 0, 0, 0), + (432, 22016, 0, 0, 0), + (432, 23003, 0, 0, 0), + (432, 31153, 0, 0, 0), + (432, 34001, 10, 0, 0), + (432, 34001, 11, 0, 0), + (432, 35001, 10, 0, 0), + (432, 35001, 11, 0, 0), + (432, 36001, 0, 0, 0), + (432, 37001, 0, 0, 0), + (432, 40002, 0, 0, 0), + (432, 100002, 10, 0, 0), + (432, 100002, 11, 0, 0), + (432, 110047, 10, 0, 0), + (432, 110047, 11, 0, 0), + (432, 130012, 0, 0, 0), + (432, 140036, 0, 0, 0), + (432, 160021, 0, 0, 0), + (432, 180019, 0, 0, 0), + (432, 190021, 0, 0, 0), + (432, 200019, 0, 0, 0), + (432, 230002, 0, 0, 0), + (432, 240003, 0, 0, 0), + (432, 250001, 0, 0, 0), + (432, 280019, 0, 0, 0), + (432, 290001, 0, 0, 0), + (432, 300001, 0, 0, 0), + (432, 320023, 0, 0, 0), + (432, 330016, 0, 0, 0), + (432, 340001, 0, 0, 0), + (432, 1000002, 0, 0, 0), + (432, 1100016, 0, 0, 0), + (432, 1200018, 0, 0, 0), + (433, 1001, 0, 0, 0), + (433, 2001, 0, 0, 0), + (433, 4001, 0, 0, 0), + (433, 5001, 0, 0, 0), + (433, 6001, 0, 0, 0), + (433, 10009, 11, 0, 0), + (433, 10010, 10, 0, 0), + (433, 11004, 10, 0, 0), + (433, 11004, 11, 0, 0), + (433, 12007, 10, 0, 0), + (433, 12028, 11, 0, 0), + (433, 15001, 0, 0, 0), + (433, 20102, 0, 0, 0), + (433, 22016, 0, 0, 0), + (433, 23009, 0, 0, 0), + (433, 31153, 0, 0, 0), + (433, 35002, 10, 0, 0), + (433, 35002, 11, 0, 0), + (433, 36001, 0, 0, 0), + (433, 37001, 0, 0, 0), + (433, 40003, 0, 0, 0), + (433, 100002, 10, 0, 0), + (433, 100002, 11, 0, 0), + (433, 110013, 10, 0, 0), + (433, 110013, 11, 0, 0), + (433, 130012, 0, 0, 0), + (433, 140025, 0, 0, 0), + (433, 160021, 0, 0, 0), + (433, 180019, 0, 0, 0), + (433, 190021, 0, 0, 0), + (433, 200019, 0, 0, 0), + (433, 230002, 0, 0, 0), + (433, 240003, 0, 0, 0), + (433, 250001, 0, 0, 0), + (433, 280019, 0, 0, 0), + (433, 290001, 0, 0, 0), + (433, 300001, 0, 0, 0), + (433, 320023, 0, 0, 0), + (433, 330006, 0, 0, 0), + (433, 340001, 0, 0, 0), + (433, 1000002, 0, 0, 0), + (433, 1100016, 0, 0, 0), + (433, 1200018, 0, 0, 0), + (434, 1001, 0, 0, 0), + (434, 2001, 0, 0, 0), + (434, 4001, 0, 0, 0), + (434, 5001, 0, 0, 0), + (434, 6001, 0, 0, 0), + (434, 10001, 10, 0, 0), + (434, 10004, 11, 0, 0), + (434, 11004, 10, 0, 0), + (434, 11004, 11, 0, 0), + (434, 12007, 11, 0, 0), + (434, 12031, 10, 0, 0), + (434, 15001, 0, 0, 0), + (434, 18001, 0, 0, 0), + (434, 20104, 0, 0, 0), + (434, 22014, 0, 0, 0), + (434, 31153, 0, 0, 0), + (434, 36001, 0, 0, 0), + (434, 37001, 0, 0, 0), + (434, 40006, 0, 0, 0), + (434, 100006, 10, 0, 0), + (434, 100006, 11, 0, 0), + (434, 110067, 10, 0, 0), + (434, 110067, 11, 0, 0), + (434, 130047, 0, 0, 0), + (434, 140007, 0, 0, 0), + (434, 160026, 0, 0, 0), + (434, 180018, 0, 0, 0), + (434, 190077, 0, 0, 0), + (434, 200066, 0, 0, 0), + (434, 230001, 0, 0, 0), + (434, 240001, 0, 0, 0), + (434, 250001, 0, 0, 0), + (434, 280030, 0, 0, 0), + (434, 290002, 0, 0, 0), + (434, 300001, 0, 0, 0), + (434, 320098, 0, 0, 0), + (434, 330058, 0, 0, 0), + (434, 340002, 0, 0, 0), + (434, 1000001, 0, 0, 0), + (434, 1100119, 0, 0, 0), + (434, 1200048, 0, 0, 0), + (435, 1001, 0, 0, 0), + (435, 2001, 0, 0, 0), + (435, 4001, 0, 0, 0), + (435, 5001, 0, 0, 0), + (435, 6001, 0, 0, 0), + (435, 10011, 10, 0, 0), + (435, 10011, 11, 0, 0), + (435, 11004, 10, 0, 0), + (435, 11004, 11, 0, 0), + (435, 12025, 11, 0, 0), + (435, 12032, 10, 0, 0), + (435, 15001, 0, 0, 0), + (435, 20106, 0, 0, 0), + (435, 22014, 0, 0, 0), + (435, 31153, 0, 0, 0), + (435, 36001, 0, 0, 0), + (435, 37001, 0, 0, 0), + (435, 40008, 0, 0, 0), + (435, 100002, 10, 0, 0), + (435, 100002, 11, 0, 0), + (435, 110061, 10, 0, 0), + (435, 110061, 11, 0, 0), + (435, 130026, 0, 0, 0), + (435, 140019, 0, 0, 0), + (435, 160028, 0, 0, 0), + (435, 180018, 0, 0, 0), + (435, 190077, 0, 0, 0), + (435, 200066, 0, 0, 0), + (435, 230001, 0, 0, 0), + (435, 240001, 0, 0, 0), + (435, 250001, 0, 0, 0), + (435, 280030, 0, 0, 0), + (435, 290002, 0, 0, 0), + (435, 300001, 0, 0, 0), + (435, 320040, 0, 0, 0), + (435, 330035, 0, 0, 0), + (435, 340002, 0, 0, 0), + (435, 1000099, 0, 0, 0), + (435, 1100119, 0, 0, 0), + (435, 1200048, 0, 0, 0), + (436, 1001, 0, 0, 0), + (436, 2001, 0, 0, 0), + (436, 4001, 0, 0, 0), + (436, 5001, 0, 0, 0), + (436, 6001, 0, 0, 0), + (436, 10010, 10, 0, 0), + (436, 10010, 11, 0, 0), + (436, 11004, 10, 0, 0), + (436, 11004, 11, 0, 0), + (436, 12009, 11, 0, 0), + (436, 12032, 10, 0, 0), + (436, 15001, 0, 0, 0), + (436, 20109, 0, 0, 0), + (436, 22014, 0, 0, 0), + (436, 31153, 0, 0, 0), + (436, 36001, 0, 0, 0), + (436, 37001, 0, 0, 0), + (436, 40011, 0, 0, 0), + (436, 100002, 10, 0, 0), + (436, 100002, 11, 0, 0), + (436, 110067, 10, 0, 0), + (436, 110067, 11, 0, 0), + (436, 130034, 0, 0, 0), + (436, 140019, 0, 0, 0), + (436, 160025, 0, 0, 0), + (436, 180030, 0, 0, 0), + (436, 190020, 0, 0, 0), + (436, 200004, 0, 0, 0), + (436, 230001, 0, 0, 0), + (436, 240001, 0, 0, 0), + (436, 250001, 0, 0, 0), + (436, 280018, 0, 0, 0), + (436, 290001, 0, 0, 0), + (436, 300001, 0, 0, 0), + (436, 320022, 0, 0, 0), + (436, 330003, 0, 0, 0), + (436, 340002, 0, 0, 0), + (436, 1000138, 0, 0, 0), + (436, 1100005, 0, 0, 0), + (436, 1200017, 0, 0, 0), + (437, 1001, 0, 0, 0), + (437, 2001, 0, 0, 0), + (437, 4001, 0, 0, 0), + (437, 5001, 0, 0, 0), + (437, 6001, 0, 0, 0), + (437, 10002, 10, 0, 0), + (437, 10010, 11, 0, 0), + (437, 11006, 10, 0, 0), + (437, 11006, 11, 0, 0), + (437, 12032, 11, 0, 0), + (437, 12033, 10, 0, 0), + (437, 15001, 0, 0, 0), + (437, 20211, 0, 0, 0), + (437, 22014, 0, 0, 0), + (437, 30001, 11, 0, 0), + (437, 31153, 0, 0, 0), + (437, 36001, 0, 0, 0), + (437, 37001, 0, 0, 0), + (437, 40039, 0, 0, 0), + (437, 100002, 10, 0, 0), + (437, 100002, 11, 0, 0), + (437, 110061, 10, 0, 0), + (437, 110061, 11, 0, 0), + (437, 130034, 0, 0, 0), + (437, 140009, 0, 0, 0), + (437, 160033, 0, 0, 0), + (437, 180051, 0, 0, 0), + (437, 190027, 0, 0, 0), + (437, 200028, 0, 0, 0), + (437, 230001, 0, 0, 0), + (437, 240001, 0, 0, 0), + (437, 250001, 0, 0, 0), + (437, 280008, 0, 0, 0), + (437, 290002, 0, 0, 0), + (437, 300002, 0, 0, 0), + (437, 320011, 0, 0, 0), + (437, 330033, 0, 0, 0), + (437, 340003, 0, 0, 0), + (437, 1000005, 0, 0, 0), + (437, 1100040, 0, 0, 0), + (437, 1200029, 0, 0, 0), + (438, 1001, 0, 0, 0), + (438, 2001, 0, 0, 0), + (438, 4001, 0, 0, 0), + (438, 5001, 0, 0, 0), + (438, 6001, 0, 0, 0), + (438, 10010, 11, 0, 0), + (438, 10017, 10, 0, 0), + (438, 11009, 10, 0, 0), + (438, 11009, 11, 0, 0), + (438, 12008, 11, 0, 0), + (438, 12031, 10, 0, 0), + (438, 13007, 11, 0, 0), + (438, 13009, 10, 0, 0), + (438, 15001, 0, 0, 0), + (438, 20111, 0, 0, 0), + (438, 22014, 0, 0, 0), + (438, 29002, 10, 0, 0), + (438, 30003, 11, 0, 0), + (438, 31153, 0, 0, 0), + (438, 36001, 0, 0, 0), + (438, 37001, 0, 0, 0), + (438, 40013, 0, 0, 0), + (438, 100112, 10, 0, 0), + (438, 100112, 11, 0, 0), + (438, 110094, 10, 0, 0), + (438, 110095, 11, 0, 0), + (438, 130034, 0, 0, 0), + (438, 140009, 0, 0, 0), + (438, 160027, 0, 0, 0), + (438, 180034, 0, 0, 0), + (438, 190001, 0, 0, 0), + (438, 200054, 0, 0, 0), + (438, 230003, 0, 0, 0), + (438, 240005, 0, 0, 0), + (438, 250001, 0, 0, 0), + (438, 280041, 0, 0, 0), + (438, 290002, 0, 0, 0), + (438, 300011, 0, 0, 0), + (438, 320087, 0, 0, 0), + (438, 330025, 0, 0, 0), + (438, 340003, 0, 0, 0), + (438, 1000139, 0, 0, 0), + (438, 1100005, 0, 0, 0), + (438, 1200038, 0, 0, 0), + (439, 1001, 0, 0, 0), + (439, 2001, 0, 0, 0), + (439, 4001, 0, 0, 0), + (439, 5001, 0, 0, 0), + (439, 6001, 0, 0, 0), + (439, 10011, 10, 0, 0), + (439, 10011, 11, 0, 0), + (439, 11004, 10, 0, 0), + (439, 11004, 11, 0, 0), + (439, 12008, 11, 0, 0), + (439, 12032, 10, 0, 0), + (439, 15001, 0, 0, 0), + (439, 20116, 0, 0, 0), + (439, 22009, 0, 0, 0), + (439, 31153, 0, 0, 0), + (439, 36001, 0, 0, 0), + (439, 37001, 0, 0, 0), + (439, 40022, 0, 0, 0), + (439, 100001, 10, 0, 0), + (439, 100001, 11, 0, 0), + (439, 110064, 10, 0, 0), + (439, 110064, 11, 0, 0), + (439, 130022, 0, 0, 0), + (439, 140009, 0, 0, 0), + (439, 160009, 0, 0, 0), + (439, 180014, 0, 0, 0), + (439, 190016, 0, 0, 0), + (439, 200002, 0, 0, 0), + (439, 230001, 0, 0, 0), + (439, 240006, 0, 0, 0), + (439, 250002, 0, 0, 0), + (439, 280016, 0, 0, 0), + (439, 290004, 0, 0, 0), + (439, 300001, 0, 0, 0), + (439, 320020, 0, 0, 0), + (439, 330053, 0, 0, 0), + (439, 340002, 0, 0, 0), + (439, 1000121, 0, 0, 0), + (439, 1100001, 0, 0, 0), + (439, 1200034, 0, 0, 0), + (440, 1001, 0, 0, 0), + (440, 2001, 0, 0, 0), + (440, 4001, 0, 0, 0), + (440, 5001, 0, 0, 0), + (440, 6001, 0, 0, 0), + (440, 10002, 10, 0, 0), + (440, 10010, 11, 0, 0), + (440, 11004, 10, 0, 0), + (440, 11004, 11, 0, 0), + (440, 12007, 11, 0, 0), + (440, 12032, 10, 0, 0), + (440, 13009, 10, 0, 0), + (440, 15001, 0, 0, 0), + (440, 20121, 0, 0, 0), + (440, 22009, 0, 0, 0), + (440, 31153, 0, 0, 0), + (440, 36001, 0, 0, 0), + (440, 37001, 0, 0, 0), + (440, 40030, 0, 0, 0), + (440, 100002, 10, 0, 0), + (440, 100002, 11, 0, 0), + (440, 110061, 10, 0, 0), + (440, 110061, 11, 0, 0), + (440, 130023, 0, 0, 0), + (440, 140007, 0, 0, 0), + (440, 160012, 0, 0, 0), + (440, 180003, 0, 0, 0), + (440, 190016, 0, 0, 0), + (440, 200002, 0, 0, 0), + (440, 230001, 0, 0, 0), + (440, 240006, 0, 0, 0), + (440, 250002, 0, 0, 0), + (440, 280016, 0, 0, 0), + (440, 290004, 0, 0, 0), + (440, 300001, 0, 0, 0), + (440, 320020, 0, 0, 0), + (440, 330008, 0, 0, 0), + (440, 340002, 0, 0, 0), + (440, 1000122, 0, 0, 0), + (440, 1100001, 0, 0, 0), + (440, 1200034, 0, 0, 0), + (441, 1001, 0, 0, 0), + (441, 2001, 0, 0, 0), + (441, 4001, 0, 0, 0), + (441, 5001, 0, 0, 0), + (441, 6001, 0, 0, 0), + (441, 10021, 10, 0, 0), + (441, 10026, 11, 0, 0), + (441, 11006, 10, 0, 0), + (441, 11006, 11, 0, 0), + (441, 12008, 10, 0, 0), + (441, 12009, 11, 0, 0), + (441, 15001, 0, 0, 0), + (441, 20117, 0, 0, 0), + (441, 22009, 0, 0, 0), + (441, 31153, 0, 0, 0), + (441, 36001, 0, 0, 0), + (441, 37001, 0, 0, 0), + (441, 40021, 0, 0, 0), + (441, 100002, 10, 0, 0), + (441, 100002, 11, 0, 0), + (441, 110173, 10, 0, 0), + (441, 110173, 11, 0, 0), + (441, 130016, 0, 0, 0), + (441, 140009, 0, 0, 0), + (441, 160009, 0, 0, 0), + (441, 180014, 0, 0, 0), + (441, 190016, 0, 0, 0), + (441, 200002, 0, 0, 0), + (441, 230001, 0, 0, 0), + (441, 240006, 0, 0, 0), + (441, 250002, 0, 0, 0), + (441, 280024, 0, 0, 0), + (441, 290004, 0, 0, 0), + (441, 300001, 0, 0, 0), + (441, 320030, 0, 0, 0), + (441, 330057, 0, 0, 0), + (441, 340003, 0, 0, 0), + (441, 1000073, 0, 0, 0), + (441, 1100025, 0, 0, 0), + (441, 1200023, 0, 0, 0), + (1001, 11004, 10, 0, 0), + (1001, 11004, 11, 0, 0), + (1001, 12006, 11, 0, 0), + (1001, 12009, 10, 0, 0), + (4001, 130012, 0, 0, 0), + (4001, 140014, 0, 0, 0), + (5001, 10021, 10, 0, 0), + (5001, 10026, 11, 0, 0), + (15001, 100002, 10, 0, 0), + (15001, 100002, 11, 0, 0), + (15001, 110027, 10, 1, 1), + (15001, 110027, 11, 0, 0), + (36002, 160021, 0, 0, 0), + (36002, 180019, 0, 0, 0), + (36002, 190021, 0, 0, 0), + (36002, 200019, 0, 0, 0), + (36002, 230001, 0, 0, 0), + (36002, 240003, 0, 0, 0), + (36002, 250001, 0, 0, 0), + (36002, 280019, 0, 0, 0), + (36002, 320023, 0, 0, 0), + (36002, 330016, 0, 0, 0), + (36002, 340001, 0, 0, 0), + (36002, 1000002, 0, 0, 0), + (36002, 1100016, 0, 0, 0), + (36002, 1200018, 0, 0, 0), + (36003, 160021, 0, 0, 0), + (36003, 180019, 0, 0, 0), + (36003, 190021, 0, 0, 0), + (36003, 200019, 0, 0, 0), + (36003, 230001, 0, 0, 0), + (36003, 240003, 0, 0, 0), + (36003, 250001, 0, 0, 0), + (36003, 280019, 0, 0, 0), + (36003, 320023, 0, 0, 0), + (36003, 330006, 0, 0, 0), + (36003, 340001, 0, 0, 0), + (36003, 1000020, 0, 0, 0), + (36003, 1100016, 0, 0, 0), + (36003, 1200018, 0, 0, 0), + (36004, 160047, 0, 0, 0), + (36004, 180019, 0, 0, 0), + (36004, 190021, 0, 0, 0), + (36004, 200019, 0, 0, 0), + (36004, 230002, 0, 0, 0), + (36004, 240001, 0, 0, 0), + (36004, 250001, 0, 0, 0), + (36004, 280019, 0, 0, 0), + (36004, 320023, 0, 0, 0), + (36004, 330005, 0, 0, 0), + (36004, 340001, 0, 0, 0), + (36004, 1000003, 0, 0, 0), + (36004, 1100016, 0, 0, 0), + (36004, 1200018, 0, 0, 0), + (36005, 160022, 0, 0, 0), + (36005, 180019, 0, 0, 0), + (36005, 190021, 0, 0, 0), + (36005, 200019, 0, 0, 0), + (36005, 230001, 0, 0, 0), + (36005, 240003, 0, 0, 0), + (36005, 250001, 0, 0, 0), + (36005, 280019, 0, 0, 0), + (36005, 320023, 0, 0, 0), + (36005, 330006, 0, 0, 0), + (36005, 340001, 0, 0, 0), + (36005, 1000002, 0, 0, 0), + (36005, 1100016, 0, 0, 0), + (36005, 1200018, 0, 0, 0), + (36006, 160028, 0, 0, 0), + (36006, 180018, 0, 0, 0), + (36006, 190077, 0, 0, 0), + (36006, 200042, 0, 0, 0), + (36006, 230001, 0, 0, 0), + (36006, 240001, 0, 0, 0), + (36006, 250001, 0, 0, 0), + (36006, 280030, 0, 0, 0), + (36006, 320040, 0, 0, 0), + (36006, 330035, 0, 0, 0), + (36006, 340002, 0, 0, 0), + (36006, 1000099, 0, 0, 0), + (36006, 1100119, 0, 0, 0), + (36006, 1200048, 0, 0, 0), + (36007, 160032, 0, 0, 0), + (36007, 180035, 0, 0, 0), + (36007, 190019, 0, 0, 0), + (36007, 200028, 0, 0, 0), + (36007, 230003, 0, 0, 0), + (36007, 240006, 0, 0, 0), + (36007, 250006, 0, 0, 0), + (36007, 280031, 0, 0, 0), + (36007, 320006, 0, 0, 0), + (36007, 330022, 0, 0, 0), + (36007, 340003, 0, 0, 0), + (36007, 1000005, 0, 0, 0), + (36007, 1100040, 0, 0, 0), + (36007, 1200029, 0, 0, 0), + (36008, 160025, 0, 0, 0), + (36008, 180030, 0, 0, 0), + (36008, 190020, 0, 0, 0), + (36008, 200004, 0, 0, 0), + (36008, 230001, 0, 0, 0), + (36008, 240001, 0, 0, 0), + (36008, 250001, 0, 0, 0), + (36008, 280018, 0, 0, 0), + (36008, 320022, 0, 0, 0), + (36008, 330003, 0, 0, 0), + (36008, 340002, 0, 0, 0), + (36008, 1000137, 0, 0, 0), + (36008, 1100005, 0, 0, 0), + (36008, 1200017, 0, 0, 0), + (36009, 160027, 0, 0, 0), + (36009, 180030, 0, 0, 0), + (36009, 190020, 0, 0, 0), + (36009, 200004, 0, 0, 0), + (36009, 230001, 0, 0, 0), + (36009, 240001, 0, 0, 0), + (36009, 250001, 0, 0, 0), + (36009, 280018, 0, 0, 0), + (36009, 320022, 0, 0, 0), + (36009, 330042, 0, 0, 0), + (36009, 340002, 0, 0, 0), + (36009, 1000137, 0, 0, 0), + (36009, 1100005, 0, 0, 0), + (36009, 1200017, 0, 0, 0), + (36010, 160082, 0, 0, 0), + (36010, 180059, 0, 0, 0), + (36010, 190029, 0, 0, 0), + (36010, 200012, 0, 0, 0), + (36010, 230005, 0, 0, 0), + (36010, 240002, 0, 0, 0), + (36010, 250005, 0, 0, 0), + (36010, 280004, 0, 0, 0), + (36010, 320007, 0, 0, 0), + (36010, 330033, 0, 0, 0), + (36010, 340003, 0, 0, 0), + (36010, 1000006, 0, 0, 0), + (36010, 1100043, 0, 0, 0), + (36010, 1200005, 0, 0, 0), + (36011, 160048, 0, 0, 0), + (36011, 180022, 0, 0, 0), + (36011, 190068, 0, 0, 0), + (36011, 200022, 0, 0, 0), + (36011, 230001, 0, 0, 0), + (36011, 240001, 0, 0, 0), + (36011, 250003, 0, 0, 0), + (36011, 280022, 0, 0, 0), + (36011, 320026, 0, 0, 0), + (36011, 330020, 0, 0, 0), + (36011, 340002, 0, 0, 0), + (36011, 1000007, 0, 0, 0), + (36011, 1100019, 0, 0, 0), + (36011, 1200021, 0, 0, 0), + (36012, 160049, 0, 0, 0), + (36012, 180022, 0, 0, 0), + (36012, 190068, 0, 0, 0), + (36012, 200022, 0, 0, 0), + (36012, 230001, 0, 0, 0), + (36012, 240001, 0, 0, 0), + (36012, 250003, 0, 0, 0), + (36012, 280022, 0, 0, 0), + (36012, 320026, 0, 0, 0), + (36012, 330020, 0, 0, 0), + (36012, 340002, 0, 0, 0), + (36012, 1000008, 0, 0, 0), + (36012, 1100019, 0, 0, 0), + (36012, 1200021, 0, 0, 0), + (36013, 160013, 0, 0, 0), + (36013, 180012, 0, 0, 0), + (36013, 190014, 0, 0, 0), + (36013, 200018, 0, 0, 0), + (36013, 230001, 0, 0, 0), + (36013, 240001, 0, 0, 0), + (36013, 250002, 0, 0, 0), + (36013, 280015, 0, 0, 0), + (36013, 320021, 0, 0, 0), + (36013, 330008, 0, 0, 0), + (36013, 340002, 0, 0, 0), + (36013, 1000068, 0, 0, 0), + (36013, 1100013, 0, 0, 0), + (36013, 1200014, 0, 0, 0), + (36014, 160054, 0, 0, 0), + (36014, 180016, 0, 0, 0), + (36014, 190018, 0, 0, 0), + (36014, 200006, 0, 0, 0), + (36014, 230001, 0, 0, 0), + (36014, 240001, 0, 0, 0), + (36014, 250002, 0, 0, 0), + (36014, 280003, 0, 0, 0), + (36014, 320003, 0, 0, 0), + (36014, 330052, 0, 0, 0), + (36014, 340002, 0, 0, 0), + (36014, 1000119, 0, 0, 0), + (36014, 1100002, 0, 0, 0), + (36014, 1200002, 0, 0, 0), + (36015, 160055, 0, 0, 0), + (36015, 180015, 0, 0, 0), + (36015, 190017, 0, 0, 0), + (36015, 200029, 0, 0, 0), + (36015, 230001, 0, 0, 0), + (36015, 240005, 0, 0, 0), + (36015, 250002, 0, 0, 0), + (36015, 280034, 0, 0, 0), + (36015, 320089, 0, 0, 0), + (36015, 330034, 0, 0, 0), + (36015, 340002, 0, 0, 0), + (36015, 1000113, 0, 0, 0), + (36015, 1000120, 0, 0, 0), + (36015, 1100044, 0, 0, 0), + (36015, 1200015, 0, 0, 0), + (36016, 160078, 0, 0, 0), + (36016, 180037, 0, 0, 0), + (36016, 190069, 0, 0, 0), + (36016, 200053, 0, 0, 0), + (36016, 230003, 0, 0, 0), + (36016, 240007, 0, 0, 0), + (36016, 250007, 0, 0, 0), + (36016, 280042, 0, 0, 0), + (36016, 320065, 0, 0, 0), + (36016, 330019, 0, 0, 0), + (36016, 340003, 0, 0, 0), + (36016, 1000011, 0, 0, 0), + (36016, 1000021, 0, 0, 0), + (36016, 1100045, 0, 0, 0), + (36016, 1200039, 0, 0, 0), + (36017, 160057, 0, 0, 0), + (36017, 180016, 0, 0, 0), + (36017, 190018, 0, 0, 0), + (36017, 200006, 0, 0, 0), + (36017, 230001, 0, 0, 0), + (36017, 240001, 0, 0, 0), + (36017, 250002, 0, 0, 0), + (36017, 280003, 0, 0, 0), + (36017, 320003, 0, 0, 0), + (36017, 330034, 0, 0, 0), + (36017, 340002, 0, 0, 0), + (36017, 1000117, 0, 0, 0), + (36017, 1100002, 0, 0, 0), + (36017, 1200002, 0, 0, 0), + (36018, 160057, 0, 0, 0), + (36018, 180016, 0, 0, 0), + (36018, 190018, 0, 0, 0), + (36018, 200006, 0, 0, 0), + (36018, 230003, 0, 0, 0), + (36018, 240005, 0, 0, 0), + (36018, 250002, 0, 0, 0), + (36018, 280003, 0, 0, 0), + (36018, 320052, 0, 0, 0), + (36018, 330021, 0, 0, 0), + (36018, 340002, 0, 0, 0), + (36018, 1000012, 0, 0, 0), + (36018, 1100048, 0, 0, 0), + (36018, 1200002, 0, 0, 0), + (36019, 160010, 0, 0, 0), + (36019, 180055, 0, 0, 0), + (36019, 190071, 0, 0, 0), + (36019, 200056, 0, 0, 0), + (36019, 230001, 0, 0, 0), + (36019, 240001, 0, 0, 0), + (36019, 250002, 0, 0, 0), + (36019, 280044, 0, 0, 0), + (36019, 320092, 0, 0, 0), + (36019, 330052, 0, 0, 0), + (36019, 340002, 0, 0, 0), + (36019, 1000154, 0, 0, 0), + (36019, 1100112, 0, 0, 0), + (36019, 1200042, 0, 0, 0), + (36020, 160001, 0, 0, 0), + (36020, 180049, 0, 0, 0), + (36020, 190013, 0, 0, 0), + (36020, 200059, 0, 0, 0), + (36020, 230001, 0, 0, 0), + (36020, 240001, 0, 0, 0), + (36020, 250002, 0, 0, 0), + (36020, 280045, 0, 0, 0), + (36020, 320033, 0, 0, 0), + (36020, 330034, 0, 0, 0), + (36020, 340002, 0, 0, 0), + (36020, 1000060, 0, 0, 0), + (36020, 1100113, 0, 0, 0), + (36020, 1200013, 0, 0, 0), + (36021, 160006, 0, 0, 0), + (36021, 180014, 0, 0, 0), + (36021, 190016, 0, 0, 0), + (36021, 200002, 0, 0, 0), + (36021, 230001, 0, 0, 0), + (36021, 240001, 0, 0, 0), + (36021, 250002, 0, 0, 0), + (36021, 280024, 0, 0, 0), + (36021, 320030, 0, 0, 0), + (36021, 330013, 0, 0, 0), + (36021, 340002, 0, 0, 0), + (36021, 1000015, 0, 0, 0), + (36021, 1100001, 0, 0, 0), + (36021, 1200034, 0, 0, 0), + (36022, 160013, 0, 0, 0), + (36022, 180012, 0, 0, 0), + (36022, 190014, 0, 0, 0), + (36022, 200018, 0, 0, 0), + (36022, 230001, 0, 0, 0), + (36022, 240001, 0, 0, 0), + (36022, 250002, 0, 0, 0), + (36022, 280015, 0, 0, 0), + (36022, 320021, 0, 0, 0), + (36022, 330029, 0, 0, 0), + (36022, 340002, 0, 0, 0), + (36022, 1000068, 0, 0, 0), + (36022, 1100013, 0, 0, 0), + (36022, 1200014, 0, 0, 0), + (36023, 160009, 0, 0, 0), + (36023, 180014, 0, 0, 0), + (36023, 190016, 0, 0, 0), + (36023, 200002, 0, 0, 0), + (36023, 230001, 0, 0, 0), + (36023, 240006, 0, 0, 0), + (36023, 250002, 0, 0, 0), + (36023, 280016, 0, 0, 0), + (36023, 320020, 0, 0, 0), + (36023, 330053, 0, 0, 0), + (36023, 340002, 0, 0, 0), + (36023, 1000121, 0, 0, 0), + (36023, 1100001, 0, 0, 0), + (36023, 1200034, 0, 0, 0), + (36024, 160039, 0, 0, 0), + (36024, 180023, 0, 0, 0), + (36024, 190006, 0, 0, 0), + (36024, 200023, 0, 0, 0), + (36024, 230001, 0, 0, 0), + (36024, 240005, 0, 0, 0), + (36024, 250002, 0, 0, 0), + (36024, 280023, 0, 0, 0), + (36024, 320027, 0, 0, 0), + (36024, 330043, 0, 0, 0), + (36024, 340002, 0, 0, 0), + (36024, 1000018, 0, 0, 0), + (36024, 1100020, 0, 0, 0), + (36024, 1200035, 0, 0, 0), + (36025, 160014, 0, 0, 0), + (36025, 180013, 0, 0, 0), + (36025, 190015, 0, 0, 0), + (36025, 200046, 0, 0, 0), + (36025, 230003, 0, 0, 0), + (36025, 240006, 0, 0, 0), + (36025, 250002, 0, 0, 0), + (36025, 280002, 0, 0, 0), + (36025, 320031, 0, 0, 0), + (36025, 330033, 0, 0, 0), + (36025, 340003, 0, 0, 0), + (36025, 1000019, 0, 0, 0), + (36025, 1100014, 0, 0, 0), + (36025, 1200001, 0, 0, 0), + (36026, 25006, 0, 0, 0), + (36026, 160040, 0, 0, 0), + (36026, 180023, 0, 0, 0), + (36026, 190006, 0, 0, 0), + (36026, 200023, 0, 0, 0), + (36026, 200027, 0, 0, 0), + (36026, 230001, 0, 0, 0), + (36026, 240006, 0, 0, 0), + (36026, 250002, 0, 0, 0), + (36026, 280028, 0, 0, 0), + (36026, 320027, 0, 0, 0), + (36026, 330043, 0, 0, 0), + (36026, 340002, 0, 0, 0), + (36026, 1000051, 0, 0, 0), + (36026, 1100034, 0, 0, 0), + (36026, 1200035, 0, 0, 0), + (36027, 160012, 0, 0, 0), + (36027, 180003, 0, 0, 0), + (36027, 190016, 0, 0, 0), + (36027, 200002, 0, 0, 0), + (36027, 230001, 0, 0, 0), + (36027, 240006, 0, 0, 0), + (36027, 250002, 0, 0, 0), + (36027, 280016, 0, 0, 0), + (36027, 320020, 0, 0, 0), + (36027, 330008, 0, 0, 0), + (36027, 340002, 0, 0, 0), + (36027, 1000122, 0, 0, 0), + (36027, 1100001, 0, 0, 0), + (36027, 1200034, 0, 0, 0), + (36028, 160038, 0, 0, 0), + (36028, 180026, 0, 0, 0), + (36028, 190022, 0, 0, 0), + (36028, 200020, 0, 0, 0), + (36028, 230003, 0, 0, 0), + (36028, 240006, 0, 0, 0), + (36028, 250002, 0, 0, 0), + (36028, 280020, 0, 0, 0), + (36028, 320024, 0, 0, 0), + (36028, 330043, 0, 0, 0), + (36028, 340002, 0, 0, 0), + (36028, 1000017, 0, 0, 0), + (36028, 1100017, 0, 0, 0), + (36028, 1200019, 0, 0, 0), + (36029, 160042, 0, 0, 0), + (36029, 180028, 0, 0, 0), + (36029, 190025, 0, 0, 0), + (36029, 200027, 0, 0, 0), + (36029, 230003, 0, 0, 0), + (36029, 240005, 0, 0, 0), + (36029, 250002, 0, 0, 0), + (36029, 280029, 0, 0, 0), + (36029, 320039, 0, 0, 0), + (36029, 330043, 0, 0, 0), + (36029, 340003, 0, 0, 0), + (36029, 1000092, 0, 0, 0), + (36029, 1100037, 0, 0, 0), + (36029, 1200035, 0, 0, 0), + (36030, 160001, 0, 0, 0), + (36030, 180049, 0, 0, 0), + (36030, 190013, 0, 0, 0), + (36030, 200060, 0, 0, 0), + (36030, 230001, 0, 0, 0), + (36030, 240001, 0, 0, 0), + (36030, 250002, 0, 0, 0), + (36030, 280045, 0, 0, 0), + (36030, 320033, 0, 0, 0), + (36030, 330034, 0, 0, 0), + (36030, 340002, 0, 0, 0), + (36030, 1000060, 0, 0, 0), + (36030, 1100113, 0, 0, 0), + (36030, 1200013, 0, 0, 0), + (36031, 160005, 0, 0, 0), + (36031, 180014, 0, 0, 0), + (36031, 190016, 0, 0, 0), + (36031, 200002, 0, 0, 0), + (36031, 230002, 0, 0, 0), + (36031, 240001, 0, 0, 0), + (36031, 250002, 0, 0, 0), + (36031, 280016, 0, 0, 0), + (36031, 320020, 0, 0, 0), + (36031, 330054, 0, 0, 0), + (36031, 340001, 0, 0, 0), + (36031, 1000069, 0, 0, 0), + (36031, 1100001, 0, 0, 0), + (36031, 1200034, 0, 0, 0), + (36032, 160005, 0, 0, 0), + (36032, 180014, 0, 0, 0), + (36032, 190016, 0, 0, 0), + (36032, 200002, 0, 0, 0), + (36032, 230002, 0, 0, 0), + (36032, 240001, 0, 0, 0), + (36032, 250002, 0, 0, 0), + (36032, 280016, 0, 0, 0), + (36032, 320020, 0, 0, 0), + (36032, 330020, 0, 0, 0), + (36032, 340001, 0, 0, 0), + (36032, 1000069, 0, 0, 0), + (36032, 1100001, 0, 0, 0), + (36032, 1200034, 0, 0, 0), + (36033, 160005, 0, 0, 0), + (36033, 180014, 0, 0, 0), + (36033, 190016, 0, 0, 0), + (36033, 200002, 0, 0, 0), + (36033, 230001, 0, 0, 0), + (36033, 240001, 0, 0, 0), + (36033, 250002, 0, 0, 0), + (36033, 280016, 0, 0, 0), + (36033, 320020, 0, 0, 0), + (36033, 330053, 0, 0, 0), + (36033, 340002, 0, 0, 0), + (36033, 1000069, 0, 0, 0), + (36033, 1100001, 0, 0, 0), + (36033, 1200023, 0, 0, 0), + (36034, 160006, 0, 0, 0), + (36034, 180014, 0, 0, 0), + (36034, 190016, 0, 0, 0), + (36034, 200002, 0, 0, 0), + (36034, 230001, 0, 0, 0), + (36034, 240001, 0, 0, 0), + (36034, 250002, 0, 0, 0), + (36034, 280024, 0, 0, 0), + (36034, 320020, 0, 0, 0), + (36034, 330054, 0, 0, 0), + (36034, 340002, 0, 0, 0), + (36034, 1000123, 0, 0, 0), + (36034, 1100022, 0, 0, 0), + (36034, 1200034, 0, 0, 0), + (36035, 160006, 0, 0, 0), + (36035, 180014, 0, 0, 0), + (36035, 190016, 0, 0, 0), + (36035, 200002, 0, 0, 0), + (36035, 230001, 0, 0, 0), + (36035, 240001, 0, 0, 0), + (36035, 250002, 0, 0, 0), + (36035, 280024, 0, 0, 0), + (36035, 320020, 0, 0, 0), + (36035, 330056, 0, 0, 0), + (36035, 340002, 0, 0, 0), + (36035, 1000015, 0, 0, 0), + (36035, 1100022, 0, 0, 0), + (36035, 1200034, 0, 0, 0), + (36036, 160006, 0, 0, 0), + (36036, 180014, 0, 0, 0), + (36036, 190016, 0, 0, 0), + (36036, 200002, 0, 0, 0), + (36036, 230001, 0, 0, 0), + (36036, 240001, 0, 0, 0), + (36036, 250002, 0, 0, 0), + (36036, 280024, 0, 0, 0), + (36036, 320020, 0, 0, 0), + (36036, 330055, 0, 0, 0), + (36036, 340002, 0, 0, 0), + (36036, 1000015, 0, 0, 0), + (36036, 1100022, 0, 0, 0), + (36036, 1200034, 0, 0, 0), + (36037, 160006, 0, 0, 0), + (36037, 180014, 0, 0, 0), + (36037, 190016, 0, 0, 0), + (36037, 200002, 0, 0, 0), + (36037, 230001, 0, 0, 0), + (36037, 240001, 0, 0, 0), + (36037, 250002, 0, 0, 0), + (36037, 280024, 0, 0, 0), + (36037, 320020, 0, 0, 0), + (36037, 330055, 0, 0, 0), + (36037, 340002, 0, 0, 0), + (36037, 1000123, 0, 0, 0), + (36037, 1100025, 0, 0, 0), + (36037, 1200034, 0, 0, 0), + (36038, 160006, 0, 0, 0), + (36038, 180014, 0, 0, 0), + (36038, 190016, 0, 0, 0), + (36038, 200002, 0, 0, 0), + (36038, 230001, 0, 0, 0), + (36038, 240001, 0, 0, 0), + (36038, 250002, 0, 0, 0), + (36038, 280024, 0, 0, 0), + (36038, 320030, 0, 0, 0), + (36038, 330013, 0, 0, 0), + (36038, 340002, 0, 0, 0), + (36038, 1000071, 0, 0, 0), + (36038, 1100025, 0, 0, 0), + (36038, 1200034, 0, 0, 0), + (36039, 160006, 0, 0, 0), + (36039, 180014, 0, 0, 0), + (36039, 190016, 0, 0, 0), + (36039, 200002, 0, 0, 0), + (36039, 230001, 0, 0, 0), + (36039, 240001, 0, 0, 0), + (36039, 250002, 0, 0, 0), + (36039, 280024, 0, 0, 0), + (36039, 320030, 0, 0, 0), + (36039, 330057, 0, 0, 0), + (36039, 340002, 0, 0, 0), + (36039, 1000071, 0, 0, 0), + (36039, 1100025, 0, 0, 0), + (36039, 1200034, 0, 0, 0), + (36040, 160006, 0, 0, 0), + (36040, 180014, 0, 0, 0), + (36040, 190016, 0, 0, 0), + (36040, 200002, 0, 0, 0), + (36040, 230001, 0, 0, 0), + (36040, 240001, 0, 0, 0), + (36040, 250002, 0, 0, 0), + (36040, 280024, 0, 0, 0), + (36040, 320030, 0, 0, 0), + (36040, 330057, 0, 0, 0), + (36040, 340002, 0, 0, 0), + (36040, 1000072, 0, 0, 0), + (36040, 1100022, 0, 0, 0), + (36040, 1200034, 0, 0, 0), + (36041, 160006, 0, 0, 0), + (36041, 180014, 0, 0, 0), + (36041, 190016, 0, 0, 0), + (36041, 200002, 0, 0, 0), + (36041, 230001, 0, 0, 0), + (36041, 240001, 0, 0, 0), + (36041, 250002, 0, 0, 0), + (36041, 280024, 0, 0, 0), + (36041, 320029, 0, 0, 0), + (36041, 330057, 0, 0, 0), + (36041, 340002, 0, 0, 0), + (36041, 1000072, 0, 0, 0), + (36041, 1100023, 0, 0, 0), + (36041, 1200034, 0, 0, 0), + (36042, 160005, 0, 0, 0), + (36042, 180014, 0, 0, 0), + (36042, 190016, 0, 0, 0), + (36042, 200024, 0, 0, 0), + (36042, 230001, 0, 0, 0), + (36042, 240005, 0, 0, 0), + (36042, 250002, 0, 0, 0), + (36042, 280016, 0, 0, 0), + (36042, 320028, 0, 0, 0), + (36042, 330055, 0, 0, 0), + (36042, 340002, 0, 0, 0), + (36042, 1000070, 0, 0, 0), + (36042, 1100025, 0, 0, 0), + (36042, 1200023, 0, 0, 0), + (36043, 160009, 0, 0, 0), + (36043, 180014, 0, 0, 0), + (36043, 190016, 0, 0, 0), + (36043, 200002, 0, 0, 0), + (36043, 230001, 0, 0, 0), + (36043, 240001, 0, 0, 0), + (36043, 250002, 0, 0, 0), + (36043, 280024, 0, 0, 0), + (36043, 320020, 0, 0, 0), + (36043, 330053, 0, 0, 0), + (36043, 340002, 0, 0, 0), + (36043, 1000071, 0, 0, 0), + (36043, 1100001, 0, 0, 0), + (36043, 1200034, 0, 0, 0), + (36044, 160009, 0, 0, 0), + (36044, 180014, 0, 0, 0), + (36044, 190016, 0, 0, 0), + (36044, 200002, 0, 0, 0), + (36044, 230001, 0, 0, 0), + (36044, 240001, 0, 0, 0), + (36044, 250002, 0, 0, 0), + (36044, 280024, 0, 0, 0), + (36044, 320020, 0, 0, 0), + (36044, 330053, 0, 0, 0), + (36044, 340002, 0, 0, 0), + (36044, 1000121, 0, 0, 0), + (36044, 1100001, 0, 0, 0), + (36044, 1200034, 0, 0, 0), + (36045, 160009, 0, 0, 0), + (36045, 180014, 0, 0, 0), + (36045, 190016, 0, 0, 0), + (36045, 200002, 0, 0, 0), + (36045, 230001, 0, 0, 0), + (36045, 240001, 0, 0, 0), + (36045, 250002, 0, 0, 0), + (36045, 280024, 0, 0, 0), + (36045, 320020, 0, 0, 0), + (36045, 330034, 0, 0, 0), + (36045, 340002, 0, 0, 0), + (36045, 1000073, 0, 0, 0), + (36045, 1100001, 0, 0, 0), + (36045, 1200023, 0, 0, 0), + (36046, 160009, 0, 0, 0), + (36046, 180014, 0, 0, 0), + (36046, 190016, 0, 0, 0), + (36046, 200002, 0, 0, 0), + (36046, 230001, 0, 0, 0), + (36046, 240006, 0, 0, 0), + (36046, 250002, 0, 0, 0), + (36046, 280024, 0, 0, 0), + (36046, 320030, 0, 0, 0), + (36046, 330057, 0, 0, 0), + (36046, 340002, 0, 0, 0), + (36046, 1000073, 0, 0, 0), + (36046, 1100025, 0, 0, 0), + (36046, 1200023, 0, 0, 0), + (36047, 160009, 0, 0, 0), + (36047, 180014, 0, 0, 0), + (36047, 190016, 0, 0, 0), + (36047, 200002, 0, 0, 0), + (36047, 230001, 0, 0, 0), + (36047, 240006, 0, 0, 0), + (36047, 250002, 0, 0, 0), + (36047, 280024, 0, 0, 0), + (36047, 320020, 0, 0, 0), + (36047, 330034, 0, 0, 0), + (36047, 340002, 0, 0, 0), + (36047, 1000125, 0, 0, 0), + (36047, 1100001, 0, 0, 0), + (36047, 1200023, 0, 0, 0), + (36048, 160009, 0, 0, 0), + (36048, 180014, 0, 0, 0), + (36048, 190016, 0, 0, 0), + (36048, 200002, 0, 0, 0), + (36048, 230001, 0, 0, 0), + (36048, 240006, 0, 0, 0), + (36048, 250002, 0, 0, 0), + (36048, 280024, 0, 0, 0), + (36048, 320030, 0, 0, 0), + (36048, 330057, 0, 0, 0), + (36048, 340003, 0, 0, 0), + (36048, 1000125, 0, 0, 0), + (36048, 1100025, 0, 0, 0), + (36048, 1200023, 0, 0, 0), + (36049, 160007, 0, 0, 0), + (36049, 180014, 0, 0, 0), + (36049, 190016, 0, 0, 0), + (36049, 200047, 0, 0, 0), + (36049, 230003, 0, 0, 0), + (36049, 240008, 0, 0, 0), + (36049, 250002, 0, 0, 0), + (36049, 280024, 0, 0, 0), + (36049, 320029, 0, 0, 0), + (36049, 330025, 0, 0, 0), + (36049, 340003, 0, 0, 0), + (36049, 1000125, 0, 0, 0), + (36049, 1100024, 0, 0, 0), + (36049, 1100025, 0, 0, 0), + (36049, 1200023, 0, 0, 0), + (36050, 160012, 0, 0, 0), + (36050, 180014, 0, 0, 0), + (36050, 190016, 0, 0, 0), + (36050, 200002, 0, 0, 0), + (36050, 230001, 0, 0, 0), + (36050, 240006, 0, 0, 0), + (36050, 250002, 0, 0, 0), + (36050, 280016, 0, 0, 0), + (36050, 320020, 0, 0, 0), + (36050, 330018, 0, 0, 0), + (36050, 340002, 0, 0, 0), + (36050, 1000122, 0, 0, 0), + (36050, 1100001, 0, 0, 0), + (36050, 1200034, 0, 0, 0), + (36051, 160012, 0, 0, 0), + (36051, 180003, 0, 0, 0), + (36051, 190016, 0, 0, 0), + (36051, 200002, 0, 0, 0), + (36051, 230001, 0, 0, 0), + (36051, 240006, 0, 0, 0), + (36051, 250002, 0, 0, 0), + (36051, 280016, 0, 0, 0), + (36051, 320020, 0, 0, 0), + (36051, 330056, 0, 0, 0), + (36051, 340002, 0, 0, 0), + (36051, 1000074, 0, 0, 0), + (36051, 1100001, 0, 0, 0), + (36051, 1200034, 0, 0, 0), + (36052, 160012, 0, 0, 0), + (36052, 180003, 0, 0, 0), + (36052, 190016, 0, 0, 0), + (36052, 200002, 0, 0, 0), + (36052, 230001, 0, 0, 0), + (36052, 240006, 0, 0, 0), + (36052, 250002, 0, 0, 0), + (36052, 280016, 0, 0, 0), + (36052, 320020, 0, 0, 0), + (36052, 330018, 0, 0, 0), + (36052, 340002, 0, 0, 0), + (36052, 1000072, 0, 0, 0), + (36052, 1100025, 0, 0, 0), + (36052, 1200034, 0, 0, 0), + (36053, 160012, 0, 0, 0), + (36053, 180014, 0, 0, 0), + (36053, 190016, 0, 0, 0), + (36053, 200047, 0, 0, 0), + (36053, 230003, 0, 0, 0), + (36053, 240006, 0, 0, 0), + (36053, 250002, 0, 0, 0), + (36053, 280016, 0, 0, 0), + (36053, 320030, 0, 0, 0), + (36053, 330025, 0, 0, 0), + (36053, 340003, 0, 0, 0), + (36053, 1000125, 0, 0, 0), + (36053, 1100025, 0, 0, 0), + (36053, 1200023, 0, 0, 0), + (36054, 160012, 0, 0, 0), + (36054, 180014, 0, 0, 0), + (36054, 190016, 0, 0, 0), + (36054, 200047, 0, 0, 0), + (36054, 230003, 0, 0, 0), + (36054, 240006, 0, 0, 0), + (36054, 250002, 0, 0, 0), + (36054, 280038, 0, 0, 0), + (36054, 320029, 0, 0, 0), + (36054, 330025, 0, 0, 0), + (36054, 340003, 0, 0, 0), + (36054, 1000125, 0, 0, 0), + (36054, 1100025, 0, 0, 0), + (36054, 1200023, 0, 0, 0), + (36055, 160015, 0, 0, 0), + (36055, 180001, 0, 0, 0), + (36055, 190066, 0, 0, 0), + (36055, 200002, 0, 0, 0), + (36055, 230001, 0, 0, 0), + (36055, 240001, 0, 0, 0), + (36055, 250002, 0, 0, 0), + (36055, 280016, 0, 0, 0), + (36055, 320020, 0, 0, 0), + (36055, 330008, 0, 0, 0), + (36055, 340002, 0, 0, 0), + (36055, 1000074, 0, 0, 0), + (36055, 1100001, 0, 0, 0), + (36055, 1200034, 0, 0, 0), + (36056, 160011, 0, 0, 0), + (36056, 180062, 0, 0, 0), + (36056, 190067, 0, 0, 0), + (36056, 200048, 0, 0, 0), + (36056, 230001, 0, 0, 0), + (36056, 240001, 0, 0, 0), + (36056, 250002, 0, 0, 0), + (36056, 280051, 0, 0, 0), + (36056, 320100, 0, 0, 0), + (36056, 330056, 0, 0, 0), + (36056, 340002, 0, 0, 0), + (36056, 1000057, 0, 0, 0), + (36056, 1100120, 0, 0, 0), + (36056, 1200049, 0, 0, 0), + (36057, 160011, 0, 0, 0), + (36057, 180062, 0, 0, 0), + (36057, 190067, 0, 0, 0), + (36057, 200048, 0, 0, 0), + (36057, 230001, 0, 0, 0), + (36057, 240001, 0, 0, 0), + (36057, 250002, 0, 0, 0), + (36057, 280051, 0, 0, 0), + (36057, 320100, 0, 0, 0), + (36057, 330030, 0, 0, 0), + (36057, 340002, 0, 0, 0), + (36057, 1000057, 0, 0, 0), + (36057, 1100120, 0, 0, 0), + (36057, 1200049, 0, 0, 0), + (36058, 160011, 0, 0, 0), + (36058, 180062, 0, 0, 0), + (36058, 190067, 0, 0, 0), + (36058, 200030, 0, 0, 0), + (36058, 230001, 0, 0, 0), + (36058, 240006, 0, 0, 0), + (36058, 250002, 0, 0, 0), + (36058, 280051, 0, 0, 0), + (36058, 320101, 0, 0, 0), + (36058, 330018, 0, 0, 0), + (36058, 340002, 0, 0, 0), + (36058, 1000057, 0, 0, 0), + (36058, 1100121, 0, 0, 0), + (36058, 1200049, 0, 0, 0), + (36059, 160011, 0, 0, 0), + (36059, 180062, 0, 0, 0), + (36059, 190067, 0, 0, 0), + (36059, 200030, 0, 0, 0), + (36059, 230001, 0, 0, 0), + (36059, 240006, 0, 0, 0), + (36059, 250002, 0, 0, 0), + (36059, 280052, 0, 0, 0), + (36059, 320101, 0, 0, 0), + (36059, 330043, 0, 0, 0), + (36059, 340002, 0, 0, 0), + (36059, 1000057, 0, 0, 0), + (36059, 1100121, 0, 0, 0), + (36059, 1200049, 0, 0, 0), + (36060, 160011, 0, 0, 0), + (36060, 180062, 0, 0, 0), + (36060, 190067, 0, 0, 0), + (36060, 200030, 0, 0, 0), + (36060, 230001, 0, 0, 0), + (36060, 240005, 0, 0, 0), + (36060, 250002, 0, 0, 0), + (36060, 280052, 0, 0, 0), + (36060, 320101, 0, 0, 0), + (36060, 330030, 0, 0, 0), + (36060, 340002, 0, 0, 0), + (36060, 1000057, 0, 0, 0), + (36060, 1100121, 0, 0, 0), + (36060, 1200049, 0, 0, 0), + (36061, 160011, 0, 0, 0), + (36061, 180062, 0, 0, 0), + (36061, 190067, 0, 0, 0), + (36061, 200049, 0, 0, 0), + (36061, 230001, 0, 0, 0), + (36061, 240006, 0, 0, 0), + (36061, 250002, 0, 0, 0), + (36061, 280052, 0, 0, 0), + (36061, 320101, 0, 0, 0), + (36061, 330008, 0, 0, 0), + (36061, 340002, 0, 0, 0), + (36061, 1000057, 0, 0, 0), + (36061, 1100121, 0, 0, 0), + (36061, 1200049, 0, 0, 0), + (36062, 160011, 0, 0, 0), + (36062, 180062, 0, 0, 0), + (36062, 190067, 0, 0, 0), + (36062, 200049, 0, 0, 0), + (36062, 230001, 0, 0, 0), + (36062, 240006, 0, 0, 0), + (36062, 250002, 0, 0, 0), + (36062, 280052, 0, 0, 0), + (36062, 320101, 0, 0, 0), + (36062, 330030, 0, 0, 0), + (36062, 340002, 0, 0, 0), + (36062, 1000057, 0, 0, 0), + (36062, 1100121, 0, 0, 0), + (36062, 1200050, 0, 0, 0), + (36063, 160011, 0, 0, 0), + (36063, 180062, 0, 0, 0), + (36063, 190015, 0, 0, 0), + (36063, 200049, 0, 0, 0), + (36063, 230001, 0, 0, 0), + (36063, 240006, 0, 0, 0), + (36063, 250002, 0, 0, 0), + (36063, 280052, 0, 0, 0), + (36063, 320101, 0, 0, 0), + (36063, 330043, 0, 0, 0), + (36063, 340002, 0, 0, 0), + (36063, 1000022, 0, 0, 0), + (36063, 1100120, 0, 0, 0), + (36063, 1200050, 0, 0, 0), + (36064, 160011, 0, 0, 0), + (36064, 180062, 0, 0, 0), + (36064, 190067, 0, 0, 0), + (36064, 200049, 0, 0, 0), + (36064, 230001, 0, 0, 0), + (36064, 240005, 0, 0, 0), + (36064, 250002, 0, 0, 0), + (36064, 280052, 0, 0, 0), + (36064, 320100, 0, 0, 0), + (36064, 330030, 0, 0, 0), + (36064, 340002, 0, 0, 0), + (36064, 1000057, 0, 0, 0), + (36064, 1100121, 0, 0, 0), + (36064, 1200050, 0, 0, 0), + (36065, 160016, 0, 0, 0), + (36065, 180062, 0, 0, 0), + (36065, 190067, 0, 0, 0), + (36065, 200049, 0, 0, 0), + (36065, 230001, 0, 0, 0), + (36065, 240005, 0, 0, 0), + (36065, 250002, 0, 0, 0), + (36065, 280052, 0, 0, 0), + (36065, 320101, 0, 0, 0), + (36065, 330043, 0, 0, 0), + (36065, 340002, 0, 0, 0), + (36065, 1000022, 0, 0, 0), + (36065, 1100121, 0, 0, 0), + (36065, 1200050, 0, 0, 0), + (36066, 160016, 0, 0, 0), + (36066, 180062, 0, 0, 0), + (36066, 190067, 0, 0, 0), + (36066, 200030, 0, 0, 0), + (36066, 230001, 0, 0, 0), + (36066, 240005, 0, 0, 0), + (36066, 250002, 0, 0, 0), + (36066, 280052, 0, 0, 0), + (36066, 320101, 0, 0, 0), + (36066, 330017, 0, 0, 0), + (36066, 340002, 0, 0, 0), + (36066, 1000126, 0, 0, 0), + (36066, 1100121, 0, 0, 0), + (36066, 1200050, 0, 0, 0), + (36067, 160016, 0, 0, 0), + (36067, 180062, 0, 0, 0), + (36067, 190067, 0, 0, 0), + (36067, 200030, 0, 0, 0), + (36067, 230001, 0, 0, 0), + (36067, 240005, 0, 0, 0), + (36067, 250002, 0, 0, 0), + (36067, 280052, 0, 0, 0), + (36067, 320101, 0, 0, 0), + (36067, 330019, 0, 0, 0), + (36067, 340002, 0, 0, 0), + (36067, 1000126, 0, 0, 0), + (36067, 1100121, 0, 0, 0), + (36067, 1200050, 0, 0, 0), + (36068, 160016, 0, 0, 0), + (36068, 180062, 0, 0, 0), + (36068, 190067, 0, 0, 0), + (36068, 200050, 0, 0, 0), + (36068, 230001, 0, 0, 0), + (36068, 240005, 0, 0, 0), + (36068, 250002, 0, 0, 0), + (36068, 280052, 0, 0, 0), + (36068, 320100, 0, 0, 0), + (36068, 330043, 0, 0, 0), + (36068, 340002, 0, 0, 0), + (36068, 1000022, 0, 0, 0), + (36068, 1100121, 0, 0, 0), + (36068, 1200050, 0, 0, 0), + (36069, 160016, 0, 0, 0), + (36069, 180062, 0, 0, 0), + (36069, 190067, 0, 0, 0), + (36069, 200030, 0, 0, 0), + (36069, 230001, 0, 0, 0), + (36069, 240005, 0, 0, 0), + (36069, 250002, 0, 0, 0), + (36069, 280052, 0, 0, 0), + (36069, 320101, 0, 0, 0), + (36069, 330043, 0, 0, 0), + (36069, 340002, 0, 0, 0), + (36069, 1000126, 0, 0, 0), + (36069, 1100121, 0, 0, 0), + (36069, 1200050, 0, 0, 0), + (36070, 160004, 0, 0, 0), + (36070, 180062, 0, 0, 0), + (36070, 190067, 0, 0, 0), + (36070, 200008, 0, 0, 0), + (36070, 230004, 0, 0, 0), + (36070, 240005, 0, 0, 0), + (36070, 250002, 0, 0, 0), + (36070, 280005, 0, 0, 0), + (36070, 320010, 0, 0, 0), + (36070, 330019, 0, 0, 0), + (36070, 340003, 0, 0, 0), + (36070, 1000126, 0, 0, 0), + (36070, 1100122, 0, 0, 0), + (36070, 1200050, 0, 0, 0), + (36071, 160014, 0, 0, 0), + (36071, 180002, 0, 0, 0), + (36071, 190015, 0, 0, 0), + (36071, 200003, 0, 0, 0), + (36071, 230003, 0, 0, 0), + (36071, 240006, 0, 0, 0), + (36071, 250002, 0, 0, 0), + (36071, 280002, 0, 0, 0), + (36071, 320002, 0, 0, 0), + (36071, 330018, 0, 0, 0), + (36071, 340002, 0, 0, 0), + (36071, 1000075, 0, 0, 0), + (36071, 1100014, 0, 0, 0), + (36071, 1200001, 0, 0, 0), + (36072, 160014, 0, 0, 0), + (36072, 180002, 0, 0, 0), + (36072, 190015, 0, 0, 0), + (36072, 200046, 0, 0, 0), + (36072, 230003, 0, 0, 0), + (36072, 240006, 0, 0, 0), + (36072, 250002, 0, 0, 0), + (36072, 280006, 0, 0, 0), + (36072, 320002, 0, 0, 0), + (36072, 330004, 0, 0, 0), + (36072, 340002, 0, 0, 0), + (36072, 1000075, 0, 0, 0), + (36072, 1100026, 0, 0, 0), + (36072, 1200001, 0, 0, 0), + (36073, 160014, 0, 0, 0), + (36073, 180013, 0, 0, 0), + (36073, 190015, 0, 0, 0), + (36073, 200046, 0, 0, 0), + (36073, 230003, 0, 0, 0), + (36073, 240006, 0, 0, 0), + (36073, 250002, 0, 0, 0), + (36073, 280006, 0, 0, 0), + (36073, 320031, 0, 0, 0), + (36073, 330033, 0, 0, 0), + (36073, 340003, 0, 0, 0), + (36073, 1000023, 0, 0, 0), + (36073, 1100025, 0, 0, 0), + (36073, 1200024, 0, 0, 0), + (36074, 160014, 0, 0, 0), + (36074, 180002, 0, 0, 0), + (36074, 190015, 0, 0, 0), + (36074, 200046, 0, 0, 0), + (36074, 230003, 0, 0, 0), + (36074, 240006, 0, 0, 0), + (36074, 250002, 0, 0, 0), + (36074, 280006, 0, 0, 0), + (36074, 320002, 0, 0, 0), + (36074, 330033, 0, 0, 0), + (36074, 340003, 0, 0, 0), + (36074, 1000075, 0, 0, 0), + (36074, 1100026, 0, 0, 0), + (36074, 1200001, 0, 0, 0), + (36075, 160087, 0, 0, 0), + (36075, 180002, 0, 0, 0), + (36075, 190015, 0, 0, 0), + (36075, 200003, 0, 0, 0), + (36075, 230001, 0, 0, 0), + (36075, 240005, 0, 0, 0), + (36075, 250002, 0, 0, 0), + (36075, 280006, 0, 0, 0), + (36075, 320002, 0, 0, 0), + (36075, 330043, 0, 0, 0), + (36075, 340002, 0, 0, 0), + (36075, 1000127, 0, 0, 0), + (36075, 1100025, 0, 0, 0), + (36075, 1200001, 0, 0, 0), + (36076, 160087, 0, 0, 0), + (36076, 180013, 0, 0, 0), + (36076, 190015, 0, 0, 0), + (36076, 200046, 0, 0, 0), + (36076, 230001, 0, 0, 0), + (36076, 240005, 0, 0, 0), + (36076, 250002, 0, 0, 0), + (36076, 280006, 0, 0, 0), + (36076, 320009, 0, 0, 0), + (36076, 330027, 0, 0, 0), + (36076, 340002, 0, 0, 0), + (36076, 1000023, 0, 0, 0), + (36076, 1100026, 0, 0, 0), + (36076, 1200024, 0, 0, 0), + (36077, 160087, 0, 0, 0), + (36077, 180002, 0, 0, 0), + (36077, 190015, 0, 0, 0), + (36077, 200046, 0, 0, 0), + (36077, 230001, 0, 0, 0), + (36077, 240005, 0, 0, 0), + (36077, 250002, 0, 0, 0), + (36077, 280006, 0, 0, 0), + (36077, 320002, 0, 0, 0), + (36077, 330014, 0, 0, 0), + (36077, 340002, 0, 0, 0), + (36077, 1000127, 0, 0, 0), + (36077, 1100026, 0, 0, 0), + (36077, 1200001, 0, 0, 0), + (36078, 160087, 0, 0, 0), + (36078, 180013, 0, 0, 0), + (36078, 190015, 0, 0, 0), + (36078, 200046, 0, 0, 0), + (36078, 230003, 0, 0, 0), + (36078, 240007, 0, 0, 0), + (36078, 250002, 0, 0, 0), + (36078, 280006, 0, 0, 0), + (36078, 320031, 0, 0, 0), + (36078, 330027, 0, 0, 0), + (36078, 340003, 0, 0, 0), + (36078, 1000024, 0, 0, 0), + (36078, 1100026, 0, 0, 0), + (36078, 1200024, 0, 0, 0), + (36079, 160087, 0, 0, 0), + (36079, 180013, 0, 0, 0), + (36079, 190015, 0, 0, 0), + (36079, 200046, 0, 0, 0), + (36079, 230003, 0, 0, 0), + (36079, 240007, 0, 0, 0), + (36079, 250002, 0, 0, 0), + (36079, 280006, 0, 0, 0), + (36079, 320009, 0, 0, 0), + (36079, 330014, 0, 0, 0), + (36079, 340003, 0, 0, 0), + (36079, 1000025, 0, 0, 0), + (36079, 1100026, 0, 0, 0), + (36079, 1200024, 0, 0, 0), + (36080, 160087, 0, 0, 0), + (36080, 180013, 0, 0, 0), + (36080, 190015, 0, 0, 0), + (36080, 200046, 0, 0, 0), + (36080, 230003, 0, 0, 0), + (36080, 240007, 0, 0, 0), + (36080, 250002, 0, 0, 0), + (36080, 280006, 0, 0, 0), + (36080, 320009, 0, 0, 0), + (36080, 330014, 0, 0, 0), + (36080, 340003, 0, 0, 0), + (36080, 1000023, 0, 0, 0), + (36080, 1100026, 0, 0, 0), + (36080, 1200024, 0, 0, 0), + (36081, 160072, 0, 0, 0), + (36081, 180002, 0, 0, 0), + (36081, 190015, 0, 0, 0), + (36081, 200003, 0, 0, 0), + (36081, 230003, 0, 0, 0), + (36081, 240006, 0, 0, 0), + (36081, 250002, 0, 0, 0), + (36081, 280002, 0, 0, 0), + (36081, 320002, 0, 0, 0), + (36081, 330018, 0, 0, 0), + (36081, 340002, 0, 0, 0), + (36081, 1000075, 0, 0, 0), + (36081, 1100014, 0, 0, 0), + (36081, 1200001, 0, 0, 0), + (36082, 160017, 0, 0, 0), + (36082, 180002, 0, 0, 0), + (36082, 190015, 0, 0, 0), + (36082, 200046, 0, 0, 0), + (36082, 230001, 0, 0, 0), + (36082, 240005, 0, 0, 0), + (36082, 250002, 0, 0, 0), + (36082, 280002, 0, 0, 0), + (36082, 320002, 0, 0, 0), + (36082, 330043, 0, 0, 0), + (36082, 340002, 0, 0, 0), + (36082, 1000075, 0, 0, 0), + (36082, 1100026, 0, 0, 0), + (36082, 1200001, 0, 0, 0), + (36083, 160017, 0, 0, 0), + (36083, 180002, 0, 0, 0), + (36083, 190015, 0, 0, 0), + (36083, 200046, 0, 0, 0), + (36083, 230003, 0, 0, 0), + (36083, 240005, 0, 0, 0), + (36083, 250002, 0, 0, 0), + (36083, 280006, 0, 0, 0), + (36083, 320002, 0, 0, 0), + (36083, 330043, 0, 0, 0), + (36083, 340003, 0, 0, 0), + (36083, 1000075, 0, 0, 0), + (36083, 1100026, 0, 0, 0), + (36083, 1200001, 0, 0, 0), + (36084, 160017, 0, 0, 0), + (36084, 180002, 0, 0, 0), + (36084, 190015, 0, 0, 0), + (36084, 200046, 0, 0, 0), + (36084, 230003, 0, 0, 0), + (36084, 240005, 0, 0, 0), + (36084, 250002, 0, 0, 0), + (36084, 280006, 0, 0, 0), + (36084, 320002, 0, 0, 0), + (36084, 330043, 0, 0, 0), + (36084, 340003, 0, 0, 0), + (36084, 1000075, 0, 0, 0), + (36084, 1100026, 0, 0, 0), + (36084, 1200024, 0, 0, 0), + (36085, 160017, 0, 0, 0), + (36085, 180002, 0, 0, 0), + (36085, 190015, 0, 0, 0), + (36085, 200046, 0, 0, 0), + (36085, 230003, 0, 0, 0), + (36085, 240007, 0, 0, 0), + (36085, 250002, 0, 0, 0), + (36085, 280006, 0, 0, 0), + (36085, 320032, 0, 0, 0), + (36085, 330025, 0, 0, 0), + (36085, 340003, 0, 0, 0), + (36085, 1000077, 0, 0, 0), + (36085, 1100026, 0, 0, 0), + (36085, 1200024, 0, 0, 0), + (36086, 160017, 0, 0, 0), + (36086, 180002, 0, 0, 0), + (36086, 190015, 0, 0, 0), + (36086, 200051, 0, 0, 0), + (36086, 230003, 0, 0, 0), + (36086, 240007, 0, 0, 0), + (36086, 250002, 0, 0, 0), + (36086, 280006, 0, 0, 0), + (36086, 320032, 0, 0, 0), + (36086, 330025, 0, 0, 0), + (36086, 340003, 0, 0, 0), + (36086, 1000025, 0, 0, 0), + (36086, 1100026, 0, 0, 0), + (36086, 1200024, 0, 0, 0), + (36087, 160017, 0, 0, 0), + (36087, 180013, 0, 0, 0), + (36087, 190015, 0, 0, 0), + (36087, 200051, 0, 0, 0), + (36087, 230003, 0, 0, 0), + (36087, 240007, 0, 0, 0), + (36087, 250002, 0, 0, 0), + (36087, 280006, 0, 0, 0), + (36087, 320031, 0, 0, 0), + (36087, 330027, 0, 0, 0), + (36087, 340003, 0, 0, 0), + (36087, 1000025, 0, 0, 0), + (36087, 1100027, 0, 0, 0), + (36087, 1200024, 0, 0, 0), + (36088, 160038, 0, 0, 0), + (36088, 180025, 0, 0, 0), + (36088, 190022, 0, 0, 0), + (36088, 200020, 0, 0, 0), + (36088, 230001, 0, 0, 0), + (36088, 240001, 0, 0, 0), + (36088, 250002, 0, 0, 0), + (36088, 280020, 0, 0, 0), + (36088, 320024, 0, 0, 0), + (36088, 330058, 0, 0, 0), + (36088, 340002, 0, 0, 0), + (36088, 1000081, 0, 0, 0), + (36088, 1100017, 0, 0, 0), + (36088, 1200019, 0, 0, 0), + (36089, 160038, 0, 0, 0), + (36089, 180026, 0, 0, 0), + (36089, 190022, 0, 0, 0), + (36089, 200020, 0, 0, 0), + (36089, 230003, 0, 0, 0), + (36089, 240006, 0, 0, 0), + (36089, 250002, 0, 0, 0), + (36089, 280027, 0, 0, 0), + (36089, 320024, 0, 0, 0), + (36089, 330043, 0, 0, 0), + (36089, 340002, 0, 0, 0), + (36089, 1000017, 0, 0, 0), + (36089, 1100098, 0, 0, 0), + (36089, 1200019, 0, 0, 0), + (36090, 160038, 0, 0, 0), + (36090, 180026, 0, 0, 0), + (36090, 190022, 0, 0, 0), + (36090, 200020, 0, 0, 0), + (36090, 230003, 0, 0, 0), + (36090, 240006, 0, 0, 0), + (36090, 250002, 0, 0, 0), + (36090, 280027, 0, 0, 0), + (36090, 320024, 0, 0, 0), + (36090, 330043, 0, 0, 0), + (36090, 340002, 0, 0, 0), + (36090, 1000017, 0, 0, 0), + (36090, 1100098, 0, 0, 0), + (36090, 1200019, 0, 0, 0), + (36091, 160038, 0, 0, 0), + (36091, 180026, 0, 0, 0), + (36091, 190022, 0, 0, 0), + (36091, 200020, 0, 0, 0), + (36091, 230003, 0, 0, 0), + (36091, 240006, 0, 0, 0), + (36091, 250002, 0, 0, 0), + (36091, 280027, 0, 0, 0), + (36091, 320024, 0, 0, 0), + (36091, 330043, 0, 0, 0), + (36091, 340002, 0, 0, 0), + (36091, 1000017, 0, 0, 0), + (36091, 1100098, 0, 0, 0), + (36091, 1200019, 0, 0, 0), + (36092, 160038, 0, 0, 0), + (36092, 180026, 0, 0, 0), + (36092, 190022, 0, 0, 0), + (36092, 200020, 0, 0, 0), + (36092, 230003, 0, 0, 0), + (36092, 240006, 0, 0, 0), + (36092, 250002, 0, 0, 0), + (36092, 280027, 0, 0, 0), + (36092, 320024, 0, 0, 0), + (36092, 330043, 0, 0, 0), + (36092, 340002, 0, 0, 0), + (36092, 1000017, 0, 0, 0), + (36092, 1100098, 0, 0, 0), + (36092, 1200019, 0, 0, 0), + (36093, 160037, 0, 0, 0), + (36093, 180020, 0, 0, 0), + (36093, 190022, 0, 0, 0), + (36093, 200020, 0, 0, 0), + (36093, 230001, 0, 0, 0), + (36093, 240001, 0, 0, 0), + (36093, 250002, 0, 0, 0), + (36093, 280027, 0, 0, 0), + (36093, 320024, 0, 0, 0), + (36093, 330018, 0, 0, 0), + (36093, 340002, 0, 0, 0), + (36093, 1000017, 0, 0, 0), + (36093, 1100098, 0, 0, 0), + (36093, 1200019, 0, 0, 0), + (36094, 160037, 0, 0, 0), + (36094, 180020, 0, 0, 0), + (36094, 190022, 0, 0, 0), + (36094, 200052, 0, 0, 0), + (36094, 230001, 0, 0, 0), + (36094, 240001, 0, 0, 0), + (36094, 250002, 0, 0, 0), + (36094, 280027, 0, 0, 0), + (36094, 320024, 0, 0, 0), + (36094, 330043, 0, 0, 0), + (36094, 340002, 0, 0, 0), + (36094, 1000017, 0, 0, 0), + (36094, 1100098, 0, 0, 0), + (36094, 1200019, 0, 0, 0), + (36095, 160037, 0, 0, 0), + (36095, 180020, 0, 0, 0), + (36095, 190022, 0, 0, 0), + (36095, 200052, 0, 0, 0), + (36095, 230001, 0, 0, 0), + (36095, 240001, 0, 0, 0), + (36095, 250002, 0, 0, 0), + (36095, 280027, 0, 0, 0), + (36095, 320024, 0, 0, 0), + (36095, 330030, 0, 0, 0), + (36095, 340002, 0, 0, 0), + (36095, 1000017, 0, 0, 0), + (36095, 1100098, 0, 0, 0), + (36095, 1200019, 0, 0, 0), + (36096, 160037, 0, 0, 0), + (36096, 180020, 0, 0, 0), + (36096, 190022, 0, 0, 0), + (36096, 200020, 0, 0, 0), + (36096, 230001, 0, 0, 0), + (36096, 240001, 0, 0, 0), + (36096, 250002, 0, 0, 0), + (36096, 280020, 0, 0, 0), + (36096, 320024, 0, 0, 0), + (36096, 330018, 0, 0, 0), + (36096, 340002, 0, 0, 0), + (36096, 1000017, 0, 0, 0), + (36096, 1100017, 0, 0, 0), + (36096, 1200019, 0, 0, 0), + (36097, 25007, 0, 0, 0), + (36097, 160037, 0, 0, 0), + (36097, 180020, 0, 0, 0), + (36097, 190022, 0, 0, 0), + (36097, 200052, 0, 0, 0), + (36097, 230003, 0, 0, 0), + (36097, 240005, 0, 0, 0), + (36097, 250002, 0, 0, 0), + (36097, 280027, 0, 0, 0), + (36097, 320037, 0, 0, 0), + (36097, 330043, 0, 0, 0), + (36097, 340002, 0, 0, 0), + (36097, 1000017, 0, 0, 0), + (36097, 1100032, 0, 0, 0), + (36097, 1200019, 0, 0, 0), + (36098, 160039, 0, 0, 0), + (36098, 180023, 0, 0, 0), + (36098, 190025, 0, 0, 0), + (36098, 200023, 0, 0, 0), + (36098, 230001, 0, 0, 0), + (36098, 240001, 0, 0, 0), + (36098, 250002, 0, 0, 0), + (36098, 280023, 0, 0, 0), + (36098, 320027, 0, 0, 0), + (36098, 330058, 0, 0, 0), + (36098, 340002, 0, 0, 0), + (36098, 1000084, 0, 0, 0), + (36098, 1100020, 0, 0, 0), + (36098, 1200035, 0, 0, 0), + (36099, 160039, 0, 0, 0), + (36099, 180023, 0, 0, 0), + (36099, 190025, 0, 0, 0), + (36099, 200023, 0, 0, 0), + (36099, 230001, 0, 0, 0), + (36099, 240001, 0, 0, 0), + (36099, 250002, 0, 0, 0), + (36099, 280023, 0, 0, 0), + (36099, 320027, 0, 0, 0), + (36099, 330058, 0, 0, 0), + (36099, 340002, 0, 0, 0), + (36099, 1000084, 0, 0, 0), + (36099, 1100099, 0, 0, 0), + (36099, 1200035, 0, 0, 0), + (36100, 160039, 0, 0, 0), + (36100, 180023, 0, 0, 0), + (36100, 190025, 0, 0, 0), + (36100, 200023, 0, 0, 0), + (36100, 230001, 0, 0, 0), + (36100, 240001, 0, 0, 0), + (36100, 250002, 0, 0, 0), + (36100, 280023, 0, 0, 0), + (36100, 320027, 0, 0, 0), + (36100, 330008, 0, 0, 0), + (36100, 340002, 0, 0, 0), + (36100, 1000084, 0, 0, 0), + (36100, 1100099, 0, 0, 0), + (36100, 1200035, 0, 0, 0), + (36101, 160039, 0, 0, 0), + (36101, 180023, 0, 0, 0), + (36101, 190025, 0, 0, 0), + (36101, 200023, 0, 0, 0), + (36101, 230001, 0, 0, 0), + (36101, 240001, 0, 0, 0), + (36101, 250002, 0, 0, 0), + (36101, 280023, 0, 0, 0), + (36101, 320027, 0, 0, 0), + (36101, 330059, 0, 0, 0), + (36101, 340002, 0, 0, 0), + (36101, 1000085, 0, 0, 0), + (36101, 1100099, 0, 0, 0), + (36101, 1200035, 0, 0, 0), + (36102, 160039, 0, 0, 0), + (36102, 180023, 0, 0, 0), + (36102, 190025, 0, 0, 0), + (36102, 200023, 0, 0, 0), + (36102, 230001, 0, 0, 0), + (36102, 240001, 0, 0, 0), + (36102, 250002, 0, 0, 0), + (36102, 280023, 0, 0, 0), + (36102, 320027, 0, 0, 0), + (36102, 330060, 0, 0, 0), + (36102, 340002, 0, 0, 0), + (36102, 1000128, 0, 0, 0), + (36102, 1100099, 0, 0, 0), + (36102, 1200035, 0, 0, 0), + (36103, 160039, 0, 0, 0), + (36103, 180023, 0, 0, 0), + (36103, 190025, 0, 0, 0), + (36103, 200023, 0, 0, 0), + (36103, 230001, 0, 0, 0), + (36103, 240001, 0, 0, 0), + (36103, 250002, 0, 0, 0), + (36103, 280039, 0, 0, 0), + (36103, 320027, 0, 0, 0), + (36103, 330060, 0, 0, 0), + (36103, 340002, 0, 0, 0), + (36103, 1000085, 0, 0, 0), + (36103, 1100100, 0, 0, 0), + (36103, 1200035, 0, 0, 0), + (36104, 160039, 0, 0, 0), + (36104, 180023, 0, 0, 0), + (36104, 190025, 0, 0, 0), + (36104, 200023, 0, 0, 0), + (36104, 230001, 0, 0, 0), + (36104, 240001, 0, 0, 0), + (36104, 250002, 0, 0, 0), + (36104, 280039, 0, 0, 0), + (36104, 320027, 0, 0, 0), + (36104, 330030, 0, 0, 0), + (36104, 340002, 0, 0, 0), + (36104, 1000085, 0, 0, 0), + (36104, 1100100, 0, 0, 0), + (36104, 1200035, 0, 0, 0), + (36105, 160039, 0, 0, 0), + (36105, 180027, 0, 0, 0), + (36105, 190025, 0, 0, 0), + (36105, 200027, 0, 0, 0), + (36105, 230001, 0, 0, 0), + (36105, 240001, 0, 0, 0), + (36105, 250002, 0, 0, 0), + (36105, 280039, 0, 0, 0), + (36105, 320090, 0, 0, 0), + (36105, 330060, 0, 0, 0), + (36105, 340002, 0, 0, 0), + (36105, 1000037, 0, 0, 0), + (36105, 1100033, 0, 0, 0), + (36105, 1200035, 0, 0, 0), + (36106, 160039, 0, 0, 0), + (36106, 180027, 0, 0, 0), + (36106, 190025, 0, 0, 0), + (36106, 200027, 0, 0, 0), + (36106, 230001, 0, 0, 0), + (36106, 240005, 0, 0, 0), + (36106, 250002, 0, 0, 0), + (36106, 280039, 0, 0, 0), + (36106, 320090, 0, 0, 0), + (36106, 330030, 0, 0, 0), + (36106, 340002, 0, 0, 0), + (36106, 1000085, 0, 0, 0), + (36106, 1100033, 0, 0, 0), + (36106, 1200035, 0, 0, 0), + (36107, 160039, 0, 0, 0), + (36107, 180023, 0, 0, 0), + (36107, 190025, 0, 0, 0), + (36107, 200023, 0, 0, 0), + (36107, 230001, 0, 0, 0), + (36107, 240001, 0, 0, 0), + (36107, 250002, 0, 0, 0), + (36107, 280039, 0, 0, 0), + (36107, 320027, 0, 0, 0), + (36107, 330030, 0, 0, 0), + (36107, 340002, 0, 0, 0), + (36107, 1000018, 0, 0, 0), + (36107, 1100100, 0, 0, 0), + (36107, 1200035, 0, 0, 0), + (36108, 160039, 0, 0, 0), + (36108, 180023, 0, 0, 0), + (36108, 190025, 0, 0, 0), + (36108, 200023, 0, 0, 0), + (36108, 230001, 0, 0, 0), + (36108, 240001, 0, 0, 0), + (36108, 250002, 0, 0, 0), + (36108, 280039, 0, 0, 0), + (36108, 320027, 0, 0, 0), + (36108, 330060, 0, 0, 0), + (36108, 340002, 0, 0, 0), + (36108, 1000018, 0, 0, 0), + (36108, 1100100, 0, 0, 0), + (36108, 1200035, 0, 0, 0), + (36109, 160039, 0, 0, 0), + (36109, 180027, 0, 0, 0), + (36109, 190025, 0, 0, 0), + (36109, 200027, 0, 0, 0), + (36109, 230003, 0, 0, 0), + (36109, 240005, 0, 0, 0), + (36109, 250002, 0, 0, 0), + (36109, 280039, 0, 0, 0), + (36109, 320090, 0, 0, 0), + (36109, 330030, 0, 0, 0), + (36109, 340003, 0, 0, 0), + (36109, 1000129, 0, 0, 0), + (36109, 1100033, 0, 0, 0), + (36109, 1200037, 0, 0, 0), + (36110, 160070, 0, 0, 0), + (36110, 180029, 0, 0, 0), + (36110, 190025, 0, 0, 0), + (36110, 200027, 0, 0, 0), + (36110, 230003, 0, 0, 0), + (36110, 240005, 0, 0, 0), + (36110, 250002, 0, 0, 0), + (36110, 280029, 0, 0, 0), + (36110, 320039, 0, 0, 0), + (36110, 330055, 0, 0, 0), + (36110, 340002, 0, 0, 0), + (36110, 1000086, 0, 0, 0), + (36110, 1100037, 0, 0, 0), + (36110, 1200037, 0, 0, 0), + (36111, 160070, 0, 0, 0), + (36111, 180029, 0, 0, 0), + (36111, 190025, 0, 0, 0), + (36111, 200027, 0, 0, 0), + (36111, 230001, 0, 0, 0), + (36111, 240005, 0, 0, 0), + (36111, 250002, 0, 0, 0), + (36111, 280023, 0, 0, 0), + (36111, 320027, 0, 0, 0), + (36111, 330060, 0, 0, 0), + (36111, 340002, 0, 0, 0), + (36111, 1000130, 0, 0, 0), + (36111, 1100020, 0, 0, 0), + (36111, 1200035, 0, 0, 0), + (36112, 160070, 0, 0, 0), + (36112, 180029, 0, 0, 0), + (36112, 190025, 0, 0, 0), + (36112, 200027, 0, 0, 0), + (36112, 230003, 0, 0, 0), + (36112, 240007, 0, 0, 0), + (36112, 250002, 0, 0, 0), + (36112, 280029, 0, 0, 0), + (36112, 320039, 0, 0, 0), + (36112, 330017, 0, 0, 0), + (36112, 340002, 0, 0, 0), + (36112, 1000087, 0, 0, 0), + (36112, 1100037, 0, 0, 0), + (36112, 1200037, 0, 0, 0), + (36113, 160070, 0, 0, 0), + (36113, 180029, 0, 0, 0), + (36113, 190025, 0, 0, 0), + (36113, 200027, 0, 0, 0), + (36113, 230003, 0, 0, 0), + (36113, 240005, 0, 0, 0), + (36113, 250002, 0, 0, 0), + (36113, 280029, 0, 0, 0), + (36113, 320027, 0, 0, 0), + (36113, 330060, 0, 0, 0), + (36113, 340002, 0, 0, 0), + (36113, 1000088, 0, 0, 0), + (36113, 1100036, 0, 0, 0), + (36113, 1200035, 0, 0, 0), + (36114, 160070, 0, 0, 0), + (36114, 180029, 0, 0, 0), + (36114, 190025, 0, 0, 0), + (36114, 200027, 0, 0, 0), + (36114, 230003, 0, 0, 0), + (36114, 240005, 0, 0, 0), + (36114, 250002, 0, 0, 0), + (36114, 280029, 0, 0, 0), + (36114, 320027, 0, 0, 0), + (36114, 330030, 0, 0, 0), + (36114, 340002, 0, 0, 0), + (36114, 1000130, 0, 0, 0), + (36114, 1100036, 0, 0, 0), + (36114, 1200035, 0, 0, 0), + (36115, 160070, 0, 0, 0), + (36115, 180029, 0, 0, 0), + (36115, 190025, 0, 0, 0), + (36115, 200027, 0, 0, 0), + (36115, 230003, 0, 0, 0), + (36115, 240005, 0, 0, 0), + (36115, 250002, 0, 0, 0), + (36115, 280029, 0, 0, 0), + (36115, 320039, 0, 0, 0), + (36115, 330025, 0, 0, 0), + (36115, 340002, 0, 0, 0), + (36115, 1000049, 0, 0, 0), + (36115, 1100037, 0, 0, 0), + (36115, 1200035, 0, 0, 0), + (36116, 160070, 0, 0, 0), + (36116, 180029, 0, 0, 0), + (36116, 190025, 0, 0, 0), + (36116, 200027, 0, 0, 0), + (36116, 230003, 0, 0, 0), + (36116, 240005, 0, 0, 0), + (36116, 250002, 0, 0, 0), + (36116, 280029, 0, 0, 0), + (36116, 320039, 0, 0, 0), + (36116, 330017, 0, 0, 0), + (36116, 340002, 0, 0, 0), + (36116, 1000050, 0, 0, 0), + (36116, 1100037, 0, 0, 0), + (36116, 1200037, 0, 0, 0), + (36117, 160040, 0, 0, 0), + (36117, 180023, 0, 0, 0), + (36117, 190006, 0, 0, 0), + (36117, 200023, 0, 0, 0), + (36117, 230001, 0, 0, 0), + (36117, 240001, 0, 0, 0), + (36117, 250002, 0, 0, 0), + (36117, 280023, 0, 0, 0), + (36117, 320027, 0, 0, 0), + (36117, 330059, 0, 0, 0), + (36117, 340002, 0, 0, 0), + (36117, 1000084, 0, 0, 0), + (36117, 1100020, 0, 0, 0), + (36117, 1200035, 0, 0, 0), + (36118, 160040, 0, 0, 0), + (36118, 180023, 0, 0, 0), + (36118, 190006, 0, 0, 0), + (36118, 200006, 0, 0, 0), + (36118, 200023, 0, 0, 0), + (36118, 230003, 0, 0, 0), + (36118, 240005, 0, 0, 0), + (36118, 250002, 0, 0, 0), + (36118, 280023, 0, 0, 0), + (36118, 320027, 0, 0, 0), + (36118, 330043, 0, 0, 0), + (36118, 340002, 0, 0, 0), + (36118, 1000016, 0, 0, 0), + (36118, 1100020, 0, 0, 0), + (36118, 1200037, 0, 0, 0), + (36119, 25006, 0, 0, 0), + (36119, 160040, 0, 0, 0), + (36119, 180027, 0, 0, 0), + (36119, 190025, 0, 0, 0), + (36119, 200027, 0, 0, 0), + (36119, 230003, 0, 0, 0), + (36119, 240006, 0, 0, 0), + (36119, 250002, 0, 0, 0), + (36119, 280028, 0, 0, 0), + (36119, 320027, 0, 0, 0), + (36119, 330018, 0, 0, 0), + (36119, 340002, 0, 0, 0), + (36119, 1000016, 0, 0, 0), + (36119, 1100034, 0, 0, 0), + (36119, 1200035, 0, 0, 0), + (36120, 25006, 0, 0, 0), + (36120, 160040, 0, 0, 0), + (36120, 180027, 0, 0, 0), + (36120, 190025, 0, 0, 0), + (36120, 200023, 0, 0, 0), + (36120, 230003, 0, 0, 0), + (36120, 240006, 0, 0, 0), + (36120, 250002, 0, 0, 0), + (36120, 280028, 0, 0, 0), + (36120, 320027, 0, 0, 0), + (36120, 330018, 0, 0, 0), + (36120, 340002, 0, 0, 0), + (36120, 1000051, 0, 0, 0), + (36120, 1100034, 0, 0, 0), + (36120, 1200035, 0, 0, 0), + (36121, 25006, 0, 0, 0), + (36121, 160040, 0, 0, 0), + (36121, 180027, 0, 0, 0), + (36121, 190025, 0, 0, 0), + (36121, 200009, 0, 0, 0), + (36121, 230003, 0, 0, 0), + (36121, 240006, 0, 0, 0), + (36121, 250002, 0, 0, 0), + (36121, 280028, 0, 0, 0), + (36121, 320038, 0, 0, 0), + (36121, 330043, 0, 0, 0), + (36121, 340002, 0, 0, 0), + (36121, 1000129, 0, 0, 0), + (36121, 1100035, 0, 0, 0), + (36121, 1200035, 0, 0, 0), + (36122, 160042, 0, 0, 0), + (36122, 180028, 0, 0, 0), + (36122, 190025, 0, 0, 0), + (36122, 200027, 0, 0, 0), + (36122, 230003, 0, 0, 0), + (36122, 240005, 0, 0, 0), + (36122, 250002, 0, 0, 0), + (36122, 280023, 0, 0, 0), + (36122, 320027, 0, 0, 0), + (36122, 330043, 0, 0, 0), + (36122, 340002, 0, 0, 0), + (36122, 1000091, 0, 0, 0), + (36122, 1100020, 0, 0, 0), + (36122, 1200035, 0, 0, 0), + (36123, 160042, 0, 0, 0), + (36123, 180028, 0, 0, 0), + (36123, 190025, 0, 0, 0), + (36123, 200027, 0, 0, 0), + (36123, 230001, 0, 0, 0), + (36123, 240008, 0, 0, 0), + (36123, 250002, 0, 0, 0), + (36123, 280029, 0, 0, 0), + (36123, 320027, 0, 0, 0), + (36123, 330043, 0, 0, 0), + (36123, 340002, 0, 0, 0), + (36123, 1000090, 0, 0, 0), + (36123, 1100037, 0, 0, 0), + (36123, 1200035, 0, 0, 0), + (36124, 160042, 0, 0, 0), + (36124, 180028, 0, 0, 0), + (36124, 190025, 0, 0, 0), + (36124, 200027, 0, 0, 0), + (36124, 230001, 0, 0, 0), + (36124, 240005, 0, 0, 0), + (36124, 250002, 0, 0, 0), + (36124, 280029, 0, 0, 0), + (36124, 320039, 0, 0, 0), + (36124, 330043, 0, 0, 0), + (36124, 340002, 0, 0, 0), + (36124, 1000092, 0, 0, 0), + (36124, 1100037, 0, 0, 0), + (36124, 1200035, 0, 0, 0), + (36125, 160042, 0, 0, 0), + (36125, 180028, 0, 0, 0), + (36125, 190025, 0, 0, 0), + (36125, 200027, 0, 0, 0), + (36125, 230003, 0, 0, 0), + (36125, 240005, 0, 0, 0), + (36125, 250002, 0, 0, 0), + (36125, 280029, 0, 0, 0), + (36125, 320027, 0, 0, 0), + (36125, 330018, 0, 0, 0), + (36125, 340002, 0, 0, 0), + (36125, 1000092, 0, 0, 0), + (36125, 1100037, 0, 0, 0), + (36125, 1200035, 0, 0, 0), + (36126, 160026, 0, 0, 0), + (36126, 180018, 0, 0, 0), + (36126, 190077, 0, 0, 0), + (36126, 200066, 0, 0, 0), + (36126, 230001, 0, 0, 0), + (36126, 240001, 0, 0, 0), + (36126, 250001, 0, 0, 0), + (36126, 280050, 0, 0, 0), + (36126, 320098, 0, 0, 0), + (36126, 330024, 0, 0, 0), + (36126, 340002, 0, 0, 0), + (36126, 1000095, 0, 0, 0), + (36126, 1100119, 0, 0, 0), + (36126, 1200048, 0, 0, 0), + (36127, 160026, 0, 0, 0), + (36127, 180018, 0, 0, 0), + (36127, 190077, 0, 0, 0), + (36127, 200066, 0, 0, 0), + (36127, 230001, 0, 0, 0), + (36127, 240001, 0, 0, 0), + (36127, 250001, 0, 0, 0), + (36127, 280050, 0, 0, 0), + (36127, 320098, 0, 0, 0), + (36127, 330035, 0, 0, 0), + (36127, 340002, 0, 0, 0), + (36127, 1000094, 0, 0, 0), + (36127, 1100119, 0, 0, 0), + (36127, 1200048, 0, 0, 0), + (36128, 160026, 0, 0, 0), + (36128, 180018, 0, 0, 0), + (36128, 190077, 0, 0, 0), + (36128, 200066, 0, 0, 0), + (36128, 230001, 0, 0, 0), + (36128, 240001, 0, 0, 0), + (36128, 250001, 0, 0, 0), + (36128, 280050, 0, 0, 0), + (36128, 320098, 0, 0, 0), + (36128, 330035, 0, 0, 0), + (36128, 340002, 0, 0, 0), + (36128, 1000001, 0, 0, 0), + (36128, 1100119, 0, 0, 0), + (36128, 1200048, 0, 0, 0), + (36129, 160028, 0, 0, 0), + (36129, 180018, 0, 0, 0), + (36129, 190020, 0, 0, 0), + (36129, 200066, 0, 0, 0), + (36129, 230001, 0, 0, 0), + (36129, 240001, 0, 0, 0), + (36129, 250001, 0, 0, 0), + (36129, 280050, 0, 0, 0), + (36129, 320098, 0, 0, 0), + (36129, 330035, 0, 0, 0), + (36129, 340002, 0, 0, 0), + (36129, 1000096, 0, 0, 0), + (36129, 1100119, 0, 0, 0), + (36129, 1200048, 0, 0, 0), + (36130, 160028, 0, 0, 0), + (36130, 180018, 0, 0, 0), + (36130, 190077, 0, 0, 0), + (36130, 200066, 0, 0, 0), + (36130, 230001, 0, 0, 0), + (36130, 240001, 0, 0, 0), + (36130, 250001, 0, 0, 0), + (36130, 280050, 0, 0, 0), + (36130, 320098, 0, 0, 0), + (36130, 330035, 0, 0, 0), + (36130, 340002, 0, 0, 0), + (36130, 1000001, 0, 0, 0), + (36130, 1100119, 0, 0, 0), + (36130, 1200048, 0, 0, 0), + (36131, 160028, 0, 0, 0), + (36131, 180018, 0, 0, 0), + (36131, 190077, 0, 0, 0), + (36131, 200066, 0, 0, 0), + (36131, 230001, 0, 0, 0), + (36131, 240001, 0, 0, 0), + (36131, 250001, 0, 0, 0), + (36131, 280050, 0, 0, 0), + (36131, 320098, 0, 0, 0), + (36131, 330061, 0, 0, 0), + (36131, 340002, 0, 0, 0), + (36131, 1000099, 0, 0, 0), + (36131, 1100119, 0, 0, 0), + (36131, 1200048, 0, 0, 0), + (36132, 160035, 0, 0, 0), + (36132, 180017, 0, 0, 0), + (36132, 190019, 0, 0, 0), + (36132, 200028, 0, 0, 0), + (36132, 230003, 0, 0, 0), + (36132, 240005, 0, 0, 0), + (36132, 250001, 0, 0, 0), + (36132, 280001, 0, 0, 0), + (36132, 320001, 0, 0, 0), + (36132, 330036, 0, 0, 0), + (36132, 340002, 0, 0, 0), + (36132, 1000132, 0, 0, 0), + (36132, 1100010, 0, 0, 0), + (36132, 1200028, 0, 0, 0), + (36133, 160035, 0, 0, 0), + (36133, 180017, 0, 0, 0), + (36133, 190019, 0, 0, 0), + (36133, 200028, 0, 0, 0), + (36133, 230003, 0, 0, 0), + (36133, 240005, 0, 0, 0), + (36133, 250001, 0, 0, 0), + (36133, 280008, 0, 0, 0), + (36133, 320006, 0, 0, 0), + (36133, 330027, 0, 0, 0), + (36133, 340002, 0, 0, 0), + (36133, 1000053, 0, 0, 0), + (36133, 1100040, 0, 0, 0), + (36133, 1200003, 0, 0, 0), + (36134, 160035, 0, 0, 0), + (36134, 180017, 0, 0, 0), + (36134, 190019, 0, 0, 0), + (36134, 200028, 0, 0, 0), + (36134, 230003, 0, 0, 0), + (36134, 240005, 0, 0, 0), + (36134, 250001, 0, 0, 0), + (36134, 280001, 0, 0, 0), + (36134, 320001, 0, 0, 0), + (36134, 330062, 0, 0, 0), + (36134, 340002, 0, 0, 0), + (36134, 1000133, 0, 0, 0), + (36134, 1100010, 0, 0, 0), + (36134, 1200003, 0, 0, 0), + (36135, 160030, 0, 0, 0), + (36135, 180017, 0, 0, 0), + (36135, 190019, 0, 0, 0), + (36135, 200001, 0, 0, 0), + (36135, 230001, 0, 0, 0), + (36135, 240001, 0, 0, 0), + (36135, 250001, 0, 0, 0), + (36135, 280001, 0, 0, 0), + (36135, 320001, 0, 0, 0), + (36135, 330036, 0, 0, 0), + (36135, 340002, 0, 0, 0), + (36135, 1000030, 0, 0, 0), + (36135, 1100040, 0, 0, 0), + (36135, 1200003, 0, 0, 0), + (36136, 160030, 0, 0, 0), + (36136, 180050, 0, 0, 0), + (36136, 190003, 0, 0, 0), + (36136, 200028, 0, 0, 0), + (36136, 230001, 0, 0, 0), + (36136, 240001, 0, 0, 0), + (36136, 250001, 0, 0, 0), + (36136, 280040, 0, 0, 0), + (36136, 320006, 0, 0, 0), + (36136, 330025, 0, 0, 0), + (36136, 340002, 0, 0, 0), + (36136, 1000053, 0, 0, 0), + (36136, 1100039, 0, 0, 0), + (36136, 1200028, 0, 0, 0), + (36137, 160030, 0, 0, 0), + (36137, 180050, 0, 0, 0), + (36137, 190003, 0, 0, 0), + (36137, 200028, 0, 0, 0), + (36137, 230003, 0, 0, 0), + (36137, 240005, 0, 0, 0), + (36137, 250001, 0, 0, 0), + (36137, 280040, 0, 0, 0), + (36137, 320006, 0, 0, 0), + (36137, 330063, 0, 0, 0), + (36137, 340003, 0, 0, 0), + (36137, 1000053, 0, 0, 0), + (36137, 1100039, 0, 0, 0), + (36137, 1200028, 0, 0, 0), + (36138, 160030, 0, 0, 0), + (36138, 180017, 0, 0, 0), + (36138, 190019, 0, 0, 0), + (36138, 200028, 0, 0, 0), + (36138, 230003, 0, 0, 0), + (36138, 240008, 0, 0, 0), + (36138, 250001, 0, 0, 0), + (36138, 280040, 0, 0, 0), + (36138, 320001, 0, 0, 0), + (36138, 330027, 0, 0, 0), + (36138, 340002, 0, 0, 0), + (36138, 1000030, 0, 0, 0), + (36138, 1100042, 0, 0, 0), + (36138, 1200028, 0, 0, 0), + (36139, 160030, 0, 0, 0), + (36139, 180017, 0, 0, 0), + (36139, 190003, 0, 0, 0), + (36139, 200001, 0, 0, 0), + (36139, 230003, 0, 0, 0), + (36139, 240008, 0, 0, 0), + (36139, 250001, 0, 0, 0), + (36139, 280040, 0, 0, 0), + (36139, 320001, 0, 0, 0), + (36139, 330063, 0, 0, 0), + (36139, 340002, 0, 0, 0), + (36139, 1000053, 0, 0, 0), + (36139, 1100040, 0, 0, 0), + (36139, 1200028, 0, 0, 0), + (36140, 160030, 0, 0, 0), + (36140, 180017, 0, 0, 0), + (36140, 190019, 0, 0, 0), + (36140, 200001, 0, 0, 0), + (36140, 230001, 0, 0, 0), + (36140, 240001, 0, 0, 0), + (36140, 250001, 0, 0, 0), + (36140, 280001, 0, 0, 0), + (36140, 320001, 0, 0, 0), + (36140, 330062, 0, 0, 0), + (36140, 340002, 0, 0, 0), + (36140, 1000133, 0, 0, 0), + (36140, 1100040, 0, 0, 0), + (36140, 1200003, 0, 0, 0), + (36141, 160030, 0, 0, 0), + (36141, 180017, 0, 0, 0), + (36141, 190019, 0, 0, 0), + (36141, 200001, 0, 0, 0), + (36141, 230001, 0, 0, 0), + (36141, 240006, 0, 0, 0), + (36141, 250001, 0, 0, 0), + (36141, 280001, 0, 0, 0), + (36141, 320001, 0, 0, 0), + (36141, 330062, 0, 0, 0), + (36141, 340002, 0, 0, 0), + (36141, 1000106, 0, 0, 0), + (36141, 1100040, 0, 0, 0), + (36141, 1200003, 0, 0, 0), + (36142, 160030, 0, 0, 0), + (36142, 180017, 0, 0, 0), + (36142, 190019, 0, 0, 0), + (36142, 200001, 0, 0, 0), + (36142, 230003, 0, 0, 0), + (36142, 240005, 0, 0, 0), + (36142, 250001, 0, 0, 0), + (36142, 280040, 0, 0, 0), + (36142, 320001, 0, 0, 0), + (36142, 330036, 0, 0, 0), + (36142, 340002, 0, 0, 0), + (36142, 1000053, 0, 0, 0), + (36142, 1100040, 0, 0, 0), + (36142, 1200003, 0, 0, 0), + (36143, 160030, 0, 0, 0), + (36143, 180050, 0, 0, 0), + (36143, 190019, 0, 0, 0), + (36143, 200028, 0, 0, 0), + (36143, 230003, 0, 0, 0), + (36143, 240008, 0, 0, 0), + (36143, 250001, 0, 0, 0), + (36143, 280040, 0, 0, 0), + (36143, 320006, 0, 0, 0), + (36143, 330004, 0, 0, 0), + (36143, 340002, 0, 0, 0), + (36143, 1000053, 0, 0, 0), + (36143, 1100040, 0, 0, 0), + (36143, 1200003, 0, 0, 0), + (36144, 160031, 0, 0, 0), + (36144, 180050, 0, 0, 0), + (36144, 190003, 0, 0, 0), + (36144, 200028, 0, 0, 0), + (36144, 230003, 0, 0, 0), + (36144, 240005, 0, 0, 0), + (36144, 250001, 0, 0, 0), + (36144, 280040, 0, 0, 0), + (36144, 320006, 0, 0, 0), + (36144, 330004, 0, 0, 0), + (36144, 340002, 0, 0, 0), + (36144, 1000031, 0, 0, 0), + (36144, 1100039, 0, 0, 0), + (36144, 1200028, 0, 0, 0), + (36145, 160031, 0, 0, 0), + (36145, 180050, 0, 0, 0), + (36145, 190003, 0, 0, 0), + (36145, 200028, 0, 0, 0), + (36145, 230003, 0, 0, 0), + (36145, 240005, 0, 0, 0), + (36145, 250001, 0, 0, 0), + (36145, 280040, 0, 0, 0), + (36145, 320006, 0, 0, 0), + (36145, 330064, 0, 0, 0), + (36145, 340003, 0, 0, 0), + (36145, 1000103, 0, 0, 0), + (36145, 1100039, 0, 0, 0), + (36145, 1200028, 0, 0, 0), + (36146, 160032, 0, 0, 0), + (36146, 180017, 0, 0, 0), + (36146, 190019, 0, 0, 0), + (36146, 200001, 0, 0, 0), + (36146, 230003, 0, 0, 0), + (36146, 240006, 0, 0, 0), + (36146, 250001, 0, 0, 0), + (36146, 280040, 0, 0, 0), + (36146, 320006, 0, 0, 0), + (36146, 330027, 0, 0, 0), + (36146, 340002, 0, 0, 0), + (36146, 1000005, 0, 0, 0), + (36146, 1100040, 0, 0, 0), + (36146, 1200029, 0, 0, 0), + (36147, 160032, 0, 0, 0), + (36147, 180032, 0, 0, 0), + (36147, 190002, 0, 0, 0), + (36147, 200028, 0, 0, 0), + (36147, 230003, 0, 0, 0), + (36147, 240006, 0, 0, 0), + (36147, 250001, 0, 0, 0), + (36147, 280040, 0, 0, 0), + (36147, 320006, 0, 0, 0), + (36147, 330027, 0, 0, 0), + (36147, 340002, 0, 0, 0), + (36147, 1000052, 0, 0, 0), + (36147, 1100039, 0, 0, 0), + (36147, 1200029, 0, 0, 0), + (36148, 160032, 0, 0, 0), + (36148, 180032, 0, 0, 0), + (36148, 190002, 0, 0, 0), + (36148, 200028, 0, 0, 0), + (36148, 230003, 0, 0, 0), + (36148, 240006, 0, 0, 0), + (36148, 250001, 0, 0, 0), + (36148, 280040, 0, 0, 0), + (36148, 320044, 0, 0, 0), + (36148, 330022, 0, 0, 0), + (36148, 340003, 0, 0, 0), + (36148, 1000052, 0, 0, 0), + (36148, 1100039, 0, 0, 0), + (36148, 1200029, 0, 0, 0), + (36149, 160032, 0, 0, 0), + (36149, 180032, 0, 0, 0), + (36149, 190026, 0, 0, 0), + (36149, 200010, 0, 0, 0), + (36149, 230004, 0, 0, 0), + (36149, 240007, 0, 0, 0), + (36149, 250005, 0, 0, 0), + (36149, 280040, 0, 0, 0), + (36149, 320043, 0, 0, 0), + (36149, 330047, 0, 0, 0), + (36149, 340003, 0, 0, 0), + (36149, 1000033, 0, 0, 0), + (36149, 1100039, 0, 0, 0), + (36149, 1200029, 0, 0, 0), + (36150, 160033, 0, 0, 0), + (36150, 180017, 0, 0, 0), + (36150, 190020, 0, 0, 0), + (36150, 200028, 0, 0, 0), + (36150, 230003, 0, 0, 0), + (36150, 240005, 0, 0, 0), + (36150, 250001, 0, 0, 0), + (36150, 280040, 0, 0, 0), + (36150, 320001, 0, 0, 0), + (36150, 330033, 0, 0, 0), + (36150, 340002, 0, 0, 0), + (36150, 1000134, 0, 0, 0), + (36150, 1100040, 0, 0, 0), + (36150, 1200029, 0, 0, 0), + (36151, 160033, 0, 0, 0), + (36151, 180035, 0, 0, 0), + (36151, 190027, 0, 0, 0), + (36151, 200028, 0, 0, 0), + (36151, 230003, 0, 0, 0), + (36151, 240005, 0, 0, 0), + (36151, 250001, 0, 0, 0), + (36151, 280040, 0, 0, 0), + (36151, 320006, 0, 0, 0), + (36151, 330027, 0, 0, 0), + (36151, 340002, 0, 0, 0), + (36151, 1000134, 0, 0, 0), + (36151, 1100039, 0, 0, 0), + (36151, 1200029, 0, 0, 0), + (36152, 160033, 0, 0, 0), + (36152, 180051, 0, 0, 0), + (36152, 190027, 0, 0, 0), + (36152, 200028, 0, 0, 0), + (36152, 230003, 0, 0, 0), + (36152, 240006, 0, 0, 0), + (36152, 250008, 0, 0, 0), + (36152, 280008, 0, 0, 0), + (36152, 320011, 0, 0, 0), + (36152, 330033, 0, 0, 0), + (36152, 340003, 0, 0, 0), + (36152, 1000005, 0, 0, 0), + (36152, 1100040, 0, 0, 0), + (36152, 1200029, 0, 0, 0), + (36153, 160033, 0, 0, 0), + (36153, 180051, 0, 0, 0), + (36153, 190026, 0, 0, 0), + (36153, 200028, 0, 0, 0), + (36153, 230004, 0, 0, 0), + (36153, 240005, 0, 0, 0), + (36153, 250005, 0, 0, 0), + (36153, 280008, 0, 0, 0), + (36153, 320011, 0, 0, 0), + (36153, 330033, 0, 0, 0), + (36153, 340004, 0, 0, 0), + (36153, 1000005, 0, 0, 0), + (36153, 1100040, 0, 0, 0), + (36153, 1200029, 0, 0, 0), + (36154, 160023, 0, 0, 0), + (36154, 180030, 0, 0, 0), + (36154, 190020, 0, 0, 0), + (36154, 200004, 0, 0, 0), + (36154, 230002, 0, 0, 0), + (36154, 240001, 0, 0, 0), + (36154, 250001, 0, 0, 0), + (36154, 280018, 0, 0, 0), + (36154, 320022, 0, 0, 0), + (36154, 330003, 0, 0, 0), + (36154, 340001, 0, 0, 0), + (36154, 1000135, 0, 0, 0), + (36154, 1100005, 0, 0, 0), + (36154, 1200017, 0, 0, 0), + (36155, 160083, 0, 0, 0), + (36155, 180052, 0, 0, 0), + (36155, 190020, 0, 0, 0), + (36155, 200004, 0, 0, 0), + (36155, 230001, 0, 0, 0), + (36155, 240005, 0, 0, 0), + (36155, 250001, 0, 0, 0), + (36155, 280018, 0, 0, 0), + (36155, 320022, 0, 0, 0), + (36155, 330035, 0, 0, 0), + (36155, 340001, 0, 0, 0), + (36155, 1000136, 0, 0, 0), + (36155, 1100101, 0, 0, 0), + (36155, 1200038, 0, 0, 0), + (36156, 160025, 0, 0, 0), + (36156, 180030, 0, 0, 0), + (36156, 190020, 0, 0, 0), + (36156, 200004, 0, 0, 0), + (36156, 230002, 0, 0, 0), + (36156, 240001, 0, 0, 0), + (36156, 250001, 0, 0, 0), + (36156, 280018, 0, 0, 0), + (36156, 320022, 0, 0, 0), + (36156, 330024, 0, 0, 0), + (36156, 340001, 0, 0, 0), + (36156, 1000137, 0, 0, 0), + (36156, 1100005, 0, 0, 0), + (36156, 1200017, 0, 0, 0), + (36157, 160025, 0, 0, 0), + (36157, 180030, 0, 0, 0), + (36157, 190020, 0, 0, 0), + (36157, 200004, 0, 0, 0), + (36157, 230001, 0, 0, 0), + (36157, 240001, 0, 0, 0), + (36157, 250001, 0, 0, 0), + (36157, 280018, 0, 0, 0), + (36157, 320022, 0, 0, 0), + (36157, 330035, 0, 0, 0), + (36157, 340001, 0, 0, 0), + (36157, 1000136, 0, 0, 0), + (36157, 1100005, 0, 0, 0), + (36157, 1200017, 0, 0, 0), + (36158, 160027, 0, 0, 0), + (36158, 180030, 0, 0, 0), + (36158, 190020, 0, 0, 0), + (36158, 200004, 0, 0, 0), + (36158, 230002, 0, 0, 0), + (36158, 240001, 0, 0, 0), + (36158, 250001, 0, 0, 0), + (36158, 280018, 0, 0, 0), + (36158, 320022, 0, 0, 0), + (36158, 330042, 0, 0, 0), + (36158, 340001, 0, 0, 0), + (36158, 1000137, 0, 0, 0), + (36158, 1100005, 0, 0, 0), + (36158, 1200017, 0, 0, 0), + (36159, 160027, 0, 0, 0), + (36159, 180030, 0, 0, 0), + (36159, 190020, 0, 0, 0), + (36159, 200004, 0, 0, 0), + (36159, 230001, 0, 0, 0), + (36159, 240001, 0, 0, 0), + (36159, 250001, 0, 0, 0), + (36159, 280018, 0, 0, 0), + (36159, 320022, 0, 0, 0), + (36159, 330035, 0, 0, 0), + (36159, 340001, 0, 0, 0), + (36159, 1000138, 0, 0, 0), + (36159, 1100005, 0, 0, 0), + (36159, 1200017, 0, 0, 0), + (36160, 160084, 0, 0, 0), + (36160, 180034, 0, 0, 0), + (36160, 190001, 0, 0, 0), + (36160, 200054, 0, 0, 0), + (36160, 230003, 0, 0, 0), + (36160, 240005, 0, 0, 0), + (36160, 250001, 0, 0, 0), + (36160, 280041, 0, 0, 0), + (36160, 320087, 0, 0, 0), + (36160, 330025, 0, 0, 0), + (36160, 340003, 0, 0, 0), + (36160, 1000139, 0, 0, 0), + (36160, 1100005, 0, 0, 0), + (36160, 1200038, 0, 0, 0), + (36161, 160019, 0, 0, 0), + (36161, 180030, 0, 0, 0), + (36161, 190020, 0, 0, 0), + (36161, 200004, 0, 0, 0), + (36161, 230001, 0, 0, 0), + (36161, 240001, 0, 0, 0), + (36161, 250001, 0, 0, 0), + (36161, 280018, 0, 0, 0), + (36161, 320022, 0, 0, 0), + (36161, 330062, 0, 0, 0), + (36161, 340002, 0, 0, 0), + (36161, 1000140, 0, 0, 0), + (36161, 1100101, 0, 0, 0), + (36161, 1200017, 0, 0, 0), + (36162, 160019, 0, 0, 0), + (36162, 180030, 0, 0, 0), + (36162, 190020, 0, 0, 0), + (36162, 200004, 0, 0, 0), + (36162, 230001, 0, 0, 0), + (36162, 240006, 0, 0, 0), + (36162, 250001, 0, 0, 0), + (36162, 280018, 0, 0, 0), + (36162, 320022, 0, 0, 0), + (36162, 330036, 0, 0, 0), + (36162, 340002, 0, 0, 0), + (36162, 1000141, 0, 0, 0), + (36162, 1100101, 0, 0, 0), + (36162, 1200017, 0, 0, 0), + (36163, 160019, 0, 0, 0), + (36163, 180030, 0, 0, 0), + (36163, 190020, 0, 0, 0), + (36163, 200004, 0, 0, 0), + (36163, 230001, 0, 0, 0), + (36163, 240001, 0, 0, 0), + (36163, 250001, 0, 0, 0), + (36163, 280018, 0, 0, 0), + (36163, 320022, 0, 0, 0), + (36163, 330062, 0, 0, 0), + (36163, 340002, 0, 0, 0), + (36163, 1000137, 0, 0, 0), + (36163, 1100101, 0, 0, 0), + (36163, 1200017, 0, 0, 0), + (36164, 160029, 0, 0, 0), + (36164, 180056, 0, 0, 0), + (36164, 190073, 0, 0, 0), + (36164, 200063, 0, 0, 0), + (36164, 230001, 0, 0, 0), + (36164, 240001, 0, 0, 0), + (36164, 250001, 0, 0, 0), + (36164, 280046, 0, 0, 0), + (36164, 320093, 0, 0, 0), + (36164, 330062, 0, 0, 0), + (36164, 340002, 0, 0, 0), + (36164, 1000107, 0, 0, 0), + (36164, 1100114, 0, 0, 0), + (36164, 1200043, 0, 0, 0), + (36165, 160029, 0, 0, 0), + (36165, 180056, 0, 0, 0), + (36165, 190073, 0, 0, 0), + (36165, 200063, 0, 0, 0), + (36165, 230003, 0, 0, 0), + (36165, 240005, 0, 0, 0), + (36165, 250001, 0, 0, 0), + (36165, 280053, 0, 0, 0), + (36165, 320093, 0, 0, 0), + (36165, 330037, 0, 0, 0), + (36165, 340002, 0, 0, 0), + (36165, 1000108, 0, 0, 0), + (36165, 1100114, 0, 0, 0), + (36165, 1200043, 0, 0, 0), + (36166, 160029, 0, 0, 0), + (36166, 180056, 0, 0, 0), + (36166, 190073, 0, 0, 0), + (36166, 200063, 0, 0, 0), + (36166, 230003, 0, 0, 0), + (36166, 240005, 0, 0, 0), + (36166, 250001, 0, 0, 0), + (36166, 280053, 0, 0, 0), + (36166, 320093, 0, 0, 0), + (36166, 330038, 0, 0, 0), + (36166, 340002, 0, 0, 0), + (36166, 1000109, 0, 0, 0), + (36166, 1100114, 0, 0, 0), + (36166, 1200043, 0, 0, 0), + (36167, 160029, 0, 0, 0), + (36167, 180057, 0, 0, 0), + (36167, 190074, 0, 0, 0), + (36167, 200063, 0, 0, 0), + (36167, 230003, 0, 0, 0), + (36167, 240005, 0, 0, 0), + (36167, 250001, 0, 0, 0), + (36167, 280053, 0, 0, 0), + (36167, 320094, 0, 0, 0), + (36167, 330038, 0, 0, 0), + (36167, 340002, 0, 0, 0), + (36167, 1000058, 0, 0, 0), + (36167, 1100115, 0, 0, 0), + (36167, 1200044, 0, 0, 0), + (36168, 160029, 0, 0, 0), + (36168, 180057, 0, 0, 0), + (36168, 190074, 0, 0, 0), + (36168, 200063, 0, 0, 0), + (36168, 230003, 0, 0, 0), + (36168, 240005, 0, 0, 0), + (36168, 250001, 0, 0, 0), + (36168, 280053, 0, 0, 0), + (36168, 320094, 0, 0, 0), + (36168, 330037, 0, 0, 0), + (36168, 340002, 0, 0, 0), + (36168, 1000029, 0, 0, 0), + (36168, 1100116, 0, 0, 0), + (36168, 1200044, 0, 0, 0), + (36169, 160029, 0, 0, 0), + (36169, 180056, 0, 0, 0), + (36169, 190073, 0, 0, 0), + (36169, 200062, 0, 0, 0), + (36169, 230001, 0, 0, 0), + (36169, 240001, 0, 0, 0), + (36169, 250001, 0, 0, 0), + (36169, 280046, 0, 0, 0), + (36169, 320093, 0, 0, 0), + (36169, 330042, 0, 0, 0), + (36169, 340002, 0, 0, 0), + (36169, 1000110, 0, 0, 0), + (36169, 1100114, 0, 0, 0), + (36169, 1200043, 0, 0, 0), + (36170, 160020, 0, 0, 0), + (36170, 180056, 0, 0, 0), + (36170, 190073, 0, 0, 0), + (36170, 200062, 0, 0, 0), + (36170, 230001, 0, 0, 0), + (36170, 240001, 0, 0, 0), + (36170, 250001, 0, 0, 0), + (36170, 280053, 0, 0, 0), + (36170, 320093, 0, 0, 0), + (36170, 330042, 0, 0, 0), + (36170, 340002, 0, 0, 0), + (36170, 1000109, 0, 0, 0), + (36170, 1100114, 0, 0, 0), + (36170, 1200043, 0, 0, 0), + (36171, 160020, 0, 0, 0), + (36171, 180056, 0, 0, 0), + (36171, 190073, 0, 0, 0), + (36171, 200062, 0, 0, 0), + (36171, 230001, 0, 0, 0), + (36171, 240001, 0, 0, 0), + (36171, 250001, 0, 0, 0), + (36171, 280046, 0, 0, 0), + (36171, 320093, 0, 0, 0), + (36171, 330042, 0, 0, 0), + (36171, 340002, 0, 0, 0), + (36171, 1000110, 0, 0, 0), + (36171, 1100114, 0, 0, 0), + (36171, 1200043, 0, 0, 0), + (36172, 160034, 0, 0, 0), + (36172, 180058, 0, 0, 0), + (36172, 190075, 0, 0, 0), + (36172, 200064, 0, 0, 0), + (36172, 230003, 0, 0, 0), + (36172, 240005, 0, 0, 0), + (36172, 250001, 0, 0, 0), + (36172, 280048, 0, 0, 0), + (36172, 320095, 0, 0, 0), + (36172, 330038, 0, 0, 0), + (36172, 340002, 0, 0, 0), + (36172, 1000034, 0, 0, 0), + (36172, 1100118, 0, 0, 0), + (36172, 1200045, 0, 0, 0), + (36173, 160034, 0, 0, 0), + (36173, 180058, 0, 0, 0), + (36173, 190075, 0, 0, 0), + (36173, 200064, 0, 0, 0), + (36173, 230003, 0, 0, 0), + (36173, 240005, 0, 0, 0), + (36173, 250001, 0, 0, 0), + (36173, 280047, 0, 0, 0), + (36173, 320095, 0, 0, 0), + (36173, 330062, 0, 0, 0), + (36173, 340002, 0, 0, 0), + (36173, 1000034, 0, 0, 0), + (36173, 1100118, 0, 0, 0), + (36173, 1200045, 0, 0, 0), + (36174, 160034, 0, 0, 0), + (36174, 180058, 0, 0, 0), + (36174, 190075, 0, 0, 0), + (36174, 200012, 0, 0, 0), + (36174, 230003, 0, 0, 0), + (36174, 240005, 0, 0, 0), + (36174, 250006, 0, 0, 0), + (36174, 280048, 0, 0, 0), + (36174, 320096, 0, 0, 0), + (36174, 330025, 0, 0, 0), + (36174, 340002, 0, 0, 0), + (36174, 1000035, 0, 0, 0), + (36174, 1100118, 0, 0, 0), + (36174, 1200047, 0, 0, 0), + (36175, 160034, 0, 0, 0), + (36175, 180058, 0, 0, 0), + (36175, 190075, 0, 0, 0), + (36175, 200064, 0, 0, 0), + (36175, 230003, 0, 0, 0), + (36175, 240005, 0, 0, 0), + (36175, 250001, 0, 0, 0), + (36175, 280048, 0, 0, 0), + (36175, 320096, 0, 0, 0), + (36175, 330043, 0, 0, 0), + (36175, 340002, 0, 0, 0), + (36175, 1000035, 0, 0, 0), + (36175, 1100118, 0, 0, 0), + (36175, 1200045, 0, 0, 0), + (36176, 160034, 0, 0, 0), + (36176, 180058, 0, 0, 0), + (36176, 190075, 0, 0, 0), + (36176, 200064, 0, 0, 0), + (36176, 230001, 0, 0, 0), + (36176, 240001, 0, 0, 0), + (36176, 250001, 0, 0, 0), + (36176, 280047, 0, 0, 0), + (36176, 320095, 0, 0, 0), + (36176, 330035, 0, 0, 0), + (36176, 340002, 0, 0, 0), + (36176, 1000027, 0, 0, 0), + (36176, 1100117, 0, 0, 0), + (36176, 1200045, 0, 0, 0), + (36177, 160082, 0, 0, 0), + (36177, 180060, 0, 0, 0), + (36177, 190029, 0, 0, 0), + (36177, 200012, 0, 0, 0), + (36177, 230005, 0, 0, 0), + (36177, 240007, 0, 0, 0), + (36177, 250001, 0, 0, 0), + (36177, 280032, 0, 0, 0), + (36177, 320046, 0, 0, 0), + (36177, 330040, 0, 0, 0), + (36177, 340003, 0, 0, 0), + (36177, 1000054, 0, 0, 0), + (36177, 1100043, 0, 0, 0), + (36177, 1200005, 0, 0, 0), + (36178, 160044, 0, 0, 0), + (36178, 180058, 0, 0, 0), + (36178, 190075, 0, 0, 0), + (36178, 200064, 0, 0, 0), + (36178, 230003, 0, 0, 0), + (36178, 240005, 0, 0, 0), + (36178, 250001, 0, 0, 0), + (36178, 280048, 0, 0, 0), + (36178, 320095, 0, 0, 0), + (36178, 330038, 0, 0, 0), + (36178, 340002, 0, 0, 0), + (36178, 1000034, 0, 0, 0), + (36178, 1100118, 0, 0, 0), + (36178, 1200045, 0, 0, 0), + (36179, 160044, 0, 0, 0), + (36179, 180058, 0, 0, 0), + (36179, 190075, 0, 0, 0), + (36179, 200064, 0, 0, 0), + (36179, 230003, 0, 0, 0), + (36179, 240003, 0, 0, 0), + (36179, 250001, 0, 0, 0), + (36179, 280047, 0, 0, 0), + (36179, 320095, 0, 0, 0), + (36179, 330037, 0, 0, 0), + (36179, 340002, 0, 0, 0), + (36179, 1000027, 0, 0, 0), + (36179, 1100117, 0, 0, 0), + (36179, 1200045, 0, 0, 0), + (36180, 160044, 0, 0, 0), + (36180, 180058, 0, 0, 0), + (36180, 190075, 0, 0, 0), + (36180, 200012, 0, 0, 0), + (36180, 230003, 0, 0, 0), + (36180, 240005, 0, 0, 0), + (36180, 250001, 0, 0, 0), + (36180, 280048, 0, 0, 0), + (36180, 320096, 0, 0, 0), + (36180, 330038, 0, 0, 0), + (36180, 340002, 0, 0, 0), + (36180, 1000027, 0, 0, 0), + (36180, 1100118, 0, 0, 0), + (36180, 1200047, 0, 0, 0), + (36181, 160073, 0, 0, 0), + (36181, 180015, 0, 0, 0), + (36181, 190017, 0, 0, 0), + (36181, 200029, 0, 0, 0), + (36181, 230001, 0, 0, 0), + (36181, 240006, 0, 0, 0), + (36181, 250002, 0, 0, 0), + (36181, 280036, 0, 0, 0), + (36181, 320004, 0, 0, 0), + (36181, 330065, 0, 0, 0), + (36181, 340002, 0, 0, 0), + (36181, 1000120, 0, 0, 0), + (36181, 1100044, 0, 0, 0), + (36181, 1200015, 0, 0, 0), + (36182, 160073, 0, 0, 0), + (36182, 180015, 0, 0, 0), + (36182, 190017, 0, 0, 0), + (36182, 200029, 0, 0, 0), + (36182, 230001, 0, 0, 0), + (36182, 240005, 0, 0, 0), + (36182, 250002, 0, 0, 0), + (36182, 280036, 0, 0, 0), + (36182, 320004, 0, 0, 0), + (36182, 330066, 0, 0, 0), + (36182, 340002, 0, 0, 0), + (36182, 1000120, 0, 0, 0), + (36182, 1100044, 0, 0, 0), + (36182, 1200015, 0, 0, 0), + (36183, 160073, 0, 0, 0), + (36183, 180015, 0, 0, 0), + (36183, 190017, 0, 0, 0), + (36183, 200029, 0, 0, 0), + (36183, 230001, 0, 0, 0), + (36183, 240001, 0, 0, 0), + (36183, 250002, 0, 0, 0), + (36183, 280017, 0, 0, 0), + (36183, 320004, 0, 0, 0), + (36183, 330065, 0, 0, 0), + (36183, 340002, 0, 0, 0), + (36183, 1000114, 0, 0, 0), + (36183, 1100044, 0, 0, 0), + (36183, 1200015, 0, 0, 0), + (36184, 160073, 0, 0, 0), + (36184, 180015, 0, 0, 0), + (36184, 190017, 0, 0, 0), + (36184, 200029, 0, 0, 0), + (36184, 230003, 0, 0, 0), + (36184, 240005, 0, 0, 0), + (36184, 250002, 0, 0, 0), + (36184, 280036, 0, 0, 0), + (36184, 320049, 0, 0, 0), + (36184, 330019, 0, 0, 0), + (36184, 340002, 0, 0, 0), + (36184, 1000120, 0, 0, 0), + (36184, 1100044, 0, 0, 0), + (36184, 1200015, 0, 0, 0), + (36185, 160074, 0, 0, 0), + (36185, 180036, 0, 0, 0), + (36185, 190017, 0, 0, 0), + (36185, 200014, 0, 0, 0), + (36185, 230001, 0, 0, 0), + (36185, 240001, 0, 0, 0), + (36185, 250002, 0, 0, 0), + (36185, 280017, 0, 0, 0), + (36185, 320004, 0, 0, 0), + (36185, 330052, 0, 0, 0), + (36185, 340002, 0, 0, 0), + (36185, 1000142, 0, 0, 0), + (36185, 1100015, 0, 0, 0), + (36185, 1200015, 0, 0, 0), + (36186, 160073, 0, 0, 0), + (36186, 180036, 0, 0, 0), + (36186, 190017, 0, 0, 0), + (36186, 200029, 0, 0, 0), + (36186, 230001, 0, 0, 0), + (36186, 240006, 0, 0, 0), + (36186, 250002, 0, 0, 0), + (36186, 280036, 0, 0, 0), + (36186, 320004, 0, 0, 0), + (36186, 330034, 0, 0, 0), + (36186, 340002, 0, 0, 0), + (36186, 1000142, 0, 0, 0), + (36186, 1100015, 0, 0, 0), + (36186, 1200015, 0, 0, 0), + (36187, 160073, 0, 0, 0), + (36187, 180036, 0, 0, 0), + (36187, 190017, 0, 0, 0), + (36187, 200014, 0, 0, 0), + (36187, 230001, 0, 0, 0), + (36187, 240001, 0, 0, 0), + (36187, 250002, 0, 0, 0), + (36187, 280017, 0, 0, 0), + (36187, 320004, 0, 0, 0), + (36187, 330034, 0, 0, 0), + (36187, 340002, 0, 0, 0), + (36187, 1000142, 0, 0, 0), + (36187, 1100015, 0, 0, 0), + (36187, 1200015, 0, 0, 0), + (36188, 160075, 0, 0, 0), + (36188, 180015, 0, 0, 0), + (36188, 190017, 0, 0, 0), + (36188, 200029, 0, 0, 0), + (36188, 230003, 0, 0, 0), + (36188, 240005, 0, 0, 0), + (36188, 250002, 0, 0, 0), + (36188, 280036, 0, 0, 0), + (36188, 320004, 0, 0, 0), + (36188, 330067, 0, 0, 0), + (36188, 340002, 0, 0, 0), + (36188, 1000113, 0, 0, 0), + (36188, 1100044, 0, 0, 0), + (36188, 1200015, 0, 0, 0), + (36189, 160075, 0, 0, 0), + (36189, 180015, 0, 0, 0), + (36189, 190017, 0, 0, 0), + (36189, 200029, 0, 0, 0), + (36189, 230003, 0, 0, 0), + (36189, 240005, 0, 0, 0), + (36189, 250002, 0, 0, 0), + (36189, 280036, 0, 0, 0), + (36189, 320004, 0, 0, 0), + (36189, 330019, 0, 0, 0), + (36189, 340002, 0, 0, 0), + (36189, 1000113, 0, 0, 0), + (36189, 1100044, 0, 0, 0), + (36189, 1200032, 0, 0, 0), + (36190, 160075, 0, 0, 0), + (36190, 180015, 0, 0, 0), + (36190, 190017, 0, 0, 0), + (36190, 200045, 0, 0, 0), + (36190, 230003, 0, 0, 0), + (36190, 240005, 0, 0, 0), + (36190, 250002, 0, 0, 0), + (36190, 280036, 0, 0, 0), + (36190, 320049, 0, 0, 0), + (36190, 330019, 0, 0, 0), + (36190, 340003, 0, 0, 0), + (36190, 1000113, 0, 0, 0), + (36190, 1100044, 0, 0, 0), + (36190, 1200015, 0, 0, 0), + (36191, 160075, 0, 0, 0), + (36191, 180015, 0, 0, 0), + (36191, 190017, 0, 0, 0), + (36191, 200045, 0, 0, 0), + (36191, 230003, 0, 0, 0), + (36191, 240007, 0, 0, 0), + (36191, 250002, 0, 0, 0), + (36191, 280036, 0, 0, 0), + (36191, 320050, 0, 0, 0), + (36191, 330019, 0, 0, 0), + (36191, 340003, 0, 0, 0), + (36191, 1000113, 0, 0, 0), + (36191, 1100044, 0, 0, 0), + (36191, 1200032, 0, 0, 0), + (36192, 160075, 0, 0, 0), + (36192, 180015, 0, 0, 0), + (36192, 190017, 0, 0, 0), + (36192, 200029, 0, 0, 0), + (36192, 230003, 0, 0, 0), + (36192, 240007, 0, 0, 0), + (36192, 250002, 0, 0, 0), + (36192, 280033, 0, 0, 0), + (36192, 320013, 0, 0, 0), + (36192, 330019, 0, 0, 0), + (36192, 340003, 0, 0, 0), + (36192, 1000038, 0, 0, 0), + (36192, 1100046, 0, 0, 0), + (36192, 1200032, 0, 0, 0), + (36193, 160075, 0, 0, 0), + (36193, 180015, 0, 0, 0), + (36193, 190017, 0, 0, 0), + (36193, 200029, 0, 0, 0), + (36193, 230003, 0, 0, 0), + (36193, 240007, 0, 0, 0), + (36193, 250002, 0, 0, 0), + (36193, 280033, 0, 0, 0), + (36193, 320013, 0, 0, 0), + (36193, 330067, 0, 0, 0), + (36193, 340003, 0, 0, 0), + (36193, 1000039, 0, 0, 0), + (36193, 1100046, 0, 0, 0), + (36193, 1200032, 0, 0, 0), + (36194, 160075, 0, 0, 0), + (36194, 180015, 0, 0, 0), + (36194, 190017, 0, 0, 0), + (36194, 200029, 0, 0, 0), + (36194, 230003, 0, 0, 0), + (36194, 240005, 0, 0, 0), + (36194, 250002, 0, 0, 0), + (36194, 280036, 0, 0, 0), + (36194, 320004, 0, 0, 0), + (36194, 330067, 0, 0, 0), + (36194, 340002, 0, 0, 0), + (36194, 1000038, 0, 0, 0), + (36194, 1100044, 0, 0, 0), + (36194, 1200015, 0, 0, 0), + (36195, 160075, 0, 0, 0), + (36195, 180015, 0, 0, 0), + (36195, 190017, 0, 0, 0), + (36195, 200029, 0, 0, 0), + (36195, 230003, 0, 0, 0), + (36195, 240005, 0, 0, 0), + (36195, 250002, 0, 0, 0), + (36195, 280036, 0, 0, 0), + (36195, 320050, 0, 0, 0), + (36195, 330019, 0, 0, 0), + (36195, 340002, 0, 0, 0), + (36195, 1000114, 0, 0, 0), + (36195, 1100044, 0, 0, 0), + (36195, 1200032, 0, 0, 0), + (36196, 160056, 0, 0, 0), + (36196, 180015, 0, 0, 0), + (36196, 190017, 0, 0, 0), + (36196, 200029, 0, 0, 0), + (36196, 230003, 0, 0, 0), + (36196, 240007, 0, 0, 0), + (36196, 250002, 0, 0, 0), + (36196, 280033, 0, 0, 0), + (36196, 320013, 0, 0, 0), + (36196, 330019, 0, 0, 0), + (36196, 340003, 0, 0, 0), + (36196, 1000038, 0, 0, 0), + (36196, 1100047, 0, 0, 0), + (36196, 1200007, 0, 0, 0), + (36197, 160056, 0, 0, 0), + (36197, 180015, 0, 0, 0), + (36197, 190017, 0, 0, 0), + (36197, 200029, 0, 0, 0), + (36197, 230003, 0, 0, 0), + (36197, 240007, 0, 0, 0), + (36197, 250002, 0, 0, 0), + (36197, 280033, 0, 0, 0), + (36197, 320013, 0, 0, 0), + (36197, 330019, 0, 0, 0), + (36197, 340003, 0, 0, 0), + (36197, 1000055, 0, 0, 0), + (36197, 1100047, 0, 0, 0), + (36197, 1200007, 0, 0, 0), + (36198, 160056, 0, 0, 0), + (36198, 180015, 0, 0, 0), + (36198, 190017, 0, 0, 0), + (36198, 200029, 0, 0, 0), + (36198, 230003, 0, 0, 0), + (36198, 240007, 0, 0, 0), + (36198, 250002, 0, 0, 0), + (36198, 280033, 0, 0, 0), + (36198, 320013, 0, 0, 0), + (36198, 330019, 0, 0, 0), + (36198, 340003, 0, 0, 0), + (36198, 1000038, 0, 0, 0), + (36198, 1100046, 0, 0, 0), + (36198, 1200032, 0, 0, 0), + (36199, 160056, 0, 0, 0), + (36199, 180015, 0, 0, 0), + (36199, 190017, 0, 0, 0), + (36199, 200029, 0, 0, 0), + (36199, 230003, 0, 0, 0), + (36199, 240007, 0, 0, 0), + (36199, 250002, 0, 0, 0), + (36199, 280033, 0, 0, 0), + (36199, 320013, 0, 0, 0), + (36199, 330019, 0, 0, 0), + (36199, 340003, 0, 0, 0), + (36199, 1000039, 0, 0, 0), + (36199, 1100046, 0, 0, 0), + (36199, 1200032, 0, 0, 0), + (36200, 160056, 0, 0, 0), + (36200, 180015, 0, 0, 0), + (36200, 190017, 0, 0, 0), + (36200, 200029, 0, 0, 0), + (36200, 230003, 0, 0, 0), + (36200, 240005, 0, 0, 0), + (36200, 250002, 0, 0, 0), + (36200, 280036, 0, 0, 0), + (36200, 320004, 0, 0, 0), + (36200, 330067, 0, 0, 0), + (36200, 340002, 0, 0, 0), + (36200, 1000144, 0, 0, 0), + (36200, 1100044, 0, 0, 0), + (36200, 1200015, 0, 0, 0), + (36201, 160055, 0, 0, 0), + (36201, 180015, 0, 0, 0), + (36201, 190017, 0, 0, 0), + (36201, 200029, 0, 0, 0), + (36201, 230003, 0, 0, 0), + (36201, 240005, 0, 0, 0), + (36201, 250002, 0, 0, 0), + (36201, 280036, 0, 0, 0), + (36201, 320004, 0, 0, 0), + (36201, 330067, 0, 0, 0), + (36201, 340002, 0, 0, 0), + (36201, 1000113, 0, 0, 0), + (36201, 1100044, 0, 0, 0), + (36201, 1200015, 0, 0, 0), + (36202, 160055, 0, 0, 0), + (36202, 180015, 0, 0, 0), + (36202, 190017, 0, 0, 0), + (36202, 200029, 0, 0, 0), + (36202, 230003, 0, 0, 0), + (36202, 240007, 0, 0, 0), + (36202, 250002, 0, 0, 0), + (36202, 280036, 0, 0, 0), + (36202, 320013, 0, 0, 0), + (36202, 330064, 0, 0, 0), + (36202, 340002, 0, 0, 0), + (36202, 1000144, 0, 0, 0), + (36202, 1100044, 0, 0, 0), + (36202, 1200032, 0, 0, 0), + (36203, 160049, 0, 0, 0), + (36203, 180022, 0, 0, 0), + (36203, 190068, 0, 0, 0), + (36203, 200022, 0, 0, 0), + (36203, 230001, 0, 0, 0), + (36203, 240001, 0, 0, 0), + (36203, 250003, 0, 0, 0), + (36203, 280022, 0, 0, 0), + (36203, 320026, 0, 0, 0), + (36203, 330058, 0, 0, 0), + (36203, 340002, 0, 0, 0), + (36203, 1000149, 0, 0, 0), + (36203, 1100019, 0, 0, 0), + (36203, 1200021, 0, 0, 0), + (36204, 160050, 0, 0, 0), + (36204, 180022, 0, 0, 0), + (36204, 190068, 0, 0, 0), + (36204, 200022, 0, 0, 0), + (36204, 230003, 0, 0, 0), + (36204, 240005, 0, 0, 0), + (36204, 250003, 0, 0, 0), + (36204, 280010, 0, 0, 0), + (36204, 320026, 0, 0, 0), + (36204, 330043, 0, 0, 0), + (36204, 340002, 0, 0, 0), + (36204, 1000008, 0, 0, 0), + (36204, 1100049, 0, 0, 0), + (36204, 1200021, 0, 0, 0), + (36205, 160050, 0, 0, 0), + (36205, 180022, 0, 0, 0), + (36205, 190068, 0, 0, 0), + (36205, 200022, 0, 0, 0), + (36205, 230003, 0, 0, 0), + (36205, 240005, 0, 0, 0), + (36205, 250003, 0, 0, 0), + (36205, 280010, 0, 0, 0), + (36205, 320026, 0, 0, 0), + (36205, 330043, 0, 0, 0), + (36205, 340002, 0, 0, 0), + (36205, 1000007, 0, 0, 0), + (36205, 1100049, 0, 0, 0), + (36205, 1200021, 0, 0, 0), + (36206, 160050, 0, 0, 0), + (36206, 180053, 0, 0, 0), + (36206, 190024, 0, 0, 0), + (36206, 200007, 0, 0, 0), + (36206, 230003, 0, 0, 0), + (36206, 240004, 0, 0, 0), + (36206, 250003, 0, 0, 0), + (36206, 280010, 0, 0, 0), + (36206, 320053, 0, 0, 0), + (36206, 330043, 0, 0, 0), + (36206, 340003, 0, 0, 0), + (36206, 1000007, 0, 0, 0), + (36206, 1100049, 0, 0, 0), + (36206, 1200036, 0, 0, 0), + (36208, 160005, 0, 0, 0), + (36208, 180014, 0, 0, 0), + (36208, 190016, 0, 0, 0), + (36208, 200024, 0, 0, 0), + (36208, 230001, 0, 0, 0), + (36208, 240001, 0, 0, 0), + (36208, 250002, 0, 0, 0), + (36208, 280016, 0, 0, 0), + (36208, 320020, 0, 0, 0), + (36208, 330056, 0, 0, 0), + (36208, 340002, 0, 0, 0), + (36208, 1000070, 0, 0, 0), + (36208, 1100022, 0, 0, 0), + (36208, 1200034, 0, 0, 0), + (36209, 160016, 0, 0, 0), + (36209, 180062, 0, 0, 0), + (36209, 190067, 0, 0, 0), + (36209, 200030, 0, 0, 0), + (36209, 230001, 0, 0, 0), + (36209, 240005, 0, 0, 0), + (36209, 250002, 0, 0, 0), + (36209, 280052, 0, 0, 0), + (36209, 320101, 0, 0, 0), + (36209, 330019, 0, 0, 0), + (36209, 340002, 0, 0, 0), + (36209, 1000126, 0, 0, 0), + (36209, 1100121, 0, 0, 0), + (36209, 1200050, 0, 0, 0), + (36210, 160072, 0, 0, 0), + (36210, 180002, 0, 0, 0), + (36210, 190015, 0, 0, 0), + (36210, 200046, 0, 0, 0), + (36210, 230003, 0, 0, 0), + (36210, 240006, 0, 0, 0), + (36210, 250002, 0, 0, 0), + (36210, 280006, 0, 0, 0), + (36210, 320002, 0, 0, 0), + (36210, 330004, 0, 0, 0), + (36210, 340002, 0, 0, 0), + (36210, 1000075, 0, 0, 0), + (36210, 1100026, 0, 0, 0), + (36210, 1200001, 0, 0, 0), + (36211, 160072, 0, 0, 0), + (36211, 180013, 0, 0, 0), + (36211, 190015, 0, 0, 0), + (36211, 200046, 0, 0, 0), + (36211, 230003, 0, 0, 0), + (36211, 240006, 0, 0, 0), + (36211, 250002, 0, 0, 0), + (36211, 280002, 0, 0, 0), + (36211, 320031, 0, 0, 0), + (36211, 330033, 0, 0, 0), + (36211, 340003, 0, 0, 0), + (36211, 1000019, 0, 0, 0), + (36211, 1100014, 0, 0, 0), + (36211, 1200001, 0, 0, 0), + (36212, 25006, 0, 0, 0), + (36212, 160040, 0, 0, 0), + (36212, 180027, 0, 0, 0), + (36212, 190025, 0, 0, 0), + (36212, 200023, 0, 0, 0), + (36212, 230003, 0, 0, 0), + (36212, 240006, 0, 0, 0), + (36212, 250002, 0, 0, 0), + (36212, 280028, 0, 0, 0), + (36212, 320027, 0, 0, 0), + (36212, 330043, 0, 0, 0), + (36212, 340002, 0, 0, 0), + (36212, 1000051, 0, 0, 0), + (36212, 1100034, 0, 0, 0), + (36212, 1200037, 0, 0, 0), + (36213, 25006, 0, 0, 0), + (36213, 160040, 0, 0, 0), + (36213, 180027, 0, 0, 0), + (36213, 190004, 0, 0, 0), + (36213, 200009, 0, 0, 0), + (36213, 230003, 0, 0, 0), + (36213, 240006, 0, 0, 0), + (36213, 250002, 0, 0, 0), + (36213, 280028, 0, 0, 0), + (36213, 320038, 0, 0, 0), + (36213, 330027, 0, 0, 0), + (36213, 340002, 0, 0, 0), + (36213, 1000131, 0, 0, 0), + (36213, 1100035, 0, 0, 0), + (36213, 1200026, 0, 0, 0), + (36214, 160035, 0, 0, 0), + (36214, 180017, 0, 0, 0), + (36214, 190019, 0, 0, 0), + (36214, 200028, 0, 0, 0), + (36214, 230003, 0, 0, 0), + (36214, 240005, 0, 0, 0), + (36214, 250001, 0, 0, 0), + (36214, 280001, 0, 0, 0), + (36214, 320001, 0, 0, 0), + (36214, 330036, 0, 0, 0), + (36214, 340002, 0, 0, 0), + (36214, 1000133, 0, 0, 0), + (36214, 1100010, 0, 0, 0), + (36214, 1200003, 0, 0, 0), + (36215, 160076, 0, 0, 0), + (36215, 180001, 0, 0, 0), + (36215, 190016, 0, 0, 0), + (36215, 200002, 0, 0, 0), + (36215, 230002, 0, 0, 0), + (36215, 240003, 0, 0, 0), + (36215, 250002, 0, 0, 0), + (36215, 280016, 0, 0, 0), + (36215, 320020, 0, 0, 0), + (36215, 330003, 0, 0, 0), + (36215, 340001, 0, 0, 0), + (36215, 1000148, 0, 0, 0), + (36215, 1100111, 0, 0, 0), + (36215, 1200034, 0, 0, 0), + (37001, 290003, 0, 0, 0), + (37001, 300001, 0, 0, 0); \ No newline at end of file diff --git a/migrations/0034-seedSkinType.sql b/migrations/0034-seedSkinType.sql new file mode 100644 index 000000000..0f8460322 --- /dev/null +++ b/migrations/0034-seedSkinType.sql @@ -0,0 +1,13 @@ +INSERT INTO + skin_type (skin_type_id, skin_type) +VALUES + (1, '''Tinted'''), + (2, '''Custom'''), + (3, '''Cop'''), + (4, 'Flames'), + (5, 'Scallops'), + (6, 'Decals'), + (7, 'Rust'), + (8, 'Traffic'), + (9, 'Bad-ass'), + (10, '''Starter'''); \ No newline at end of file diff --git a/migrations/0035-seedPTSkin.sql b/migrations/0035-seedPTSkin.sql new file mode 100644 index 000000000..f64cb5f19 --- /dev/null +++ b/migrations/0035-seedPTSkin.sql @@ -0,0 +1,77052 @@ +INSERT INTO + pt_skin ( + skin_id, + creator_id, + skin_type_id, + part_type_id, + e_skin, + g_skin, + f_skin, + s_skin, + i_skin, + j_skin, + sw_skin, + b_skin, + price, + part_filename, + h0, + s0, + v0, + c0, + x0, + y0, + h1, + s1, + v1, + c1, + x1, + y1, + h2, + s2, + v2, + c2, + x2, + y2, + h3, + s3, + v3, + c3, + x3, + y3, + h4, + s4, + v4, + c4, + x4, + y4, + h5, + s5, + v5, + c5, + x5, + y5, + h6, + s6, + v6, + c6, + x6, + y6, + h7, + s7, + v7, + c7, + x7, + y7, + default_flag, + creator_name, + comment_text + ) +VALUES + ( + 1, + 10, + 1, + 101, + 'Candy Apple Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 1, + 211, + 255, + 128, + 32, + 255, + 1, + 211, + 255, + 128, + 32, + 255, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 40, + 20, + 20, + 128, + 1, + 165, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'As per 32 Ford CSV' + ), + ( + 2, + 10, + 1, + 101, + 'Blue Pearl', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 146, + 254, + 96, + 128, + 1, + 210, + 146, + 254, + 96, + 128, + 1, + 210, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 40, + 20, + 20, + 128, + 1, + 165, + 146, + 254, + 96, + 128, + 1, + 210, + 146, + 254, + 96, + 128, + 1, + 210, + 146, + 254, + 96, + 128, + 1, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 3, + 10, + 1, + 101, + 'Powder Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 138, + 138, + 255, + 128, + 20, + 255, + 138, + 138, + 255, + 128, + 20, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 138, + 138, + 255, + 128, + 0, + 255, + 138, + 138, + 255, + 128, + 0, + 255, + 138, + 138, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 4, + 10, + 1, + 101, + 'Peach', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 20, + 129, + 255, + 128, + 44, + 255, + 20, + 129, + 255, + 128, + 44, + 255, + 29, + 69, + 255, + 128, + 13, + 211, + 29, + 69, + 255, + 128, + 13, + 211, + 40, + 20, + 20, + 128, + 1, + 165, + 20, + 129, + 255, + 128, + 15, + 255, + 20, + 129, + 255, + 128, + 15, + 255, + 20, + 129, + 255, + 128, + 15, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 5, + 10, + 1, + 101, + 'Light Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 61, + 109, + 255, + 128, + 7, + 250, + 61, + 109, + 255, + 128, + 7, + 250, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 27, + 78, + 112, + 128, + 1, + 203, + 61, + 109, + 255, + 128, + 11, + 219, + 61, + 109, + 255, + 128, + 11, + 219, + 61, + 109, + 255, + 128, + 11, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 6, + 10, + 1, + 101, + 'Bright Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 35, + 255, + 255, + 128, + 20, + 255, + 35, + 255, + 255, + 128, + 20, + 255, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 40, + 20, + 255, + 128, + 10, + 255, + 35, + 255, + 255, + 128, + 20, + 255, + 35, + 255, + 255, + 128, + 20, + 255, + 35, + 255, + 255, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 7, + 10, + 1, + 101, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 7, + 255, + 128, + 110, + 192, + 128, + 7, + 255, + 128, + 110, + 192, + 3, + 254, + 100, + 128, + 11, + 237, + 3, + 254, + 100, + 128, + 11, + 237, + 40, + 20, + 20, + 128, + 1, + 165, + 128, + 7, + 255, + 128, + 110, + 192, + 128, + 7, + 255, + 128, + 110, + 192, + 128, + 7, + 255, + 128, + 110, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 8, + 10, + 1, + 101, + 'Black Pearl', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 33, + 7, + 255, + 128, + 0, + 180, + 33, + 7, + 1, + 128, + 0, + 225, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 27, + 78, + 112, + 128, + 1, + 203, + 33, + 7, + 1, + 128, + 0, + 175, + 33, + 7, + 1, + 128, + 0, + 175, + 33, + 7, + 1, + 128, + 0, + 175, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 9, + 10, + 1, + 101, + 'Rose Pewter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 33, + 7, + 255, + 128, + 0, + 180, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 27, + 78, + 112, + 128, + 1, + 203, + 30, + 26, + 65, + 128, + 0, + 216, + 30, + 26, + 65, + 128, + 0, + 216, + 30, + 26, + 65, + 128, + 0, + 216, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 10, + 10, + 1, + 101, + 'Violet Pearl', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 232, + 250, + 80, + 128, + 0, + 244, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 20, + 128, + 1, + 165, + 232, + 250, + 80, + 128, + 0, + 194, + 232, + 250, + 80, + 128, + 0, + 194, + 232, + 250, + 80, + 128, + 0, + 194, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 11, + 10, + 1, + 101, + 'Copper Brown', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 16, + 164, + 58, + 128, + 0, + 232, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 40, + 20, + 20, + 128, + 1, + 165, + 16, + 164, + 58, + 128, + 0, + 203, + 16, + 164, + 58, + 128, + 0, + 203, + 16, + 164, + 58, + 128, + 0, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 12, + 10, + 1, + 101, + 'Dark Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 27, + 78, + 112, + 128, + 1, + 203, + 125, + 125, + 49, + 128, + 0, + 188, + 125, + 125, + 49, + 128, + 0, + 188, + 125, + 125, + 49, + 128, + 0, + 188, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 13, + 10, + 1, + 101, + 'Sand Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 29, + 69, + 255, + 128, + 13, + 246, + 19, + 24, + 35, + 128, + 1, + 220, + 19, + 24, + 35, + 128, + 1, + 220, + 40, + 20, + 20, + 128, + 1, + 165, + 30, + 70, + 169, + 128, + 0, + 245, + 30, + 70, + 169, + 128, + 0, + 245, + 30, + 70, + 169, + 128, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 14, + 10, + 1, + 101, + 'Dark Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 71, + 109, + 33, + 128, + 0, + 240, + 29, + 69, + 255, + 128, + 13, + 237, + 29, + 69, + 255, + 128, + 13, + 237, + 40, + 20, + 20, + 128, + 1, + 165, + 71, + 169, + 52, + 128, + 0, + 192, + 71, + 169, + 52, + 128, + 0, + 192, + 71, + 169, + 52, + 128, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 15, + 10, + 1, + 102, + 'Dark Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 27, + 99, + 116, + 128, + 15, + 206, + 27, + 99, + 116, + 128, + 15, + 206, + 35, + 15, + 40, + 128, + 0, + 177, + 6, + 222, + 99, + 128, + 0, + 195, + 6, + 108, + 99, + 128, + 0, + 211, + 6, + 222, + 99, + 128, + 0, + 195, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 16, + 10, + 1, + 102, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 35, + 15, + 2, + 128, + 0, + 176, + 35, + 15, + 2, + 128, + 0, + 199, + 35, + 15, + 2, + 128, + 0, + 176, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 17, + 10, + 1, + 102, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 15, + 172, + 35, + 15, + 40, + 128, + 0, + 177, + 20, + 255, + 255, + 107, + 32, + 255, + 20, + 129, + 255, + 128, + 11, + 255, + 20, + 255, + 255, + 107, + 32, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 18, + 10, + 1, + 102, + 'Polar Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 151, + 200, + 109, + 128, + 0, + 225, + 151, + 94, + 109, + 128, + 0, + 233, + 151, + 200, + 109, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 19, + 10, + 1, + 102, + 'Pale Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 15, + 172, + 35, + 15, + 40, + 128, + 0, + 177, + 64, + 83, + 146, + 128, + 5, + 240, + 64, + 31, + 146, + 128, + 5, + 241, + 64, + 83, + 146, + 128, + 5, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 20, + 10, + 1, + 102, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 7, + 254, + 198, + 154, + 1, + 228, + 1, + 108, + 198, + 128, + 0, + 232, + 7, + 254, + 198, + 154, + 1, + 228, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 21, + 10, + 1, + 102, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 27, + 99, + 116, + 128, + 15, + 206, + 27, + 99, + 116, + 128, + 15, + 206, + 27, + 99, + 116, + 128, + 15, + 228, + 92, + 133, + 54, + 128, + 0, + 194, + 53, + 82, + 54, + 128, + 0, + 203, + 92, + 133, + 54, + 128, + 0, + 194, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 22, + 10, + 1, + 102, + 'Sea Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 125, + 160, + 130, + 128, + 22, + 220, + 125, + 49, + 130, + 128, + 22, + 219, + 125, + 160, + 130, + 128, + 22, + 220, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 23, + 10, + 1, + 102, + 'Lemon Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 15, + 172, + 35, + 15, + 40, + 128, + 0, + 177, + 36, + 255, + 255, + 128, + 16, + 255, + 40, + 113, + 255, + 128, + 0, + 246, + 36, + 255, + 255, + 128, + 16, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 24, + 10, + 1, + 102, + 'Slate Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 134, + 148, + 43, + 128, + 0, + 193, + 134, + 56, + 43, + 128, + 0, + 211, + 134, + 148, + 43, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 25, + 10, + 1, + 102, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 24, + 172, + 126, + 6, + 120, + 128, + 15, + 172, + 35, + 15, + 40, + 128, + 0, + 177, + 128, + 5, + 255, + 128, + 31, + 255, + 128, + 5, + 255, + 128, + 18, + 241, + 128, + 5, + 255, + 128, + 31, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 26, + 10, + 1, + 102, + 'Saddle Brown', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '40fortin', + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 38, + 38, + 255, + 128, + 15, + 235, + 35, + 15, + 40, + 128, + 0, + 177, + 18, + 66, + 118, + 122, + 1, + 212, + 18, + 43, + 118, + 128, + 0, + 227, + 18, + 66, + 118, + 122, + 1, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 27, + 10, + 1, + 103, + 'Coral Flame Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 241, + 246, + 255, + 255, + 128, + 5, + 255, + 246, + 255, + 255, + 128, + 5, + 255, + 25, + 9, + 3, + 128, + 0, + 152, + 246, + 255, + 255, + 128, + 5, + 255, + 45, + 5, + 255, + 128, + 35, + 254, + 246, + 255, + 255, + 128, + 5, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 28, + 10, + 1, + 103, + 'Sheridan Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 26, + 67, + 255, + 128, + 14, + 253, + 26, + 67, + 255, + 128, + 37, + 253, + 26, + 67, + 255, + 117, + 37, + 245, + 45, + 5, + 255, + 128, + 0, + 244, + 172, + 255, + 32, + 128, + 0, + 227, + 172, + 255, + 32, + 128, + 0, + 227, + 172, + 255, + 32, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 29, + 10, + 1, + 103, + 'Sandpiper Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 214, + 39, + 22, + 104, + 128, + 0, + 235, + 39, + 22, + 104, + 128, + 0, + 220, + 25, + 9, + 3, + 128, + 0, + 152, + 30, + 47, + 171, + 128, + 20, + 255, + 30, + 47, + 171, + 128, + 20, + 255, + 30, + 47, + 171, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 30, + 10, + 1, + 103, + 'Carnival Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 26, + 67, + 255, + 128, + 14, + 253, + 26, + 67, + 255, + 128, + 37, + 253, + 26, + 67, + 255, + 117, + 37, + 245, + 25, + 9, + 3, + 128, + 0, + 152, + 250, + 255, + 56, + 128, + 0, + 231, + 250, + 255, + 56, + 128, + 0, + 231, + 250, + 255, + 56, + 128, + 0, + 231, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 31, + 10, + 1, + 103, + 'Sungate Ivory', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 241, + 1, + 254, + 255, + 128, + 0, + 246, + 1, + 254, + 255, + 128, + 0, + 240, + 25, + 9, + 3, + 128, + 0, + 152, + 32, + 40, + 255, + 128, + 62, + 255, + 32, + 40, + 255, + 128, + 62, + 255, + 32, + 40, + 255, + 128, + 62, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 32, + 10, + 1, + 103, + 'Woodsmoke Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 201, + 28, + 22, + 39, + 128, + 0, + 229, + 28, + 22, + 39, + 128, + 0, + 218, + 25, + 9, + 3, + 128, + 0, + 152, + 28, + 22, + 104, + 128, + 0, + 253, + 28, + 22, + 104, + 128, + 0, + 253, + 28, + 22, + 104, + 128, + 0, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 33, + 10, + 1, + 103, + 'Glacier Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 233, + 142, + 130, + 255, + 128, + 16, + 241, + 142, + 130, + 255, + 128, + 16, + 255, + 45, + 5, + 255, + 128, + 0, + 244, + 142, + 130, + 255, + 128, + 28, + 255, + 45, + 5, + 255, + 128, + 35, + 254, + 142, + 130, + 255, + 128, + 28, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 34, + 10, + 1, + 103, + 'Fernmist Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 26, + 67, + 255, + 128, + 5, + 239, + 26, + 67, + 255, + 128, + 14, + 220, + 26, + 67, + 255, + 128, + 14, + 210, + 25, + 9, + 3, + 128, + 0, + 152, + 111, + 82, + 133, + 128, + 0, + 252, + 111, + 82, + 133, + 128, + 0, + 252, + 111, + 82, + 133, + 128, + 0, + 252, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 35, + 10, + 1, + 103, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 0, + 241, + 1, + 254, + 255, + 128, + 0, + 246, + 1, + 254, + 255, + 128, + 0, + 240, + 45, + 5, + 255, + 128, + 0, + 244, + 128, + 0, + 3, + 128, + 0, + 205, + 128, + 0, + 3, + 128, + 0, + 205, + 128, + 0, + 3, + 128, + 0, + 205, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 36, + 10, + 1, + 103, + 'Canary Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 26, + 67, + 255, + 128, + 14, + 210, + 26, + 67, + 255, + 128, + 14, + 210, + 26, + 67, + 255, + 128, + 14, + 210, + 25, + 9, + 3, + 128, + 0, + 152, + 34, + 225, + 255, + 49, + 91, + 254, + 45, + 5, + 255, + 128, + 35, + 254, + 34, + 225, + 255, + 49, + 91, + 254, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 37, + 10, + 1, + 103, + 'Peach', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 67, + 26, + 253, + 47, + 28, + 255, + 67, + 75, + 253, + 47, + 28, + 255, + 67, + 67, + 253, + 25, + 9, + 3, + 128, + 0, + 152, + 13, + 190, + 219, + 94, + 74, + 255, + 45, + 5, + 255, + 128, + 35, + 254, + 13, + 190, + 219, + 94, + 74, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 38, + 10, + 1, + 103, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 18, + 255, + 128, + 9, + 224, + 248, + 122, + 70, + 141, + 0, + 222, + 248, + 122, + 70, + 141, + 0, + 222, + 25, + 9, + 3, + 128, + 0, + 152, + 248, + 122, + 70, + 141, + 0, + 222, + 248, + 122, + 70, + 141, + 0, + 222, + 248, + 122, + 70, + 141, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 39, + 10, + 1, + 103, + 'Cold River Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '53fortin', + 128, + 0, + 255, + 128, + 0, + 255, + 47, + 28, + 255, + 128, + 9, + 241, + 128, + 117, + 57, + 128, + 0, + 231, + 128, + 117, + 57, + 128, + 0, + 231, + 25, + 9, + 3, + 128, + 0, + 152, + 128, + 117, + 57, + 128, + 0, + 242, + 45, + 5, + 255, + 128, + 35, + 254, + 128, + 117, + 57, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 40, + 10, + 1, + 104, + 'White / Mint Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 65, + 79, + 255, + 128, + 0, + 255, + 65, + 79, + 255, + 128, + 0, + 255, + 40, + 15, + 255, + 128, + 24, + 254, + 65, + 79, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 177, + 28, + 203, + 232, + 128, + 33, + 255, + 128, + 3, + 255, + 128, + 30, + 255, + 65, + 79, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 41, + 10, + 1, + 104, + 'White / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 1, + 255, + 255, + 128, + 0, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 1, + 255, + 255, + 128, + 0, + 244, + 20, + 5, + 24, + 128, + 0, + 177, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 30, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 42, + 10, + 1, + 104, + 'White / Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 151, + 255, + 176, + 128, + 0, + 252, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 151, + 255, + 176, + 128, + 0, + 252, + 40, + 10, + 255, + 128, + 22, + 255, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 30, + 255, + 151, + 255, + 176, + 128, + 0, + 252, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 43, + 10, + 1, + 104, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57faitin', + 20, + 5, + 14, + 128, + 0, + 222, + 40, + 15, + 13, + 128, + 1, + 229, + 40, + 15, + 13, + 128, + 1, + 244, + 20, + 5, + 14, + 128, + 0, + 222, + 20, + 5, + 24, + 128, + 0, + 177, + 28, + 203, + 232, + 128, + 20, + 255, + 20, + 5, + 10, + 128, + 0, + 154, + 20, + 5, + 10, + 128, + 0, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 44, + 10, + 1, + 104, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57faitin', + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 10, + 255, + 128, + 22, + 255, + 122, + 16, + 255, + 128, + 13, + 255, + 33, + 255, + 255, + 128, + 36, + 255, + 33, + 255, + 255, + 128, + 36, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 45, + 10, + 1, + 104, + 'White / Powder Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 146, + 100, + 255, + 128, + 13, + 255, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 146, + 100, + 255, + 128, + 13, + 255, + 20, + 5, + 24, + 128, + 0, + 177, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 30, + 255, + 146, + 100, + 255, + 128, + 13, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 46, + 10, + 1, + 104, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57faitin', + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 28, + 94, + 79, + 128, + 15, + 235, + 20, + 5, + 24, + 128, + 0, + 177, + 248, + 248, + 65, + 128, + 0, + 239, + 254, + 248, + 65, + 128, + 0, + 231, + 248, + 248, + 65, + 128, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 47, + 10, + 1, + 104, + 'Peach / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 16, + 128, + 255, + 128, + 9, + 240, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 16, + 128, + 255, + 128, + 9, + 240, + 40, + 10, + 255, + 128, + 22, + 255, + 28, + 203, + 232, + 128, + 20, + 255, + 16, + 128, + 255, + 128, + 9, + 240, + 128, + 3, + 255, + 128, + 30, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 48, + 10, + 1, + 104, + 'Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 15, + 13, + 128, + 1, + 229, + 40, + 15, + 13, + 128, + 1, + 244, + 1, + 255, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 177, + 28, + 203, + 232, + 128, + 33, + 255, + 20, + 5, + 10, + 128, + 0, + 167, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 49, + 10, + 1, + 104, + 'Silver / Slate Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 137, + 14, + 64, + 128, + 0, + 233, + 137, + 14, + 64, + 128, + 0, + 233, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 177, + 1, + 255, + 64, + 128, + 0, + 248, + 137, + 14, + 64, + 128, + 0, + 233, + 137, + 14, + 64, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 50, + 10, + 1, + 104, + 'Teal / Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57faitin', + 120, + 192, + 50, + 128, + 0, + 245, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 120, + 192, + 50, + 128, + 0, + 245, + 40, + 10, + 255, + 128, + 22, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 120, + 192, + 50, + 128, + 0, + 202, + 128, + 3, + 255, + 128, + 2, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 51, + 10, + 1, + 105, + 'White / Mint Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 65, + 79, + 255, + 128, + 0, + 255, + 65, + 79, + 255, + 128, + 0, + 255, + 40, + 15, + 255, + 128, + 24, + 254, + 65, + 79, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 156, + 28, + 203, + 232, + 128, + 33, + 255, + 128, + 3, + 255, + 128, + 52, + 255, + 65, + 79, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 52, + 10, + 1, + 105, + 'White / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 1, + 255, + 255, + 128, + 0, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 1, + 255, + 255, + 128, + 0, + 244, + 20, + 5, + 24, + 128, + 0, + 156, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 52, + 255, + 1, + 255, + 255, + 128, + 11, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 53, + 10, + 1, + 105, + 'White / Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 151, + 255, + 176, + 128, + 0, + 252, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 151, + 255, + 176, + 128, + 0, + 252, + 40, + 10, + 255, + 128, + 22, + 255, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 52, + 255, + 151, + 255, + 176, + 128, + 11, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 54, + 10, + 1, + 105, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57rantin', + 20, + 5, + 14, + 128, + 0, + 222, + 40, + 15, + 13, + 128, + 1, + 229, + 40, + 15, + 13, + 128, + 1, + 244, + 20, + 5, + 14, + 128, + 0, + 222, + 20, + 5, + 24, + 128, + 0, + 156, + 28, + 203, + 232, + 128, + 20, + 255, + 20, + 5, + 10, + 96, + 0, + 207, + 20, + 5, + 10, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 55, + 10, + 1, + 105, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57rantin', + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 10, + 255, + 128, + 22, + 255, + 122, + 16, + 255, + 128, + 13, + 255, + 33, + 255, + 255, + 128, + 50, + 255, + 33, + 255, + 255, + 128, + 45, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 56, + 10, + 1, + 105, + 'White / Powder Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 146, + 100, + 255, + 128, + 13, + 255, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 24, + 254, + 146, + 100, + 255, + 128, + 13, + 255, + 20, + 5, + 24, + 128, + 0, + 156, + 28, + 203, + 232, + 128, + 20, + 255, + 128, + 3, + 255, + 128, + 52, + 255, + 146, + 128, + 255, + 128, + 33, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 57, + 10, + 1, + 105, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57rantin', + 28, + 94, + 79, + 128, + 15, + 235, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 28, + 94, + 79, + 128, + 15, + 235, + 20, + 5, + 24, + 128, + 0, + 156, + 248, + 248, + 65, + 128, + 0, + 239, + 254, + 248, + 65, + 128, + 0, + 231, + 248, + 248, + 65, + 128, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 58, + 10, + 1, + 105, + 'Peach / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 16, + 128, + 255, + 128, + 9, + 240, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 16, + 128, + 255, + 128, + 9, + 240, + 40, + 10, + 255, + 128, + 22, + 255, + 28, + 203, + 232, + 128, + 20, + 255, + 16, + 128, + 255, + 128, + 40, + 255, + 128, + 3, + 255, + 128, + 41, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 59, + 10, + 1, + 105, + 'Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 15, + 13, + 128, + 1, + 229, + 40, + 15, + 13, + 128, + 1, + 244, + 1, + 255, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 156, + 28, + 203, + 232, + 128, + 33, + 255, + 20, + 5, + 10, + 96, + 0, + 207, + 1, + 255, + 255, + 128, + 13, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 60, + 10, + 1, + 105, + 'Slate Gray / Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 137, + 14, + 64, + 128, + 0, + 233, + 137, + 14, + 64, + 128, + 0, + 233, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 20, + 5, + 24, + 128, + 0, + 156, + 1, + 255, + 64, + 128, + 0, + 248, + 137, + 14, + 64, + 128, + 0, + 216, + 137, + 14, + 64, + 128, + 7, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 61, + 10, + 1, + 105, + 'Teal / Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57rantin', + 120, + 192, + 50, + 128, + 0, + 245, + 40, + 15, + 255, + 128, + 26, + 244, + 40, + 15, + 255, + 128, + 26, + 244, + 120, + 192, + 50, + 128, + 0, + 245, + 40, + 10, + 255, + 128, + 22, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 128, + 192, + 50, + 128, + 0, + 228, + 128, + 3, + 255, + 128, + 3, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 62, + 10, + 1, + 106, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 1, + 255, + 188, + 128, + 0, + 214, + 41, + 10, + 255, + 128, + 0, + 227, + 1, + 255, + 188, + 128, + 0, + 214, + 1, + 255, + 188, + 128, + 0, + 229, + 30, + 10, + 26, + 128, + 0, + 192, + 128, + 13, + 173, + 128, + 0, + 244, + 128, + 13, + 173, + 128, + 0, + 244, + 128, + 13, + 173, + 128, + 0, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 63, + 10, + 1, + 106, + 'Mist Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 218, + 27, + 114, + 77, + 128, + 0, + 215, + 27, + 114, + 77, + 128, + 0, + 202, + 27, + 114, + 77, + 128, + 0, + 220, + 40, + 10, + 255, + 128, + 35, + 255, + 84, + 67, + 130, + 128, + 0, + 255, + 45, + 10, + 255, + 128, + 60, + 255, + 84, + 67, + 130, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 64, + 10, + 1, + 106, + 'Moss Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 218, + 41, + 10, + 255, + 128, + 0, + 218, + 124, + 163, + 77, + 128, + 0, + 206, + 124, + 163, + 77, + 128, + 0, + 223, + 30, + 10, + 26, + 128, + 0, + 192, + 124, + 163, + 77, + 128, + 0, + 223, + 124, + 163, + 77, + 128, + 0, + 223, + 124, + 163, + 77, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 65, + 10, + 1, + 106, + 'Pale Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 233, + 38, + 150, + 255, + 116, + 16, + 255, + 38, + 150, + 255, + 116, + 16, + 255, + 40, + 10, + 255, + 128, + 35, + 255, + 38, + 167, + 255, + 116, + 35, + 255, + 38, + 167, + 255, + 116, + 35, + 255, + 38, + 167, + 255, + 116, + 35, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 66, + 10, + 1, + 106, + 'Slate Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 233, + 142, + 219, + 94, + 198, + 0, + 180, + 142, + 219, + 94, + 198, + 0, + 180, + 30, + 10, + 26, + 128, + 0, + 192, + 142, + 219, + 94, + 198, + 0, + 180, + 45, + 10, + 255, + 128, + 60, + 255, + 142, + 219, + 94, + 198, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 67, + 10, + 1, + 106, + 'Blue Silver Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 233, + 139, + 70, + 255, + 128, + 6, + 233, + 139, + 70, + 255, + 128, + 6, + 255, + 40, + 10, + 255, + 128, + 35, + 255, + 139, + 70, + 255, + 128, + 6, + 255, + 45, + 10, + 255, + 128, + 60, + 255, + 139, + 70, + 255, + 128, + 6, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 68, + 10, + 1, + 106, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 227, + 1, + 255, + 188, + 128, + 0, + 214, + 1, + 255, + 188, + 128, + 0, + 229, + 30, + 10, + 26, + 128, + 0, + 192, + 1, + 255, + 188, + 128, + 0, + 248, + 45, + 10, + 255, + 128, + 60, + 255, + 1, + 255, + 188, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 69, + 10, + 1, + 106, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 227, + 1, + 255, + 188, + 128, + 0, + 214, + 1, + 255, + 188, + 128, + 0, + 229, + 30, + 10, + 26, + 128, + 0, + 192, + 30, + 5, + 1, + 159, + 0, + 156, + 45, + 10, + 255, + 128, + 60, + 255, + 30, + 5, + 1, + 159, + 0, + 156, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 70, + 10, + 1, + 106, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 227, + 1, + 255, + 188, + 128, + 0, + 214, + 1, + 255, + 188, + 128, + 0, + 229, + 30, + 10, + 26, + 128, + 0, + 192, + 128, + 0, + 255, + 107, + 50, + 255, + 128, + 0, + 255, + 107, + 50, + 255, + 128, + 0, + 255, + 107, + 50, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 71, + 10, + 1, + 106, + 'Peach', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 227, + 19, + 94, + 255, + 128, + 0, + 246, + 19, + 94, + 255, + 128, + 0, + 255, + 30, + 10, + 26, + 128, + 0, + 192, + 19, + 94, + 255, + 128, + 0, + 255, + 45, + 10, + 255, + 128, + 60, + 255, + 19, + 113, + 255, + 113, + 33, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 72, + 10, + 1, + 106, + 'Indigo Pearl', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 128, + 13, + 23, + 128, + 0, + 181, + 128, + 13, + 23, + 128, + 0, + 181, + 128, + 13, + 23, + 128, + 0, + 181, + 128, + 13, + 23, + 128, + 0, + 208, + 30, + 10, + 26, + 128, + 0, + 192, + 198, + 104, + 32, + 128, + 0, + 184, + 198, + 104, + 32, + 128, + 0, + 184, + 198, + 104, + 32, + 128, + 0, + 184, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 73, + 10, + 1, + 106, + 'Pink Rose', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57tbitin', + 41, + 10, + 255, + 128, + 0, + 235, + 41, + 10, + 255, + 128, + 0, + 227, + 252, + 82, + 194, + 128, + 2, + 255, + 252, + 82, + 194, + 128, + 2, + 255, + 40, + 10, + 255, + 128, + 35, + 255, + 252, + 88, + 194, + 113, + 28, + 255, + 45, + 10, + 255, + 128, + 60, + 255, + 252, + 88, + 194, + 113, + 28, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 74, + 10, + 1, + 107, + 'Chantilly Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 35, + 47, + 126, + 128, + 0, + 249, + 0, + 255, + 255, + 128, + 0, + 248, + 0, + 255, + 255, + 128, + 0, + 248, + 0, + 255, + 255, + 128, + 0, + 248, + 40, + 15, + 255, + 128, + 11, + 255, + 35, + 111, + 126, + 128, + 0, + 240, + 40, + 15, + 255, + 128, + 15, + 255, + 35, + 111, + 126, + 128, + 0, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 75, + 10, + 1, + 107, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 0, + 129, + 255, + 128, + 0, + 255, + 40, + 18, + 236, + 128, + 19, + 255, + 40, + 18, + 175, + 128, + 19, + 239, + 40, + 18, + 160, + 128, + 19, + 232, + 40, + 15, + 45, + 128, + 11, + 170, + 0, + 255, + 255, + 128, + 0, + 240, + 40, + 15, + 255, + 128, + 15, + 255, + 0, + 255, + 255, + 128, + 0, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 76, + 10, + 1, + 107, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 45, + 27, + 255, + 128, + 9, + 255, + 253, + 255, + 203, + 128, + 0, + 250, + 253, + 255, + 114, + 128, + 0, + 236, + 253, + 255, + 104, + 128, + 0, + 228, + 40, + 15, + 255, + 128, + 14, + 255, + 45, + 47, + 255, + 128, + 24, + 255, + 40, + 15, + 255, + 128, + 15, + 255, + 45, + 47, + 255, + 128, + 24, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 77, + 10, + 1, + 107, + 'Skylight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 142, + 48, + 255, + 128, + 9, + 255, + 40, + 18, + 236, + 128, + 39, + 255, + 40, + 18, + 175, + 128, + 19, + 250, + 40, + 18, + 160, + 128, + 19, + 246, + 40, + 15, + 45, + 128, + 11, + 170, + 142, + 99, + 255, + 128, + 0, + 255, + 40, + 15, + 255, + 128, + 15, + 255, + 142, + 99, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 78, + 10, + 1, + 107, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 20, + 7, + 94, + 128, + 0, + 237, + 253, + 255, + 203, + 128, + 0, + 250, + 253, + 255, + 114, + 128, + 0, + 236, + 253, + 255, + 104, + 128, + 0, + 228, + 40, + 15, + 45, + 128, + 11, + 170, + 20, + 7, + 14, + 128, + 0, + 177, + 40, + 15, + 255, + 128, + 15, + 255, + 20, + 7, + 14, + 128, + 0, + 177, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 79, + 10, + 1, + 107, + 'Silver Smoke Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 137, + 22, + 159, + 128, + 0, + 249, + 40, + 18, + 52, + 128, + 2, + 227, + 40, + 18, + 75, + 128, + 2, + 222, + 40, + 18, + 52, + 128, + 2, + 208, + 40, + 15, + 45, + 128, + 11, + 170, + 137, + 22, + 122, + 128, + 0, + 231, + 40, + 15, + 255, + 128, + 15, + 255, + 137, + 22, + 122, + 128, + 0, + 231, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 80, + 10, + 1, + 107, + 'Vintage Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 247, + 35, + 151, + 128, + 1, + 244, + 40, + 18, + 236, + 128, + 19, + 255, + 40, + 18, + 175, + 128, + 19, + 239, + 40, + 18, + 160, + 128, + 19, + 232, + 40, + 15, + 45, + 128, + 11, + 170, + 247, + 224, + 57, + 128, + 0, + 207, + 247, + 224, + 57, + 128, + 0, + 207, + 247, + 224, + 57, + 128, + 0, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 81, + 10, + 1, + 107, + 'Dynasty Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 126, + 24, + 116, + 128, + 0, + 237, + 40, + 18, + 236, + 128, + 19, + 255, + 126, + 57, + 97, + 128, + 0, + 222, + 126, + 57, + 97, + 128, + 0, + 222, + 40, + 15, + 45, + 128, + 11, + 170, + 126, + 57, + 71, + 128, + 0, + 203, + 40, + 15, + 255, + 128, + 15, + 255, + 126, + 57, + 71, + 128, + 0, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 82, + 10, + 1, + 107, + 'Phoenician Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 128, + 3, + 138, + 128, + 19, + 255, + 40, + 18, + 236, + 128, + 30, + 255, + 45, + 47, + 255, + 128, + 24, + 255, + 45, + 47, + 255, + 128, + 24, + 255, + 40, + 15, + 45, + 128, + 11, + 170, + 32, + 192, + 255, + 128, + 35, + 255, + 128, + 3, + 255, + 128, + 35, + 255, + 32, + 192, + 255, + 128, + 35, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 83, + 10, + 1, + 107, + 'Guardsman Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 172, + 43, + 58, + 128, + 0, + 237, + 40, + 18, + 236, + 128, + 39, + 255, + 40, + 15, + 45, + 128, + 11, + 206, + 40, + 15, + 45, + 128, + 11, + 194, + 40, + 15, + 45, + 128, + 11, + 170, + 154, + 165, + 58, + 128, + 0, + 201, + 40, + 15, + 255, + 128, + 15, + 255, + 154, + 165, + 58, + 128, + 0, + 201, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 84, + 10, + 1, + 107, + 'Pagoda Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 245, + 23, + 255, + 128, + 10, + 255, + 40, + 18, + 236, + 128, + 39, + 255, + 120, + 141, + 71, + 128, + 0, + 237, + 120, + 141, + 71, + 128, + 0, + 237, + 40, + 15, + 255, + 128, + 14, + 255, + 120, + 185, + 71, + 128, + 0, + 216, + 40, + 15, + 255, + 128, + 15, + 255, + 120, + 185, + 71, + 128, + 0, + 216, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 85, + 10, + 1, + 107, + 'Gunmetal Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63tbitin', + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 2, + 128, + 0, + 222, + 33, + 19, + 67, + 128, + 0, + 219, + 33, + 19, + 67, + 128, + 0, + 219, + 40, + 15, + 45, + 128, + 11, + 170, + 33, + 19, + 67, + 128, + 0, + 219, + 40, + 15, + 255, + 128, + 15, + 255, + 33, + 19, + 67, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 86, + 10, + 1, + 108, + 'Navajo Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 27, + 80, + 255, + 128, + 0, + 255, + 27, + 80, + 255, + 128, + 0, + 255, + 27, + 80, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 87, + 10, + 1, + 108, + 'Vintage Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 246, + 242, + 84, + 128, + 5, + 253, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 246, + 242, + 84, + 128, + 0, + 210, + 246, + 242, + 84, + 128, + 0, + 210, + 246, + 242, + 84, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 88, + 10, + 1, + 108, + 'Chantilly Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 225, + 40, + 20, + 6, + 128, + 0, + 176, + 35, + 66, + 86, + 128, + 3, + 225, + 128, + 0, + 1, + 128, + 0, + 168, + 35, + 66, + 86, + 128, + 3, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 89, + 10, + 1, + 108, + 'Pagoda Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 120, + 100, + 49, + 128, + 5, + 250, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 255, + 128, + 15, + 255, + 124, + 254, + 77, + 128, + 13, + 225, + 124, + 254, + 77, + 128, + 13, + 225, + 124, + 254, + 77, + 128, + 13, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 90, + 10, + 1, + 108, + 'Skylight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 132, + 126, + 255, + 128, + 35, + 225, + 131, + 11, + 255, + 128, + 15, + 255, + 131, + 11, + 255, + 128, + 15, + 255, + 131, + 11, + 255, + 128, + 15, + 255, + 40, + 20, + 255, + 128, + 15, + 255, + 132, + 126, + 255, + 128, + 35, + 235, + 132, + 126, + 255, + 128, + 35, + 235, + 132, + 126, + 255, + 128, + 35, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 91, + 10, + 1, + 108, + 'Dynasty Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 120, + 100, + 49, + 128, + 0, + 222, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 40, + 20, + 6, + 128, + 0, + 176, + 120, + 100, + 49, + 128, + 0, + 222, + 128, + 0, + 1, + 128, + 0, + 168, + 120, + 100, + 49, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 92, + 10, + 1, + 108, + 'Prairie Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 255, + 128, + 15, + 255, + 19, + 163, + 113, + 128, + 0, + 255, + 44, + 30, + 255, + 128, + 38, + 255, + 19, + 163, + 113, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 93, + 10, + 1, + 108, + 'Phoenician Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 32, + 215, + 255, + 128, + 45, + 249, + 32, + 215, + 255, + 128, + 45, + 249, + 32, + 215, + 255, + 128, + 45, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 94, + 10, + 1, + 108, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 40, + 20, + 255, + 128, + 0, + 180, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 128, + 0, + 1, + 128, + 0, + 181, + 128, + 0, + 1, + 128, + 0, + 181, + 128, + 0, + 1, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 95, + 10, + 1, + 108, + 'Guardsman Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 148, + 218, + 49, + 128, + 0, + 210, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 148, + 218, + 49, + 128, + 0, + 210, + 148, + 218, + 49, + 128, + 0, + 210, + 148, + 218, + 49, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 96, + 10, + 1, + 108, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 28, + 50, + 255, + 128, + 38, + 255, + 128, + 0, + 1, + 128, + 0, + 168, + 28, + 50, + 255, + 128, + 38, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 97, + 10, + 1, + 108, + 'Silver Smoke Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 121, + 36, + 85, + 128, + 3, + 254, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 121, + 36, + 85, + 128, + 0, + 222, + 121, + 36, + 85, + 128, + 0, + 222, + 121, + 36, + 85, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 98, + 10, + 1, + 108, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64statin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 2, + 255, + 255, + 128, + 0, + 250, + 2, + 255, + 255, + 128, + 0, + 250, + 2, + 255, + 255, + 128, + 0, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 99, + 10, + 1, + 109, + 'Dynasty Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 208, + 104, + 22, + 254, + 40, + 15, + 160, + 128, + 10, + 255, + 114, + 163, + 64, + 128, + 0, + 225, + 114, + 163, + 64, + 128, + 0, + 212, + 40, + 15, + 255, + 128, + 9, + 255, + 114, + 163, + 64, + 128, + 0, + 212, + 40, + 14, + 255, + 128, + 27, + 255, + 114, + 163, + 64, + 128, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 100, + 10, + 1, + 109, + 'Navajo Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 105, + 194, + 22, + 168, + 33, + 83, + 155, + 128, + 3, + 250, + 40, + 15, + 109, + 128, + 2, + 235, + 33, + 83, + 155, + 128, + 0, + 255, + 30, + 10, + 30, + 128, + 0, + 175, + 33, + 83, + 155, + 128, + 9, + 255, + 33, + 83, + 155, + 128, + 0, + 215, + 33, + 83, + 155, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 101, + 10, + 1, + 109, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 1, + 255, + 130, + 128, + 1, + 250, + 1, + 255, + 121, + 128, + 1, + 244, + 39, + 16, + 255, + 128, + 19, + 255, + 39, + 16, + 255, + 128, + 56, + 255, + 30, + 10, + 30, + 128, + 0, + 175, + 26, + 37, + 255, + 128, + 56, + 255, + 26, + 37, + 255, + 128, + 56, + 255, + 26, + 37, + 255, + 128, + 56, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 102, + 10, + 1, + 109, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 19, + 7, + 1, + 128, + 0, + 201, + 19, + 7, + 1, + 128, + 0, + 164, + 39, + 7, + 255, + 128, + 9, + 248, + 19, + 7, + 1, + 128, + 0, + 164, + 30, + 10, + 30, + 128, + 0, + 175, + 19, + 7, + 1, + 128, + 0, + 176, + 19, + 7, + 1, + 128, + 0, + 176, + 19, + 7, + 1, + 128, + 0, + 176, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 103, + 10, + 1, + 109, + 'Silver Smoke Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 30, + 10, + 30, + 128, + 0, + 241, + 30, + 10, + 30, + 128, + 0, + 248, + 30, + 10, + 30, + 128, + 0, + 241, + 124, + 31, + 116, + 128, + 0, + 241, + 30, + 10, + 30, + 128, + 0, + 175, + 124, + 31, + 116, + 128, + 0, + 250, + 124, + 31, + 116, + 128, + 0, + 236, + 124, + 31, + 116, + 128, + 0, + 236, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 104, + 10, + 1, + 109, + 'Phoenician Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 208, + 104, + 22, + 254, + 40, + 15, + 160, + 128, + 10, + 255, + 33, + 208, + 255, + 128, + 50, + 255, + 33, + 208, + 255, + 128, + 50, + 255, + 40, + 15, + 255, + 128, + 9, + 255, + 33, + 208, + 255, + 128, + 50, + 255, + 40, + 14, + 255, + 128, + 27, + 255, + 33, + 208, + 255, + 128, + 50, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 105, + 10, + 1, + 109, + 'Guardsman Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 109, + 128, + 2, + 188, + 151, + 193, + 58, + 128, + 0, + 211, + 40, + 15, + 109, + 128, + 2, + 235, + 151, + 193, + 58, + 128, + 0, + 211, + 30, + 10, + 30, + 128, + 0, + 175, + 151, + 193, + 58, + 128, + 0, + 211, + 40, + 14, + 255, + 128, + 27, + 255, + 151, + 193, + 58, + 128, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 106, + 10, + 1, + 109, + 'Pagoda Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 129, + 32, + 36, + 128, + 0, + 223, + 129, + 32, + 52, + 128, + 0, + 244, + 129, + 255, + 91, + 128, + 0, + 225, + 129, + 255, + 91, + 128, + 0, + 230, + 40, + 15, + 255, + 128, + 9, + 255, + 129, + 255, + 91, + 128, + 0, + 249, + 40, + 14, + 255, + 128, + 27, + 255, + 129, + 255, + 91, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 107, + 10, + 1, + 109, + 'Prairie Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 105, + 128, + 22, + 216, + 33, + 83, + 155, + 128, + 3, + 250, + 40, + 15, + 109, + 128, + 2, + 235, + 26, + 201, + 151, + 128, + 15, + 255, + 30, + 10, + 30, + 128, + 0, + 175, + 26, + 201, + 151, + 128, + 15, + 255, + 40, + 14, + 255, + 128, + 27, + 255, + 26, + 201, + 151, + 128, + 15, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 108, + 10, + 1, + 109, + 'Vintage Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 109, + 128, + 2, + 188, + 40, + 15, + 109, + 128, + 2, + 188, + 40, + 15, + 109, + 128, + 2, + 188, + 248, + 250, + 54, + 128, + 0, + 219, + 30, + 10, + 30, + 128, + 0, + 175, + 248, + 250, + 54, + 128, + 0, + 250, + 248, + 250, + 54, + 128, + 0, + 219, + 248, + 250, + 54, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 109, + 10, + 1, + 109, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 109, + 128, + 18, + 242, + 40, + 15, + 109, + 128, + 18, + 242, + 40, + 15, + 109, + 128, + 18, + 235, + 0, + 255, + 255, + 128, + 2, + 250, + 36, + 45, + 125, + 128, + 0, + 228, + 0, + 255, + 255, + 128, + 7, + 254, + 40, + 14, + 255, + 128, + 27, + 255, + 0, + 255, + 255, + 128, + 2, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 110, + 10, + 1, + 109, + 'Skylight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 255, + 128, + 41, + 249, + 40, + 15, + 255, + 128, + 41, + 231, + 40, + 15, + 255, + 128, + 41, + 214, + 134, + 167, + 197, + 128, + 16, + 255, + 40, + 15, + 255, + 128, + 9, + 255, + 134, + 167, + 197, + 128, + 16, + 255, + 40, + 14, + 255, + 128, + 27, + 255, + 134, + 167, + 197, + 128, + 16, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 111, + 10, + 1, + 109, + 'Chantilly Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64galtin', + 40, + 15, + 109, + 128, + 2, + 188, + 40, + 15, + 109, + 128, + 2, + 188, + 40, + 15, + 109, + 128, + 2, + 188, + 37, + 71, + 86, + 128, + 0, + 250, + 40, + 15, + 255, + 128, + 9, + 255, + 37, + 71, + 86, + 128, + 0, + 241, + 37, + 71, + 86, + 128, + 0, + 241, + 37, + 71, + 86, + 128, + 0, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 112, + 10, + 1, + 110, + 'Lime Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 40, + 50, + 146, + 128, + 0, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 40, + 131, + 146, + 128, + 0, + 233, + 128, + 0, + 2, + 128, + 0, + 173, + 48, + 122, + 146, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 113, + 10, + 1, + 110, + 'Winter Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 142, + 62, + 73, + 128, + 0, + 237, + 142, + 13, + 73, + 128, + 0, + 252, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 142, + 252, + 73, + 128, + 0, + 227, + 142, + 54, + 73, + 128, + 0, + 237, + 142, + 13, + 73, + 128, + 0, + 252, + 142, + 252, + 73, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 114, + 10, + 1, + 110, + 'Royal Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 250, + 65, + 52, + 128, + 0, + 235, + 32, + 177, + 128, + 128, + 0, + 236, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 250, + 237, + 52, + 128, + 0, + 206, + 26, + 237, + 52, + 128, + 0, + 222, + 32, + 177, + 128, + 128, + 0, + 236, + 250, + 237, + 52, + 128, + 0, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 115, + 10, + 1, + 110, + 'Acapulco Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 159, + 61, + 53, + 128, + 0, + 233, + 159, + 249, + 53, + 128, + 0, + 208, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 116, + 10, + 1, + 110, + 'New Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 37, + 43, + 152, + 128, + 22, + 220, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 117, + 10, + 1, + 110, + 'Silver Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 124, + 57, + 56, + 128, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 114, + 54, + 124, + 128, + 0, + 219, + 128, + 0, + 2, + 128, + 0, + 173, + 109, + 54, + 124, + 128, + 0, + 231, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 118, + 10, + 1, + 110, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 128, + 0, + 255, + 128, + 1, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 44, + 45, + 255, + 128, + 45, + 222, + 128, + 0, + 2, + 128, + 0, + 173, + 44, + 45, + 255, + 128, + 66, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 119, + 10, + 1, + 110, + 'Black Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 30, + 10, + 1, + 128, + 2, + 224, + 30, + 10, + 1, + 128, + 2, + 155, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 30, + 10, + 1, + 128, + 2, + 155, + 1, + 254, + 163, + 128, + 13, + 220, + 1, + 254, + 163, + 128, + 13, + 241, + 30, + 10, + 1, + 128, + 2, + 155, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 120, + 10, + 1, + 110, + 'Gulfstream Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 130, + 32, + 47, + 163, + 0, + 214, + 130, + 172, + 47, + 163, + 0, + 195, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 121, + 10, + 1, + 110, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 1, + 41, + 163, + 128, + 7, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 1, + 254, + 163, + 128, + 1, + 224, + 128, + 0, + 2, + 128, + 0, + 173, + 1, + 254, + 163, + 128, + 13, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 122, + 10, + 1, + 110, + 'Indian Fire Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 6, + 60, + 135, + 165, + 11, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 123, + 10, + 1, + 110, + 'Dresden Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 128, + 24, + 212, + 128, + 2, + 250, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 133, + 116, + 212, + 128, + 13, + 227, + 133, + 116, + 212, + 128, + 13, + 207, + 128, + 0, + 2, + 128, + 0, + 173, + 133, + 116, + 212, + 128, + 13, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 124, + 10, + 1, + 110, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 30, + 30, + 255, + 118, + 27, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 30, + 254, + 255, + 118, + 45, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 30, + 254, + 255, + 118, + 45, + 252, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 125, + 10, + 1, + 110, + 'Pastel Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 128, + 18, + 164, + 128, + 6, + 253, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 126, + 10, + 1, + 110, + 'Presidential Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 148, + 69, + 103, + 186, + 2, + 210, + 148, + 255, + 103, + 186, + 2, + 185, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 127, + 10, + 1, + 110, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 19, + 32, + 88, + 155, + 0, + 223, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 19, + 90, + 88, + 155, + 0, + 202, + 128, + 0, + 2, + 128, + 0, + 173, + 19, + 90, + 88, + 155, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 128, + 10, + 1, + 110, + 'Brittany Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69tortin', + 138, + 50, + 92, + 137, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 163, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 163, + 138, + 219, + 92, + 137, + 0, + 214, + 128, + 0, + 2, + 128, + 0, + 163, + 138, + 219, + 92, + 137, + 0, + 224, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 129, + 10, + 1, + 111, + 'Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 130, + 10, + 1, + 111, + 'Medium Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 131, + 10, + 1, + 111, + 'Candyapple Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 6, + 194, + 143, + 128, + 6, + 240, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 6, + 194, + 143, + 128, + 6, + 240, + 35, + 64, + 158, + 128, + 16, + 244, + 6, + 194, + 143, + 128, + 6, + 240, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 132, + 10, + 1, + 111, + 'Raven Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 20, + 10, + 1, + 128, + 0, + 177, + 1, + 253, + 163, + 128, + 24, + 242, + 254, + 207, + 78, + 128, + 0, + 244, + 254, + 207, + 78, + 128, + 0, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 20, + 10, + 1, + 128, + 0, + 177, + 1, + 253, + 163, + 128, + 24, + 242, + 20, + 10, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 133, + 10, + 1, + 111, + 'Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 1, + 99, + 138, + 128, + 0, + 248, + 20, + 1, + 6, + 128, + 1, + 177, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 1, + 254, + 138, + 128, + 0, + 218, + 20, + 1, + 6, + 128, + 1, + 177, + 1, + 254, + 138, + 128, + 0, + 228, + 0, + 'Factory', + 'Not listed as factory color. Left over from old CSV file.' + ), + ( + 134, + 10, + 1, + 111, + 'Grabber Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb3tin', + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 135, + 10, + 1, + 111, + 'Grabber Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb3tin', + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 152, + 189, + 199, + 128, + 16, + 250, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 136, + 10, + 1, + 111, + 'Grabber Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb3tin', + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 137, + 10, + 1, + 111, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 138, + 10, + 1, + 111, + 'Medium Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 139, + 10, + 1, + 111, + 'Calypso Coral', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 11, + 232, + 242, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 140, + 10, + 1, + 111, + 'Bright Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 154, + 176, + 105, + 121, + 16, + 224, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 141, + 10, + 1, + 111, + 'Dark Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 31, + 92, + 73, + 128, + 0, + 236, + 31, + 92, + 73, + 128, + 0, + 236, + 20, + 10, + 1, + 128, + 0, + 178, + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 85, + 43, + 51, + 128, + 0, + 192, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 142, + 10, + 1, + 111, + 'Bright Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb3tin', + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 38, + 64, + 253, + 128, + 48, + 244, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 143, + 10, + 1, + 111, + 'Bright Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 144, + 10, + 1, + 111, + 'Pastel Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb3tin', + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 147, + 64, + 255, + 128, + 32, + 240, + 0, + 'Factory', + 'As per 70 Boss 302 CSV.' + ), + ( + 145, + 10, + 1, + 111, + 'Light Ivy Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 60, + 232, + 128, + 24, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 146, + 10, + 1, + 112, + 'Indigo', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 197, + 224, + 71, + 128, + 0, + 186, + 197, + 224, + 71, + 128, + 0, + 207, + 128, + 0, + 7, + 128, + 0, + 175, + 197, + 224, + 71, + 128, + 0, + 207, + 40, + 15, + 9, + 128, + 0, + 207, + 197, + 224, + 71, + 128, + 0, + 186, + 197, + 224, + 71, + 128, + 0, + 186, + 197, + 224, + 71, + 128, + 0, + 186, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 147, + 10, + 1, + 112, + 'Pale Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 128, + 16, + 255, + 128, + 0, + 249, + 35, + 83, + 255, + 128, + 23, + 255, + 40, + 15, + 255, + 128, + 0, + 255, + 35, + 83, + 255, + 128, + 23, + 255, + 35, + 15, + 255, + 128, + 58, + 255, + 128, + 0, + 255, + 128, + 0, + 211, + 128, + 16, + 255, + 128, + 0, + 231, + 35, + 83, + 255, + 128, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 148, + 10, + 1, + 112, + 'Light Green Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 77, + 20, + 124, + 128, + 0, + 252, + 77, + 37, + 124, + 128, + 0, + 242, + 40, + 15, + 255, + 128, + 0, + 255, + 77, + 37, + 124, + 128, + 0, + 242, + 35, + 15, + 255, + 128, + 58, + 255, + 128, + 0, + 255, + 128, + 0, + 178, + 128, + 16, + 255, + 128, + 0, + 231, + 77, + 37, + 124, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 149, + 10, + 1, + 112, + 'Burgundy Flame', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 252, + 79, + 41, + 128, + 0, + 231, + 252, + 255, + 41, + 128, + 0, + 208, + 40, + 15, + 255, + 128, + 0, + 255, + 252, + 255, + 41, + 128, + 0, + 208, + 40, + 15, + 9, + 128, + 0, + 207, + 252, + 97, + 41, + 128, + 0, + 181, + 128, + 16, + 255, + 128, + 0, + 231, + 252, + 255, + 41, + 128, + 0, + 208, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 150, + 10, + 1, + 112, + 'Fire Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 5, + 255, + 255, + 128, + 0, + 237, + 5, + 7, + 7, + 128, + 0, + 193, + 5, + 7, + 7, + 128, + 0, + 193, + 5, + 7, + 7, + 128, + 0, + 193, + 40, + 15, + 9, + 128, + 0, + 207, + 5, + 255, + 255, + 128, + 0, + 237, + 5, + 255, + 255, + 128, + 0, + 237, + 5, + 255, + 255, + 128, + 0, + 237, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 151, + 10, + 1, + 112, + 'Black Pearl', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 165, + 8, + 255, + 128, + 0, + 180, + 165, + 8, + 255, + 128, + 0, + 180, + 33, + 23, + 255, + 128, + 0, + 240, + 165, + 8, + 255, + 128, + 0, + 180, + 40, + 15, + 9, + 128, + 0, + 207, + 20, + 8, + 1, + 58, + 0, + 155, + 20, + 8, + 1, + 58, + 0, + 155, + 20, + 8, + 1, + 58, + 0, + 155, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 152, + 10, + 1, + 112, + 'Gray Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 128, + 11, + 133, + 128, + 20, + 252, + 128, + 16, + 133, + 128, + 0, + 242, + 128, + 0, + 255, + 128, + 0, + 194, + 128, + 16, + 133, + 128, + 0, + 242, + 40, + 15, + 9, + 128, + 0, + 207, + 128, + 0, + 255, + 128, + 0, + 194, + 128, + 11, + 255, + 128, + 0, + 253, + 128, + 16, + 133, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 153, + 10, + 1, + 112, + 'Steel Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 27, + 36, + 66, + 128, + 0, + 241, + 27, + 36, + 66, + 128, + 0, + 225, + 33, + 11, + 255, + 128, + 0, + 228, + 27, + 36, + 66, + 128, + 0, + 225, + 40, + 15, + 9, + 128, + 0, + 207, + 128, + 0, + 255, + 128, + 0, + 184, + 128, + 16, + 255, + 128, + 0, + 231, + 27, + 36, + 66, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 154, + 10, + 1, + 112, + 'Blue Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 129, + 65, + 61, + 128, + 0, + 220, + 129, + 65, + 61, + 128, + 0, + 220, + 33, + 11, + 255, + 128, + 0, + 228, + 129, + 65, + 61, + 128, + 0, + 220, + 40, + 15, + 9, + 128, + 0, + 207, + 128, + 0, + 255, + 128, + 0, + 184, + 128, + 16, + 255, + 128, + 0, + 231, + 129, + 65, + 61, + 128, + 0, + 220, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 155, + 10, + 1, + 112, + 'Sunburst Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 20, + 255, + 254, + 128, + 40, + 240, + 20, + 255, + 254, + 128, + 40, + 240, + 33, + 23, + 255, + 128, + 0, + 240, + 20, + 255, + 254, + 128, + 40, + 240, + 40, + 15, + 9, + 128, + 0, + 207, + 20, + 255, + 254, + 128, + 40, + 240, + 20, + 255, + 254, + 128, + 40, + 240, + 20, + 255, + 254, + 128, + 40, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 156, + 10, + 1, + 112, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 128, + 0, + 255, + 128, + 35, + 255, + 2, + 255, + 58, + 128, + 0, + 214, + 2, + 255, + 58, + 128, + 0, + 214, + 2, + 255, + 58, + 128, + 0, + 214, + 40, + 15, + 9, + 128, + 0, + 207, + 128, + 6, + 255, + 128, + 37, + 255, + 128, + 6, + 255, + 128, + 37, + 255, + 128, + 6, + 255, + 128, + 37, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 157, + 10, + 1, + 112, + 'Sky Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '49mertin', + 40, + 15, + 255, + 128, + 0, + 240, + 143, + 121, + 255, + 128, + 6, + 255, + 40, + 15, + 255, + 128, + 0, + 255, + 143, + 121, + 255, + 128, + 6, + 255, + 35, + 15, + 255, + 128, + 58, + 255, + 128, + 0, + 255, + 128, + 0, + 188, + 128, + 0, + 255, + 128, + 0, + 233, + 143, + 121, + 255, + 128, + 6, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 158, + 10, + 1, + 113, + 'Harbor Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 156, + 241, + 94, + 122, + 0, + 246, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 156, + 241, + 94, + 122, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 159, + 10, + 1, + 113, + 'Inca Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 203, + 20, + 10, + 11, + 128, + 0, + 233, + 20, + 10, + 22, + 128, + 0, + 184, + 40, + 10, + 172, + 100, + 31, + 250, + 0, + 255, + 255, + 128, + 0, + 255, + 40, + 10, + 172, + 100, + 31, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 160, + 10, + 1, + 113, + 'Tropical Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 120, + 95, + 255, + 108, + 37, + 255, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 120, + 95, + 255, + 108, + 37, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 161, + 10, + 1, + 113, + 'Onyx Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 233, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 162, + 10, + 1, + 113, + 'Onyx Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 255, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 163, + 10, + 1, + 113, + 'Imperial Ivory', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 33, + 47, + 255, + 97, + 71, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 47, + 255, + 97, + 71, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 164, + 10, + 1, + 113, + 'Coronado Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 33, + 228, + 255, + 47, + 82, + 255, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 228, + 255, + 47, + 88, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 165, + 10, + 1, + 113, + 'Laurel Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 60, + 92, + 114, + 128, + 0, + 242, + 20, + 10, + 22, + 128, + 0, + 184, + 60, + 92, + 114, + 128, + 0, + 242, + 128, + 0, + 255, + 128, + 0, + 255, + 60, + 92, + 114, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 166, + 10, + 1, + 113, + 'Sierra Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 233, + 20, + 10, + 22, + 128, + 0, + 184, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 190, + 155, + 122, + 22, + 254, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 167, + 10, + 1, + 113, + 'Matador Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57chetin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 4, + 255, + 255, + 128, + 21, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 4, + 255, + 255, + 128, + 21, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 168, + 10, + 1, + 114, + 'Venetian Red / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 169, + 10, + 1, + 114, + 'Venetian Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57vettin', + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 232, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 170, + 10, + 1, + 114, + 'Polo White / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 128, + 5, + 255, + 128, + 41, + 255, + 128, + 5, + 255, + 128, + 41, + 255, + 1, + 255, + 255, + 128, + 0, + 235, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 170, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 128, + 5, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 171, + 10, + 1, + 114, + 'Polo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57vettin', + 128, + 5, + 255, + 128, + 41, + 255, + 128, + 5, + 255, + 128, + 41, + 255, + 1, + 255, + 255, + 128, + 0, + 235, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 170, + 128, + 5, + 255, + 128, + 41, + 248, + 128, + 5, + 255, + 128, + 48, + 255, + 128, + 5, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 172, + 10, + 1, + 114, + 'Onyx Black / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 25, + 255, + 128, + 0, + 250, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 1, + 128, + 0, + 154, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 173, + 10, + 1, + 114, + 'Onyx Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57vettin', + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 25, + 255, + 128, + 0, + 171, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 177, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 1, + 128, + 0, + 154, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 174, + 10, + 1, + 114, + 'Onyx Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 170, + 1, + 255, + 255, + 128, + 0, + 235, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 170, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 1, + 128, + 0, + 154, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 175, + 10, + 1, + 114, + 'Inca Silver / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 40, + 15, + 255, + 128, + 12, + 255, + 40, + 15, + 255, + 128, + 12, + 255, + 1, + 255, + 255, + 128, + 0, + 235, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 20, + 255, + 128, + 0, + 170, + 1, + 255, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 40, + 15, + 109, + 128, + 12, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 176, + 10, + 1, + 114, + 'Inca Silver / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 40, + 15, + 255, + 128, + 12, + 255, + 40, + 15, + 255, + 128, + 12, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 0, + 170, + 128, + 0, + 255, + 128, + 0, + 255, + 40, + 15, + 255, + 128, + 12, + 255, + 40, + 15, + 109, + 128, + 12, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 177, + 10, + 1, + 114, + 'Aztec Copper / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 10, + 146, + 161, + 128, + 18, + 221, + 10, + 146, + 161, + 128, + 18, + 221, + 40, + 25, + 255, + 128, + 0, + 250, + 10, + 146, + 161, + 128, + 18, + 221, + 40, + 25, + 255, + 128, + 0, + 250, + 128, + 0, + 255, + 128, + 0, + 255, + 10, + 146, + 161, + 128, + 18, + 221, + 10, + 146, + 161, + 128, + 18, + 221, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 178, + 10, + 1, + 114, + 'Arctic Blue / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 40, + 25, + 255, + 128, + 0, + 250, + 140, + 61, + 143, + 128, + 14, + 219, + 40, + 25, + 255, + 128, + 0, + 250, + 128, + 0, + 255, + 128, + 0, + 255, + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 179, + 10, + 1, + 114, + 'Arctic Blue / Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 1, + 214, + 207, + 128, + 9, + 225, + 140, + 61, + 143, + 128, + 14, + 219, + 40, + 20, + 255, + 128, + 0, + 170, + 128, + 0, + 255, + 128, + 0, + 222, + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 180, + 10, + 1, + 114, + 'Arctic Blue / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57vettin', + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 1, + 214, + 207, + 128, + 9, + 225, + 140, + 61, + 143, + 128, + 14, + 219, + 40, + 20, + 255, + 128, + 0, + 170, + 1, + 255, + 255, + 128, + 0, + 255, + 140, + 61, + 143, + 128, + 14, + 219, + 140, + 61, + 143, + 128, + 14, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 181, + 10, + 1, + 114, + 'Cascade Green / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57vettin', + 127, + 251, + 211, + 128, + 0, + 255, + 127, + 251, + 211, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 127, + 251, + 211, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 128, + 0, + 255, + 128, + 0, + 255, + 127, + 251, + 211, + 128, + 0, + 255, + 127, + 251, + 211, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 182, + 10, + 1, + 114, + 'Cascade Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57vettin', + 127, + 251, + 211, + 128, + 0, + 255, + 127, + 251, + 211, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 127, + 251, + 211, + 128, + 0, + 255, + 40, + 25, + 255, + 128, + 0, + 250, + 127, + 251, + 211, + 128, + 0, + 231, + 127, + 251, + 211, + 128, + 0, + 255, + 127, + 251, + 211, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 183, + 10, + 1, + 115, + 'Matador Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 4, + 255, + 255, + 128, + 21, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 4, + 255, + 255, + 128, + 21, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 184, + 10, + 1, + 115, + 'Inca Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 233, + 20, + 10, + 22, + 128, + 0, + 184, + 40, + 10, + 172, + 100, + 31, + 250, + 0, + 255, + 255, + 128, + 0, + 255, + 40, + 10, + 172, + 100, + 31, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 185, + 10, + 1, + 115, + 'Tropical Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 120, + 95, + 255, + 108, + 37, + 255, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 120, + 95, + 255, + 108, + 37, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 186, + 10, + 1, + 115, + 'Onyx Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 233, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 187, + 10, + 1, + 115, + 'Onyx Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 255, + 255, + 128, + 0, + 255, + 20, + 10, + 11, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 188, + 10, + 1, + 115, + 'Imperial Ivory', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 4, + 255, + 255, + 128, + 21, + 222, + 4, + 255, + 255, + 128, + 21, + 241, + 20, + 10, + 22, + 128, + 0, + 184, + 33, + 47, + 255, + 97, + 71, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 47, + 255, + 97, + 71, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 189, + 10, + 1, + 115, + 'Coronado Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 33, + 228, + 255, + 47, + 82, + 255, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 228, + 255, + 47, + 88, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 190, + 10, + 1, + 115, + 'Laurel Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 60, + 92, + 114, + 128, + 0, + 242, + 20, + 10, + 22, + 128, + 0, + 184, + 60, + 92, + 114, + 128, + 0, + 242, + 128, + 0, + 255, + 128, + 0, + 255, + 60, + 92, + 114, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 191, + 10, + 1, + 115, + 'Sierra Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 216, + 20, + 10, + 11, + 128, + 0, + 233, + 20, + 10, + 22, + 128, + 0, + 184, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 33, + 190, + 155, + 122, + 22, + 254, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 192, + 10, + 1, + 115, + 'Harbor Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '57nomtin', + 24, + 28, + 255, + 128, + 36, + 252, + 24, + 28, + 255, + 128, + 36, + 252, + 40, + 26, + 255, + 128, + 28, + 249, + 156, + 241, + 94, + 122, + 0, + 246, + 40, + 15, + 255, + 128, + 28, + 255, + 33, + 35, + 255, + 97, + 78, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 156, + 241, + 94, + 122, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 193, + 10, + 1, + 116, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 1, + 254, + 255, + 128, + 0, + 246, + 40, + 15, + 255, + 128, + 0, + 255, + 1, + 254, + 255, + 128, + 0, + 229, + 40, + 20, + 255, + 128, + 0, + 229, + 1, + 71, + 255, + 128, + 0, + 249, + 40, + 24, + 255, + 128, + 32, + 255, + 1, + 254, + 255, + 128, + 0, + 218, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 194, + 10, + 1, + 116, + 'Gray-Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 125, + 47, + 90, + 128, + 0, + 202, + 128, + 0, + 255, + 128, + 0, + 186, + 125, + 47, + 90, + 128, + 0, + 202, + 40, + 20, + 10, + 128, + 0, + 224, + 125, + 18, + 90, + 128, + 0, + 248, + 40, + 24, + 255, + 128, + 32, + 255, + 125, + 47, + 90, + 128, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 195, + 10, + 1, + 116, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 5, + 255, + 128, + 0, + 199, + 128, + 0, + 255, + 128, + 0, + 186, + 20, + 5, + 255, + 128, + 0, + 199, + 40, + 20, + 10, + 128, + 0, + 224, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 159, + 20, + 5, + 1, + 128, + 0, + 159, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 196, + 10, + 1, + 116, + 'Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 127, + 254, + 53, + 128, + 1, + 195, + 128, + 0, + 255, + 128, + 0, + 186, + 127, + 254, + 53, + 128, + 1, + 195, + 40, + 20, + 10, + 128, + 0, + 224, + 127, + 49, + 53, + 128, + 1, + 229, + 127, + 254, + 53, + 128, + 1, + 195, + 127, + 254, + 53, + 128, + 1, + 195, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 197, + 10, + 1, + 116, + 'Light Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 40, + 15, + 255, + 128, + 0, + 255, + 108, + 69, + 143, + 128, + 0, + 219, + 40, + 15, + 255, + 128, + 0, + 255, + 108, + 69, + 143, + 128, + 0, + 219, + 40, + 20, + 10, + 128, + 0, + 224, + 108, + 24, + 143, + 128, + 0, + 233, + 40, + 24, + 255, + 128, + 32, + 255, + 108, + 69, + 143, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 198, + 10, + 1, + 116, + 'Off-White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 31, + 43, + 255, + 128, + 32, + 255, + 1, + 249, + 154, + 128, + 0, + 224, + 31, + 43, + 255, + 128, + 32, + 255, + 40, + 20, + 10, + 128, + 0, + 224, + 31, + 43, + 255, + 128, + 23, + 255, + 31, + 43, + 255, + 128, + 32, + 255, + 31, + 43, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 199, + 10, + 1, + 116, + 'Dark Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 170, + 255, + 47, + 128, + 0, + 242, + 128, + 0, + 255, + 128, + 0, + 186, + 170, + 255, + 47, + 128, + 0, + 218, + 40, + 20, + 10, + 128, + 0, + 224, + 147, + 75, + 47, + 128, + 0, + 211, + 147, + 255, + 47, + 128, + 0, + 180, + 147, + 255, + 47, + 128, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 200, + 10, + 1, + 116, + 'Dark Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 30, + 79, + 30, + 128, + 0, + 241, + 30, + 79, + 30, + 128, + 0, + 241, + 30, + 79, + 30, + 128, + 0, + 253, + 30, + 79, + 30, + 128, + 0, + 212, + 40, + 20, + 10, + 128, + 0, + 224, + 94, + 54, + 47, + 128, + 0, + 220, + 107, + 185, + 47, + 114, + 0, + 175, + 107, + 185, + 47, + 114, + 0, + 175, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 201, + 10, + 1, + 116, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 8, + 255, + 128, + 33, + 233, + 1, + 249, + 154, + 128, + 0, + 224, + 128, + 8, + 255, + 128, + 33, + 255, + 40, + 20, + 255, + 128, + 0, + 229, + 128, + 8, + 255, + 128, + 7, + 255, + 128, + 8, + 255, + 128, + 33, + 255, + 128, + 8, + 255, + 128, + 33, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 202, + 10, + 1, + 116, + 'Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 40, + 15, + 255, + 128, + 0, + 255, + 30, + 83, + 255, + 128, + 7, + 239, + 40, + 15, + 255, + 128, + 0, + 255, + 30, + 83, + 255, + 128, + 7, + 239, + 40, + 20, + 10, + 128, + 0, + 224, + 30, + 49, + 255, + 128, + 7, + 250, + 40, + 24, + 255, + 128, + 32, + 255, + 30, + 83, + 255, + 128, + 7, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 203, + 10, + 1, + 116, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 19, + 254, + 255, + 128, + 11, + 255, + 40, + 15, + 255, + 128, + 0, + 255, + 19, + 254, + 255, + 128, + 11, + 255, + 40, + 20, + 255, + 128, + 0, + 229, + 23, + 65, + 255, + 128, + 20, + 255, + 40, + 24, + 255, + 128, + 32, + 255, + 19, + 254, + 255, + 128, + 11, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 204, + 10, + 1, + 116, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 28, + 232, + 255, + 128, + 30, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 28, + 232, + 255, + 128, + 30, + 255, + 40, + 20, + 255, + 128, + 73, + 255, + 37, + 44, + 255, + 128, + 6, + 240, + 40, + 24, + 255, + 128, + 32, + 255, + 28, + 232, + 255, + 128, + 30, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 205, + 10, + 1, + 116, + 'Light Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 139, + 139, + 255, + 128, + 6, + 237, + 128, + 0, + 255, + 128, + 0, + 255, + 139, + 139, + 255, + 128, + 6, + 237, + 40, + 20, + 255, + 128, + 73, + 255, + 139, + 45, + 255, + 128, + 6, + 250, + 40, + 24, + 255, + 128, + 32, + 255, + 139, + 139, + 255, + 128, + 6, + 237, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 206, + 10, + 1, + 116, + 'Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64imptin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 5, + 255, + 128, + 0, + 229, + 1, + 2, + 154, + 128, + 0, + 173, + 20, + 5, + 255, + 128, + 0, + 214, + 40, + 20, + 255, + 128, + 0, + 229, + 20, + 5, + 255, + 128, + 0, + 240, + 20, + 5, + 255, + 128, + 0, + 206, + 20, + 5, + 255, + 128, + 0, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 207, + 10, + 1, + 117, + 'Sebring Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 240, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 128, + 5, + 109, + 128, + 0, + 255, + 128, + 5, + 109, + 128, + 0, + 255, + 128, + 5, + 109, + 128, + 0, + 255, + 128, + 5, + 109, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 208, + 10, + 1, + 117, + 'Silver Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 158, + 133, + 75, + 128, + 30, + 229, + 158, + 133, + 75, + 128, + 30, + 218, + 158, + 133, + 75, + 128, + 30, + 229, + 158, + 133, + 75, + 128, + 30, + 229, + 146, + 73, + 186, + 128, + 56, + 195, + 146, + 73, + 186, + 128, + 56, + 195, + 146, + 73, + 186, + 128, + 56, + 195, + 146, + 73, + 186, + 128, + 56, + 195, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 209, + 10, + 1, + 117, + 'Daytona Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 240, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 146, + 255, + 114, + 128, + 1, + 232, + 146, + 255, + 114, + 128, + 1, + 232, + 146, + 255, + 114, + 128, + 1, + 232, + 146, + 255, + 114, + 128, + 1, + 232, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 210, + 10, + 1, + 117, + 'Riverside Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 240, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 5, + 255, + 219, + 128, + 0, + 255, + 5, + 255, + 219, + 128, + 0, + 255, + 5, + 255, + 219, + 128, + 0, + 248, + 5, + 255, + 219, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 211, + 10, + 1, + 117, + 'Ermine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 240, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 128, + 5, + 255, + 128, + 69, + 236, + 128, + 5, + 255, + 128, + 69, + 236, + 128, + 5, + 255, + 128, + 69, + 236, + 128, + 5, + 255, + 128, + 69, + 236, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 212, + 10, + 1, + 117, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 240, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 35, + 10, + 1, + 130, + 0, + 161, + 35, + 10, + 1, + 130, + 0, + 161, + 35, + 10, + 1, + 130, + 0, + 161, + 35, + 10, + 1, + 130, + 0, + 161, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 213, + 10, + 1, + 117, + 'Saddle Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 23, + 164, + 107, + 128, + 30, + 235, + 23, + 164, + 107, + 128, + 30, + 228, + 23, + 164, + 107, + 128, + 30, + 225, + 23, + 164, + 107, + 128, + 30, + 235, + 20, + 97, + 202, + 128, + 18, + 241, + 20, + 97, + 202, + 128, + 18, + 241, + 20, + 97, + 202, + 128, + 18, + 241, + 20, + 97, + 202, + 128, + 18, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 214, + 10, + 1, + 117, + 'Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 30, + 15, + 255, + 128, + 1, + 255, + 28, + 146, + 207, + 128, + 13, + 249, + 28, + 146, + 207, + 128, + 13, + 249, + 28, + 146, + 207, + 128, + 13, + 249, + 28, + 146, + 207, + 128, + 13, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 215, + 10, + 1, + 117, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '63vettin', + 23, + 164, + 107, + 128, + 30, + 235, + 23, + 164, + 107, + 128, + 30, + 235, + 23, + 164, + 107, + 128, + 30, + 235, + 23, + 164, + 107, + 128, + 30, + 235, + 250, + 255, + 70, + 150, + 0, + 210, + 250, + 255, + 70, + 150, + 0, + 210, + 250, + 255, + 70, + 150, + 0, + 210, + 250, + 255, + 70, + 150, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 216, + 10, + 1, + 118, + 'Rio Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 40, + 15, + 255, + 128, + 15, + 255, + 40, + 15, + 35, + 128, + 1, + 216, + 1, + 255, + 255, + 128, + 0, + 240, + 1, + 255, + 255, + 128, + 0, + 240, + 40, + 16, + 255, + 128, + 13, + 255, + 1, + 255, + 255, + 128, + 0, + 240, + 128, + 1, + 255, + 128, + 35, + 255, + 1, + 255, + 255, + 128, + 0, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 217, + 10, + 1, + 118, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 107, + 163, + 52, + 128, + 0, + 224, + 121, + 245, + 52, + 128, + 0, + 184, + 121, + 245, + 52, + 128, + 0, + 210, + 121, + 245, + 52, + 128, + 0, + 191, + 40, + 16, + 30, + 128, + 13, + 175, + 121, + 245, + 52, + 128, + 0, + 192, + 39, + 52, + 255, + 128, + 18, + 255, + 109, + 245, + 79, + 128, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 218, + 10, + 1, + 118, + 'Colonial Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 33, + 45, + 255, + 128, + 0, + 185, + 40, + 15, + 35, + 128, + 1, + 216, + 39, + 52, + 255, + 128, + 18, + 255, + 39, + 52, + 255, + 128, + 18, + 255, + 40, + 16, + 30, + 128, + 13, + 175, + 39, + 52, + 255, + 128, + 18, + 255, + 128, + 1, + 255, + 128, + 35, + 255, + 39, + 52, + 255, + 128, + 18, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 219, + 10, + 1, + 118, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 40, + 15, + 255, + 128, + 15, + 255, + 40, + 15, + 35, + 128, + 1, + 216, + 137, + 186, + 105, + 128, + 2, + 207, + 137, + 186, + 105, + 128, + 2, + 207, + 128, + 0, + 255, + 128, + 0, + 255, + 137, + 186, + 105, + 128, + 2, + 207, + 1, + 0, + 255, + 128, + 20, + 255, + 137, + 186, + 105, + 128, + 2, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 220, + 10, + 1, + 118, + 'Silver Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 40, + 15, + 255, + 128, + 15, + 255, + 40, + 15, + 35, + 128, + 1, + 216, + 141, + 65, + 138, + 113, + 0, + 236, + 141, + 65, + 138, + 113, + 0, + 236, + 40, + 16, + 30, + 128, + 13, + 175, + 141, + 65, + 138, + 113, + 0, + 236, + 1, + 0, + 255, + 128, + 20, + 255, + 141, + 65, + 138, + 113, + 0, + 236, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 221, + 10, + 1, + 118, + 'Onyx Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 1, + 255, + 108, + 128, + 0, + 185, + 1, + 255, + 108, + 128, + 0, + 205, + 20, + 7, + 7, + 128, + 0, + 185, + 20, + 7, + 7, + 128, + 0, + 174, + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 7, + 128, + 0, + 176, + 1, + 0, + 255, + 128, + 20, + 255, + 20, + 7, + 7, + 128, + 0, + 160, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 222, + 10, + 1, + 118, + 'Tropic Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 40, + 15, + 255, + 128, + 15, + 255, + 150, + 50, + 35, + 128, + 1, + 216, + 131, + 187, + 181, + 128, + 2, + 251, + 131, + 187, + 181, + 128, + 2, + 251, + 128, + 0, + 255, + 128, + 0, + 255, + 131, + 187, + 181, + 128, + 2, + 251, + 131, + 187, + 181, + 128, + 2, + 251, + 131, + 187, + 181, + 128, + 2, + 251, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 223, + 10, + 1, + 118, + 'Snowcrest White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 1, + 255, + 108, + 128, + 0, + 224, + 1, + 255, + 108, + 128, + 0, + 219, + 128, + 1, + 255, + 128, + 13, + 255, + 128, + 1, + 255, + 128, + 35, + 255, + 40, + 16, + 30, + 128, + 13, + 175, + 128, + 1, + 255, + 128, + 35, + 255, + 128, + 1, + 255, + 128, + 35, + 255, + 128, + 1, + 255, + 128, + 35, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 224, + 10, + 1, + 118, + 'Anniversary Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 33, + 45, + 255, + 128, + 0, + 223, + 40, + 15, + 35, + 128, + 1, + 216, + 30, + 99, + 158, + 128, + 0, + 236, + 30, + 99, + 158, + 128, + 0, + 236, + 40, + 16, + 30, + 128, + 13, + 175, + 30, + 99, + 158, + 128, + 0, + 236, + 128, + 1, + 255, + 128, + 35, + 255, + 30, + 99, + 158, + 128, + 0, + 236, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 225, + 10, + 1, + 118, + 'Cay Coral', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '58imptin', + 33, + 45, + 255, + 128, + 0, + 223, + 128, + 0, + 133, + 128, + 7, + 255, + 13, + 138, + 195, + 103, + 20, + 255, + 13, + 138, + 195, + 103, + 20, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 13, + 138, + 195, + 103, + 20, + 255, + 128, + 1, + 255, + 128, + 35, + 255, + 13, + 138, + 195, + 103, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 226, + 10, + 1, + 119, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 83, + 255, + 128, + 15, + 255, + 0, + 255, + 255, + 111, + 16, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 227, + 10, + 1, + 119, + 'Dark Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 148, + 255, + 54, + 152, + 0, + 211, + 170, + 33, + 54, + 128, + 0, + 231, + 148, + 255, + 54, + 152, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 228, + 10, + 1, + 119, + 'Off White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 245, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 43, + 26, + 255, + 100, + 48, + 255, + 43, + 54, + 255, + 128, + 10, + 255, + 43, + 26, + 255, + 100, + 48, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 229, + 10, + 1, + 119, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 99, + 0, + 206, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 99, + 0, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 230, + 10, + 1, + 119, + 'Vermillion', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 252, + 22, + 104, + 94, + 128, + 0, + 252, + 22, + 104, + 94, + 128, + 0, + 252, + 30, + 15, + 2, + 128, + 0, + 214, + 3, + 250, + 64, + 128, + 0, + 227, + 248, + 45, + 64, + 128, + 0, + 228, + 3, + 250, + 64, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 231, + 10, + 1, + 119, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 15, + 2, + 128, + 0, + 173, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 130, + 5, + 124, + 122, + 1, + 232, + 130, + 5, + 126, + 128, + 0, + 253, + 130, + 5, + 124, + 122, + 1, + 232, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 232, + 10, + 1, + 119, + 'Light Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 142, + 181, + 171, + 128, + 0, + 233, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 30, + 15, + 255, + 128, + 60, + 255, + 142, + 181, + 171, + 128, + 0, + 254, + 121, + 40, + 171, + 128, + 0, + 249, + 142, + 181, + 171, + 128, + 0, + 254, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 233, + 10, + 1, + 119, + 'Light Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 15, + 2, + 128, + 0, + 173, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 35, + 233, + 255, + 128, + 43, + 255, + 35, + 82, + 255, + 128, + 7, + 255, + 35, + 233, + 255, + 128, + 43, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 234, + 10, + 1, + 119, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 15, + 2, + 128, + 0, + 173, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 128, + 5, + 255, + 83, + 58, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 83, + 58, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 235, + 10, + 1, + 119, + 'Light Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 30, + 15, + 2, + 128, + 0, + 173, + 28, + 104, + 94, + 128, + 20, + 252, + 28, + 104, + 94, + 128, + 20, + 252, + 28, + 104, + 94, + 128, + 20, + 252, + 30, + 15, + 2, + 128, + 0, + 214, + 95, + 147, + 91, + 128, + 0, + 240, + 66, + 39, + 91, + 128, + 0, + 241, + 95, + 147, + 91, + 128, + 0, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 236, + 10, + 1, + 119, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 22, + 255, + 239, + 108, + 30, + 255, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 22, + 255, + 239, + 86, + 50, + 255, + 22, + 135, + 239, + 108, + 30, + 255, + 22, + 255, + 239, + 86, + 50, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 237, + 10, + 1, + 119, + 'Dark Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67chetin', + 128, + 254, + 71, + 143, + 0, + 202, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 128, + 254, + 71, + 143, + 0, + 212, + 128, + 56, + 137, + 143, + 0, + 224, + 128, + 254, + 71, + 143, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 238, + 10, + 1, + 120, + 'Bolero Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 255, + 255, + 128, + 0, + 250, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 52, + 255, + 128, + 0, + 249, + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 239, + 10, + 1, + 120, + 'Deepwater Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 148, + 255, + 54, + 152, + 0, + 202, + 148, + 255, + 54, + 152, + 0, + 202, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 170, + 33, + 54, + 128, + 0, + 231, + 148, + 255, + 54, + 152, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 240, + 10, + 1, + 120, + 'Capri Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 20, + 5, + 1, + 128, + 0, + 168, + 43, + 48, + 255, + 128, + 11, + 255, + 43, + 48, + 255, + 128, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 241, + 10, + 1, + 120, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 20, + 5, + 1, + 128, + 0, + 168, + 20, + 5, + 1, + 128, + 0, + 168, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 0, + 255, + 255, + 128, + 0, + 250, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 242, + 10, + 1, + 120, + 'Tahoe Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 142, + 58, + 138, + 0, + 201, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 2, + 128, + 0, + 214, + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 71, + 58, + 138, + 0, + 241, + 131, + 142, + 58, + 138, + 0, + 201, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 243, + 10, + 1, + 120, + 'Silverglaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 41, + 24, + 163, + 128, + 1, + 248, + 41, + 24, + 163, + 128, + 1, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 244, + 10, + 1, + 120, + 'Marina Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 142, + 181, + 171, + 128, + 0, + 233, + 142, + 181, + 171, + 128, + 0, + 233, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 255, + 128, + 60, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 121, + 40, + 171, + 128, + 0, + 249, + 142, + 181, + 171, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 245, + 10, + 1, + 120, + 'Butternut Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 32, + 175, + 255, + 128, + 20, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 35, + 82, + 255, + 128, + 7, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 246, + 10, + 1, + 120, + 'Provincial White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 16, + 255, + 255, + 128, + 22, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 247, + 10, + 1, + 120, + 'Verde Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 95, + 147, + 37, + 128, + 0, + 180, + 95, + 147, + 37, + 128, + 0, + 180, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 95, + 147, + 37, + 128, + 0, + 180, + 66, + 39, + 91, + 128, + 0, + 241, + 95, + 147, + 37, + 128, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 248, + 10, + 1, + 120, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 69, + 60, + 167, + 108, + 1, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 69, + 60, + 167, + 108, + 11, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 249, + 10, + 1, + 120, + 'Emerald Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 134, + 90, + 139, + 144, + 0, + 212, + 134, + 90, + 139, + 144, + 0, + 212, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 128, + 56, + 137, + 143, + 0, + 224, + 134, + 90, + 139, + 144, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 250, + 10, + 1, + 120, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 3, + 250, + 64, + 128, + 0, + 205, + 3, + 250, + 64, + 128, + 0, + 205, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 248, + 45, + 64, + 128, + 0, + 228, + 3, + 250, + 64, + 128, + 0, + 205, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 251, + 10, + 1, + 120, + 'Antique Pewter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 32, + 24, + 83, + 137, + 1, + 236, + 32, + 24, + 83, + 137, + 1, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 252, + 10, + 1, + 120, + 'Plum Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 231, + 253, + 44, + 128, + 0, + 181, + 231, + 253, + 44, + 128, + 0, + 181, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 231, + 49, + 44, + 128, + 0, + 253, + 231, + 253, + 44, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 253, + 10, + 1, + 120, + 'Sierra Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 26, + 28, + 147, + 138, + 0, + 249, + 26, + 58, + 147, + 138, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 254, + 10, + 1, + 120, + 'Nantucket Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 184, + 43, + 169, + 128, + 0, + 255, + 184, + 43, + 169, + 128, + 0, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 184, + 43, + 169, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 253, + 184, + 43, + 169, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 255, + 10, + 1, + 120, + 'Granada Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67camtin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 36, + 33, + 168, + 138, + 0, + 249, + 36, + 104, + 168, + 138, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 256, + 10, + 1, + 121, + 'Monza Red / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 255, + 255, + 139, + 0, + 211, + 1, + 1, + 1, + 128, + 1, + 147, + 1, + 255, + 255, + 139, + 0, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 257, + 10, + 1, + 121, + 'Classic White / Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 128, + 5, + 255, + 128, + 27, + 255, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 41, + 101, + 128, + 0, + 254, + 15, + 255, + 101, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 18, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 258, + 10, + 1, + 121, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 128, + 52, + 58, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 128, + 255, + 58, + 152, + 0, + 203, + 128, + 255, + 58, + 152, + 0, + 203, + 128, + 255, + 58, + 152, + 0, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 259, + 10, + 1, + 121, + 'Champagne Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 33, + 60, + 126, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 27, + 138, + 126, + 128, + 0, + 223, + 27, + 138, + 126, + 128, + 0, + 223, + 27, + 138, + 126, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 260, + 10, + 1, + 121, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 122, + 10, + 160, + 128, + 11, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 122, + 10, + 160, + 128, + 0, + 227, + 1, + 1, + 1, + 128, + 1, + 147, + 122, + 10, + 160, + 142, + 0, + 220, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 261, + 10, + 1, + 121, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 104, + 18, + 147, + 128, + 0, + 253, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 104, + 101, + 147, + 128, + 0, + 219, + 104, + 101, + 147, + 128, + 0, + 219, + 104, + 101, + 147, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 262, + 10, + 1, + 121, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 64, + 14, + 53, + 128, + 0, + 232, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 97, + 130, + 53, + 128, + 0, + 190, + 97, + 130, + 53, + 128, + 0, + 190, + 97, + 130, + 53, + 128, + 0, + 190, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 263, + 10, + 1, + 121, + 'Cranberry Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 6, + 56, + 91, + 128, + 0, + 245, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 248, + 254, + 91, + 176, + 0, + 180, + 1, + 1, + 1, + 128, + 1, + 147, + 248, + 254, + 91, + 176, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 264, + 10, + 1, + 121, + 'Astro Blue / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 142, + 57, + 255, + 128, + 18, + 255, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 250, + 20, + 7, + 18, + 128, + 0, + 165, + 142, + 101, + 255, + 128, + 2, + 254, + 142, + 3, + 255, + 128, + 36, + 255, + 142, + 175, + 88, + 184, + 2, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 265, + 10, + 1, + 121, + 'Laguna Gray / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 242, + 18, + 83, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 242, + 28, + 83, + 171, + 0, + 180, + 1, + 1, + 1, + 128, + 1, + 147, + 242, + 28, + 83, + 171, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 266, + 10, + 1, + 121, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 170, + 73, + 255, + 128, + 22, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 155, + 254, + 70, + 146, + 11, + 184, + 155, + 254, + 70, + 146, + 11, + 184, + 155, + 254, + 70, + 146, + 11, + 184, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 267, + 10, + 1, + 121, + 'Shadow Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 128, + 6, + 94, + 128, + 6, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 26, + 41, + 53, + 128, + 0, + 199, + 26, + 41, + 53, + 128, + 0, + 199, + 26, + 41, + 53, + 128, + 0, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 268, + 10, + 1, + 121, + 'Gold Beige / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 31, + 13, + 112, + 128, + 0, + 249, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 31, + 148, + 112, + 109, + 11, + 228, + 1, + 1, + 1, + 128, + 1, + 147, + 31, + 148, + 112, + 109, + 11, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 269, + 10, + 1, + 121, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 245, + 255, + 66, + 128, + 0, + 198, + 245, + 255, + 66, + 128, + 0, + 198, + 245, + 255, + 66, + 128, + 0, + 198, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 270, + 10, + 1, + 121, + 'Autumn Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70chetin', + 23, + 39, + 62, + 128, + 0, + 240, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 23, + 126, + 62, + 128, + 0, + 194, + 23, + 126, + 62, + 128, + 0, + 194, + 23, + 126, + 62, + 128, + 0, + 194, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 271, + 10, + 1, + 121, + 'Plum / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 215, + 255, + 53, + 128, + 0, + 188, + 1, + 1, + 1, + 128, + 1, + 147, + 215, + 255, + 53, + 128, + 0, + 198, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 272, + 10, + 1, + 121, + 'Yellow / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 18, + 86, + 255, + 117, + 20, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 31, + 255, + 255, + 117, + 26, + 229, + 1, + 1, + 1, + 128, + 1, + 147, + 31, + 255, + 255, + 117, + 26, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 273, + 10, + 1, + 121, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70chetin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 236, + 255, + 128, + 0, + 219, + 1, + 1, + 1, + 128, + 1, + 147, + 1, + 255, + 255, + 139, + 0, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 274, + 10, + 1, + 122, + 'Laguna Gray / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 242, + 18, + 83, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 242, + 28, + 83, + 128, + 0, + 214, + 1, + 1, + 1, + 128, + 1, + 168, + 242, + 28, + 83, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 275, + 10, + 1, + 122, + 'Classic White / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 128, + 5, + 255, + 128, + 27, + 255, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 20, + 7, + 18, + 128, + 0, + 248, + 1, + 41, + 101, + 128, + 0, + 254, + 1, + 255, + 101, + 128, + 0, + 236, + 128, + 5, + 255, + 128, + 39, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 276, + 10, + 1, + 122, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 128, + 52, + 58, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 128, + 57, + 58, + 128, + 0, + 248, + 128, + 0, + 255, + 128, + 35, + 255, + 128, + 255, + 58, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 277, + 10, + 1, + 122, + 'Champagne Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 33, + 60, + 126, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 278, + 10, + 1, + 122, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 122, + 10, + 160, + 128, + 11, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 122, + 10, + 160, + 128, + 0, + 227, + 1, + 1, + 1, + 128, + 1, + 168, + 122, + 10, + 160, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 279, + 10, + 1, + 122, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 104, + 18, + 147, + 128, + 0, + 253, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 104, + 101, + 147, + 128, + 0, + 239, + 104, + 101, + 147, + 128, + 0, + 239, + 104, + 101, + 147, + 128, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 280, + 10, + 1, + 122, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 64, + 14, + 53, + 128, + 0, + 232, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 97, + 130, + 53, + 128, + 0, + 210, + 97, + 130, + 53, + 128, + 0, + 210, + 97, + 130, + 53, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 281, + 10, + 1, + 122, + 'Cranberry Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 6, + 56, + 91, + 128, + 0, + 245, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 6, + 254, + 91, + 128, + 0, + 233, + 6, + 254, + 91, + 128, + 0, + 233, + 6, + 254, + 91, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 282, + 10, + 1, + 122, + 'Astro Blue / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 142, + 57, + 255, + 128, + 18, + 255, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 250, + 20, + 7, + 18, + 128, + 0, + 248, + 142, + 101, + 255, + 128, + 2, + 254, + 142, + 3, + 255, + 128, + 36, + 255, + 142, + 175, + 88, + 128, + 2, + 228, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 283, + 10, + 1, + 122, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 1, + 141, + 255, + 128, + 0, + 214, + 1, + 1, + 1, + 128, + 1, + 168, + 1, + 255, + 255, + 139, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 284, + 10, + 1, + 122, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 170, + 73, + 255, + 128, + 22, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 155, + 254, + 70, + 146, + 11, + 206, + 155, + 254, + 70, + 146, + 11, + 206, + 155, + 254, + 70, + 146, + 11, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 285, + 10, + 1, + 122, + 'Shadow Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 128, + 6, + 94, + 128, + 6, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 26, + 41, + 53, + 128, + 0, + 224, + 26, + 41, + 53, + 128, + 0, + 224, + 26, + 41, + 53, + 128, + 0, + 224, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 286, + 10, + 1, + 122, + 'Gold Beige / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70camtin', + 31, + 13, + 112, + 128, + 0, + 249, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 31, + 176, + 112, + 109, + 18, + 206, + 1, + 1, + 1, + 128, + 1, + 168, + 31, + 176, + 112, + 109, + 18, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 287, + 10, + 1, + 122, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 245, + 255, + 66, + 128, + 0, + 225, + 245, + 255, + 66, + 128, + 0, + 225, + 245, + 255, + 66, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 288, + 10, + 1, + 122, + 'Autumn Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70camtin', + 23, + 39, + 62, + 128, + 0, + 240, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 23, + 126, + 62, + 128, + 0, + 215, + 23, + 126, + 62, + 128, + 0, + 215, + 23, + 126, + 62, + 128, + 0, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 289, + 10, + 1, + 123, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 48, + 83, + 139, + 128, + 0, + 223, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 48, + 28, + 139, + 128, + 0, + 240, + 20, + 7, + 18, + 128, + 0, + 161, + 48, + 83, + 139, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 290, + 10, + 1, + 123, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 255, + 255, + 128, + 0, + 241, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 0, + 86, + 255, + 128, + 0, + 252, + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 291, + 10, + 1, + 123, + 'Astro Blue / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 145, + 210, + 142, + 128, + 0, + 216, + 145, + 210, + 142, + 128, + 0, + 216, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 150, + 79, + 142, + 128, + 0, + 241, + 145, + 210, + 142, + 128, + 0, + 216, + 145, + 210, + 142, + 128, + 0, + 216, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 292, + 10, + 1, + 123, + 'Shadow Grey', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 24, + 66, + 86, + 128, + 0, + 207, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 24, + 40, + 75, + 128, + 0, + 231, + 20, + 7, + 18, + 128, + 0, + 161, + 24, + 66, + 86, + 128, + 0, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 293, + 10, + 1, + 123, + 'Gold / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 22, + 107, + 142, + 128, + 0, + 225, + 22, + 107, + 142, + 128, + 0, + 225, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 28, + 47, + 142, + 128, + 0, + 245, + 22, + 107, + 142, + 128, + 0, + 225, + 22, + 107, + 142, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 294, + 10, + 1, + 123, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 101, + 178, + 33, + 128, + 0, + 193, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 64, + 84, + 33, + 128, + 36, + 206, + 20, + 7, + 18, + 128, + 0, + 161, + 101, + 178, + 33, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 295, + 10, + 1, + 123, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 137, + 57, + 52, + 128, + 0, + 237, + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 296, + 10, + 1, + 123, + 'Classic White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 58, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 40, + 7, + 255, + 128, + 27, + 255, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 40, + 7, + 255, + 128, + 27, + 225, + 20, + 7, + 18, + 128, + 0, + 161, + 40, + 7, + 255, + 128, + 27, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 297, + 10, + 1, + 123, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 130, + 182, + 97, + 128, + 0, + 222, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 130, + 73, + 97, + 128, + 0, + 235, + 20, + 7, + 18, + 128, + 0, + 161, + 130, + 182, + 97, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 298, + 10, + 1, + 123, + 'Black Cherry / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 1, + 255, + 80, + 128, + 2, + 203, + 1, + 255, + 80, + 128, + 2, + 203, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 1, + 66, + 80, + 128, + 2, + 241, + 1, + 255, + 80, + 128, + 2, + 203, + 1, + 255, + 80, + 128, + 2, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 299, + 10, + 1, + 123, + 'Autumn Gold / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 26, + 134, + 134, + 137, + 0, + 199, + 26, + 134, + 134, + 137, + 0, + 199, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 26, + 74, + 134, + 128, + 0, + 245, + 26, + 134, + 134, + 137, + 0, + 199, + 26, + 134, + 134, + 137, + 0, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 300, + 10, + 1, + 123, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 129, + 1, + 189, + 128, + 1, + 222, + 129, + 1, + 189, + 128, + 1, + 222, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 129, + 1, + 189, + 128, + 1, + 231, + 129, + 1, + 189, + 128, + 1, + 222, + 129, + 1, + 189, + 128, + 1, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 301, + 10, + 1, + 123, + 'Desert Sand', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70novtin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 22, + 147, + 147, + 128, + 0, + 244, + 20, + 7, + 31, + 128, + 0, + 246, + 40, + 10, + 255, + 128, + 77, + 255, + 22, + 53, + 147, + 128, + 0, + 250, + 20, + 7, + 18, + 128, + 0, + 161, + 22, + 147, + 147, + 128, + 0, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 302, + 10, + 1, + 123, + 'Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 20, + 5, + 1, + 128, + 0, + 184, + 20, + 5, + 1, + 128, + 0, + 184, + 0, + 255, + 255, + 128, + 0, + 241, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 20, + 5, + 66, + 128, + 0, + 245, + 20, + 5, + 1, + 128, + 0, + 184, + 20, + 5, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 303, + 10, + 1, + 123, + 'Yellow / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70novtin', + 29, + 255, + 255, + 128, + 34, + 255, + 29, + 255, + 255, + 128, + 34, + 255, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 37, + 64, + 255, + 128, + 16, + 239, + 29, + 255, + 255, + 128, + 34, + 255, + 29, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 304, + 10, + 1, + 124, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 252, + 70, + 92, + 122, + 0, + 231, + 252, + 254, + 92, + 122, + 10, + 255, + 40, + 20, + 255, + 128, + 0, + 250, + 252, + 254, + 92, + 122, + 23, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 9, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 254, + 255, + 92, + 128, + 0, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 305, + 10, + 1, + 124, + 'Berkeley Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 32, + 14, + 87, + 101, + 0, + 224, + 32, + 43, + 87, + 101, + 24, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 32, + 43, + 87, + 101, + 24, + 254, + 40, + 20, + 255, + 128, + 0, + 170, + 40, + 20, + 255, + 128, + 9, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 32, + 43, + 87, + 101, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 306, + 10, + 1, + 124, + 'Cavern Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 83, + 43, + 18, + 104, + 5, + 215, + 67, + 111, + 48, + 128, + 1, + 237, + 27, + 94, + 113, + 128, + 0, + 229, + 67, + 111, + 48, + 128, + 1, + 237, + 40, + 20, + 2, + 128, + 0, + 165, + 27, + 43, + 113, + 128, + 0, + 239, + 27, + 94, + 113, + 128, + 0, + 207, + 83, + 148, + 18, + 104, + 5, + 156, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 307, + 10, + 1, + 124, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 128, + 0, + 2, + 128, + 0, + 203, + 40, + 20, + 255, + 128, + 0, + 235, + 40, + 20, + 255, + 128, + 0, + 250, + 128, + 0, + 2, + 128, + 0, + 228, + 40, + 20, + 2, + 128, + 0, + 165, + 128, + 0, + 2, + 64, + 0, + 248, + 128, + 0, + 2, + 64, + 0, + 160, + 128, + 0, + 2, + 64, + 0, + 160, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 308, + 10, + 1, + 124, + 'Gunmetal Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 35, + 13, + 71, + 128, + 9, + 218, + 35, + 20, + 71, + 128, + 9, + 255, + 40, + 20, + 255, + 128, + 0, + 184, + 35, + 20, + 71, + 128, + 9, + 255, + 40, + 20, + 2, + 128, + 0, + 165, + 128, + 0, + 2, + 64, + 0, + 248, + 128, + 0, + 2, + 64, + 0, + 160, + 19, + 24, + 41, + 128, + 0, + 185, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 309, + 10, + 1, + 124, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 92, + 52, + 74, + 128, + 19, + 197, + 92, + 150, + 74, + 128, + 19, + 231, + 40, + 20, + 255, + 128, + 0, + 250, + 92, + 150, + 74, + 128, + 19, + 231, + 40, + 20, + 2, + 128, + 0, + 165, + 92, + 52, + 74, + 128, + 19, + 197, + 92, + 150, + 74, + 128, + 19, + 159, + 92, + 150, + 74, + 128, + 19, + 159, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 310, + 10, + 1, + 124, + 'Shetland Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 35, + 20, + 71, + 128, + 9, + 241, + 35, + 40, + 240, + 128, + 35, + 255, + 40, + 20, + 255, + 128, + 0, + 184, + 35, + 40, + 240, + 128, + 35, + 255, + 40, + 20, + 2, + 128, + 0, + 165, + 40, + 20, + 255, + 128, + 9, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 35, + 40, + 172, + 128, + 0, + 229, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 311, + 10, + 1, + 124, + 'Pawnee Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 22, + 45, + 186, + 128, + 1, + 231, + 22, + 133, + 186, + 128, + 7, + 252, + 40, + 20, + 255, + 128, + 0, + 250, + 22, + 133, + 186, + 128, + 23, + 252, + 40, + 20, + 255, + 128, + 0, + 250, + 22, + 45, + 186, + 128, + 1, + 231, + 22, + 133, + 186, + 128, + 1, + 215, + 22, + 133, + 186, + 128, + 1, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 312, + 10, + 1, + 124, + 'Asbury Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 62, + 30, + 194, + 128, + 0, + 235, + 62, + 53, + 194, + 128, + 19, + 253, + 40, + 20, + 255, + 128, + 0, + 250, + 62, + 53, + 194, + 128, + 19, + 253, + 40, + 20, + 255, + 128, + 0, + 250, + 40, + 20, + 255, + 128, + 9, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 62, + 53, + 194, + 128, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 313, + 10, + 1, + 124, + 'Marlboro Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '47cadtin', + 158, + 65, + 54, + 128, + 0, + 222, + 158, + 254, + 54, + 128, + 0, + 244, + 40, + 20, + 255, + 128, + 0, + 250, + 158, + 254, + 54, + 128, + 0, + 244, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 9, + 254, + 40, + 20, + 255, + 128, + 0, + 250, + 158, + 254, + 54, + 128, + 0, + 177, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 314, + 10, + 1, + 125, + 'Carnation Pink', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 4, + 74, + 255, + 128, + 40, + 240, + 40, + 20, + 255, + 128, + 10, + 255, + 4, + 74, + 255, + 128, + 40, + 240, + 170, + 5, + 255, + 128, + 30, + 254, + 4, + 74, + 255, + 128, + 40, + 240, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 315, + 10, + 1, + 125, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 253, + 246, + 255, + 128, + 0, + 245, + 40, + 20, + 255, + 128, + 10, + 255, + 253, + 246, + 255, + 128, + 0, + 245, + 170, + 5, + 255, + 128, + 30, + 254, + 253, + 246, + 255, + 128, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 316, + 10, + 10, + 125, + 'Lemon Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 36, + 167, + 255, + 128, + 45, + 252, + 40, + 20, + 255, + 128, + 10, + 255, + 36, + 167, + 255, + 128, + 45, + 252, + 170, + 5, + 255, + 128, + 30, + 254, + 36, + 167, + 255, + 128, + 45, + 252, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 317, + 10, + 1, + 125, + 'Pistachio', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 100, + 144, + 255, + 128, + 1, + 245, + 40, + 20, + 255, + 128, + 10, + 255, + 100, + 144, + 255, + 128, + 1, + 245, + 170, + 5, + 255, + 128, + 30, + 254, + 100, + 144, + 255, + 128, + 1, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 318, + 10, + 1, + 125, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 10, + 255, + 128, + 0, + 185, + 40, + 20, + 5, + 128, + 1, + 137, + 40, + 10, + 6, + 128, + 0, + 161, + 170, + 5, + 255, + 128, + 30, + 254, + 40, + 10, + 6, + 128, + 0, + 161, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 319, + 10, + 10, + 125, + 'Light Blue Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 130, + 78, + 180, + 128, + 14, + 233, + 40, + 20, + 255, + 128, + 10, + 255, + 130, + 78, + 180, + 128, + 14, + 233, + 170, + 5, + 255, + 128, + 30, + 254, + 130, + 78, + 180, + 128, + 14, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 320, + 10, + 1, + 125, + 'Executive Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 1, + 189, + 40, + 20, + 255, + 128, + 1, + 189, + 40, + 20, + 255, + 128, + 1, + 189, + 158, + 156, + 75, + 128, + 0, + 197, + 40, + 20, + 5, + 128, + 1, + 137, + 158, + 156, + 75, + 128, + 0, + 197, + 158, + 156, + 75, + 128, + 0, + 197, + 158, + 156, + 75, + 128, + 0, + 197, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 321, + 10, + 10, + 125, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 1, + 255, + 171, + 128, + 1, + 220, + 1, + 255, + 171, + 128, + 1, + 220, + 1, + 255, + 171, + 128, + 1, + 220, + 130, + 9, + 255, + 128, + 53, + 231, + 40, + 20, + 5, + 128, + 1, + 137, + 130, + 9, + 255, + 128, + 53, + 231, + 130, + 9, + 255, + 128, + 53, + 231, + 130, + 9, + 255, + 128, + 53, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 322, + 10, + 1, + 125, + 'Saddle Rose', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 21, + 114, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 21, + 114, + 255, + 128, + 10, + 255, + 170, + 5, + 255, + 128, + 30, + 254, + 21, + 114, + 255, + 128, + 10, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 323, + 10, + 1, + 125, + 'Sky Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 142, + 125, + 255, + 128, + 44, + 225, + 40, + 20, + 255, + 128, + 10, + 255, + 142, + 125, + 255, + 128, + 44, + 225, + 170, + 5, + 255, + 128, + 30, + 254, + 142, + 125, + 255, + 128, + 44, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 324, + 10, + 1, + 125, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 246, + 242, + 74, + 128, + 0, + 197, + 246, + 242, + 74, + 128, + 0, + 197, + 246, + 242, + 74, + 128, + 0, + 197, + 40, + 10, + 255, + 128, + 0, + 185, + 40, + 20, + 5, + 128, + 1, + 137, + 40, + 10, + 6, + 128, + 0, + 161, + 40, + 10, + 6, + 128, + 0, + 161, + 40, + 10, + 6, + 128, + 0, + 161, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 325, + 10, + 1, + 125, + 'Yellow Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 40, + 20, + 255, + 128, + 1, + 189, + 40, + 20, + 255, + 128, + 10, + 255, + 40, + 20, + 255, + 128, + 10, + 255, + 36, + 129, + 255, + 128, + 24, + 237, + 40, + 20, + 5, + 128, + 1, + 137, + 36, + 129, + 255, + 128, + 24, + 237, + 170, + 5, + 255, + 128, + 30, + 254, + 36, + 129, + 255, + 128, + 24, + 237, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 326, + 10, + 1, + 125, + 'Dark Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '59cadtin', + 246, + 242, + 74, + 128, + 0, + 197, + 246, + 242, + 74, + 128, + 0, + 197, + 246, + 242, + 74, + 128, + 0, + 197, + 254, + 254, + 96, + 128, + 0, + 206, + 40, + 20, + 5, + 128, + 1, + 137, + 254, + 254, + 96, + 128, + 0, + 206, + 254, + 254, + 96, + 128, + 0, + 206, + 254, + 254, + 96, + 128, + 0, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 327, + 10, + 1, + 126, + 'Crimson', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 2, + 150, + 255, + 128, + 0, + 236, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 328, + 10, + 1, + 126, + 'Platinum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 134, + 10, + 126, + 128, + 6, + 245, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 329, + 10, + 1, + 126, + 'Trophy Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 170, + 128, + 192, + 128, + 0, + 214, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 330, + 10, + 1, + 126, + 'Ebony Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 6, + 10, + 9, + 128, + 0, + 197, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 331, + 10, + 1, + 126, + 'Topaz', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 37, + 65, + 145, + 128, + 0, + 243, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 332, + 10, + 1, + 126, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 128, + 10, + 255, + 128, + 18, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 333, + 10, + 1, + 126, + 'Powder Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 135, + 61, + 190, + 128, + 0, + 242, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 28, + 26, + 164, + 128, + 10, + 255, + 30, + 10, + 1, + 128, + 0, + 194, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 334, + 10, + 1, + 126, + 'Chestnut Bronze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 5, + 91, + 82, + 128, + 0, + 218, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 335, + 10, + 1, + 126, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 2, + 150, + 255, + 128, + 0, + 236, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 28, + 26, + 164, + 128, + 10, + 255, + 30, + 10, + 1, + 128, + 0, + 194, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 0, + 'Factory', + 'This color is not in the 60 Olds 442 CSV and can not be verified. It is also not a referenced factory color.' + ), + ( + 336, + 10, + 1, + 126, + 'Saffron', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 33, + 96, + 255, + 128, + 16, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 337, + 10, + 1, + 126, + 'Flamingo Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 246, + 33, + 80, + 128, + 7, + 242, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 338, + 10, + 1, + 126, + 'Meadow Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 77, + 44, + 109, + 128, + 1, + 242, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 339, + 10, + 1, + 126, + 'Palomino Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 32, + 56, + 118, + 128, + 0, + 245, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 340, + 10, + 10, + 127, + 'Orange / Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 18, + 43, + 255, + 128, + 20, + 255, + 28, + 24, + 255, + 128, + 53, + 254, + 28, + 24, + 255, + 128, + 53, + 254, + 28, + 24, + 255, + 128, + 53, + 254, + 31, + 5, + 255, + 128, + 0, + 252, + 24, + 11, + 255, + 128, + 44, + 255, + 24, + 11, + 255, + 128, + 66, + 255, + 18, + 255, + 255, + 128, + 28, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 341, + 10, + 10, + 127, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '55centin', + 1, + 70, + 255, + 128, + 10, + 255, + 43, + 9, + 255, + 128, + 0, + 245, + 41, + 28, + 20, + 92, + 11, + 255, + 41, + 28, + 20, + 92, + 11, + 202, + 15, + 5, + 1, + 128, + 0, + 150, + 1, + 255, + 255, + 128, + 10, + 255, + 1, + 255, + 255, + 128, + 10, + 255, + 1, + 255, + 255, + 128, + 10, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 342, + 10, + 10, + 127, + 'Yellow / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 38, + 61, + 255, + 128, + 43, + 223, + 28, + 24, + 255, + 128, + 53, + 254, + 28, + 24, + 255, + 128, + 53, + 254, + 28, + 24, + 255, + 128, + 53, + 254, + 31, + 5, + 255, + 128, + 0, + 252, + 24, + 11, + 255, + 128, + 44, + 255, + 24, + 11, + 255, + 128, + 66, + 255, + 33, + 254, + 255, + 128, + 43, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 343, + 10, + 1, + 127, + 'Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 1, + 112, + 255, + 128, + 3, + 240, + 1, + 255, + 255, + 128, + 3, + 229, + 41, + 28, + 20, + 92, + 11, + 255, + 41, + 28, + 20, + 92, + 11, + 202, + 15, + 5, + 1, + 128, + 0, + 150, + 1, + 255, + 255, + 128, + 10, + 255, + 15, + 7, + 3, + 128, + 0, + 194, + 15, + 7, + 3, + 128, + 0, + 169, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 344, + 10, + 1, + 127, + 'Light Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '55centin', + 67, + 80, + 129, + 128, + 0, + 253, + 28, + 24, + 255, + 128, + 9, + 254, + 41, + 28, + 20, + 92, + 11, + 255, + 41, + 28, + 20, + 92, + 11, + 202, + 15, + 5, + 1, + 128, + 0, + 150, + 67, + 107, + 129, + 128, + 0, + 246, + 67, + 107, + 129, + 128, + 0, + 246, + 67, + 107, + 129, + 128, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 345, + 10, + 1, + 127, + 'Stone Gray / Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 45, + 15, + 131, + 128, + 0, + 239, + 41, + 28, + 20, + 92, + 11, + 231, + 41, + 28, + 20, + 92, + 11, + 255, + 41, + 28, + 20, + 92, + 11, + 202, + 15, + 5, + 1, + 128, + 0, + 150, + 45, + 15, + 131, + 128, + 0, + 250, + 45, + 15, + 131, + 128, + 0, + 223, + 45, + 15, + 131, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 346, + 10, + 1, + 127, + 'Pearl White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '55centin', + 128, + 7, + 255, + 128, + 19, + 255, + 28, + 36, + 255, + 128, + 18, + 254, + 1, + 255, + 255, + 128, + 3, + 244, + 1, + 255, + 255, + 128, + 3, + 229, + 15, + 5, + 1, + 128, + 0, + 150, + 128, + 7, + 255, + 128, + 39, + 255, + 128, + 7, + 255, + 128, + 39, + 255, + 128, + 1, + 255, + 128, + 52, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 347, + 10, + 1, + 127, + 'Purple / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 138, + 28, + 66, + 128, + 30, + 253, + 41, + 28, + 20, + 92, + 11, + 231, + 41, + 28, + 20, + 92, + 11, + 255, + 41, + 28, + 20, + 92, + 11, + 202, + 31, + 5, + 255, + 128, + 0, + 252, + 24, + 11, + 255, + 128, + 44, + 255, + 205, + 255, + 66, + 128, + 0, + 225, + 205, + 255, + 66, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 348, + 10, + 1, + 127, + 'Plum Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '55centin', + 128, + 0, + 255, + 128, + 7, + 255, + 20, + 7, + 6, + 128, + 0, + 211, + 20, + 7, + 6, + 128, + 0, + 218, + 41, + 28, + 20, + 92, + 11, + 202, + 15, + 5, + 1, + 128, + 0, + 150, + 248, + 41, + 88, + 128, + 0, + 228, + 248, + 41, + 88, + 128, + 0, + 228, + 248, + 41, + 88, + 128, + 0, + 228, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 349, + 10, + 1, + 127, + 'Dark Teal / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '55centin', + 128, + 41, + 53, + 128, + 0, + 254, + 43, + 9, + 255, + 128, + 0, + 245, + 43, + 9, + 255, + 128, + 0, + 245, + 41, + 28, + 20, + 92, + 11, + 202, + 31, + 5, + 255, + 128, + 0, + 252, + 128, + 7, + 255, + 128, + 39, + 255, + 128, + 7, + 255, + 128, + 39, + 255, + 128, + 79, + 53, + 128, + 0, + 224, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 350, + 10, + 1, + 127, + 'Sapphire Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '55centin', + 151, + 95, + 62, + 128, + 0, + 246, + 43, + 9, + 255, + 128, + 0, + 245, + 151, + 150, + 62, + 128, + 0, + 248, + 151, + 150, + 62, + 128, + 0, + 212, + 15, + 5, + 1, + 128, + 0, + 150, + 151, + 255, + 62, + 128, + 0, + 227, + 151, + 255, + 62, + 128, + 0, + 227, + 151, + 255, + 62, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 351, + 10, + 1, + 128, + 'Teal Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 40, + 20, + 35, + 128, + 0, + 188, + 40, + 20, + 255, + 128, + 0, + 180, + 40, + 20, + 255, + 128, + 0, + 211, + 30, + 32, + 255, + 128, + 0, + 175, + 40, + 20, + 19, + 128, + 0, + 197, + 120, + 255, + 65, + 128, + 0, + 227, + 120, + 255, + 65, + 128, + 0, + 227, + 120, + 255, + 65, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 352, + 10, + 1, + 128, + 'Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 40, + 20, + 35, + 128, + 0, + 188, + 40, + 20, + 255, + 128, + 0, + 180, + 40, + 20, + 255, + 128, + 0, + 211, + 30, + 32, + 255, + 128, + 0, + 175, + 40, + 20, + 19, + 128, + 0, + 197, + 139, + 190, + 158, + 128, + 0, + 242, + 139, + 190, + 158, + 128, + 0, + 242, + 139, + 190, + 158, + 128, + 0, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 353, + 10, + 1, + 128, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 40, + 20, + 70, + 128, + 0, + 216, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 20, + 255, + 128, + 0, + 239, + 30, + 65, + 255, + 128, + 0, + 190, + 40, + 20, + 19, + 128, + 0, + 197, + 250, + 255, + 56, + 128, + 0, + 227, + 250, + 255, + 56, + 128, + 0, + 227, + 250, + 255, + 56, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 354, + 10, + 1, + 128, + 'Midnight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 40, + 20, + 35, + 128, + 0, + 188, + 40, + 20, + 255, + 128, + 0, + 180, + 40, + 20, + 255, + 128, + 0, + 211, + 30, + 32, + 255, + 128, + 0, + 175, + 40, + 20, + 19, + 128, + 0, + 197, + 148, + 255, + 58, + 128, + 0, + 215, + 148, + 255, + 58, + 128, + 0, + 215, + 148, + 255, + 58, + 128, + 0, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 355, + 10, + 1, + 128, + 'Cherry Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 30, + 65, + 108, + 128, + 0, + 208, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 20, + 255, + 128, + 0, + 239, + 30, + 65, + 255, + 128, + 0, + 190, + 40, + 20, + 19, + 128, + 0, + 197, + 3, + 255, + 121, + 128, + 0, + 252, + 3, + 255, + 121, + 128, + 0, + 252, + 3, + 255, + 121, + 128, + 0, + 252, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 356, + 10, + 1, + 128, + 'Antique Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 31, + 165, + 180, + 128, + 0, + 246, + 31, + 165, + 180, + 128, + 0, + 246, + 31, + 165, + 180, + 128, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 357, + 10, + 1, + 128, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 30, + 65, + 108, + 128, + 0, + 208, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 20, + 255, + 128, + 0, + 239, + 30, + 65, + 255, + 128, + 0, + 190, + 40, + 20, + 19, + 128, + 0, + 197, + 31, + 82, + 79, + 128, + 0, + 246, + 31, + 82, + 79, + 128, + 0, + 246, + 31, + 82, + 79, + 128, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 358, + 10, + 1, + 128, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 20, + 6, + 1, + 128, + 0, + 199, + 20, + 6, + 1, + 128, + 0, + 199, + 20, + 6, + 1, + 128, + 0, + 186, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 359, + 10, + 1, + 128, + 'Windward Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 30, + 65, + 108, + 128, + 0, + 208, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 20, + 255, + 128, + 0, + 239, + 30, + 65, + 255, + 128, + 0, + 190, + 40, + 20, + 19, + 128, + 0, + 197, + 138, + 108, + 105, + 128, + 0, + 236, + 138, + 108, + 105, + 128, + 0, + 236, + 138, + 108, + 105, + 128, + 0, + 236, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 360, + 10, + 1, + 128, + 'Goldenrod Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 30, + 65, + 108, + 128, + 0, + 208, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 20, + 255, + 128, + 0, + 239, + 30, + 65, + 255, + 128, + 0, + 190, + 35, + 10, + 255, + 128, + 26, + 255, + 35, + 255, + 255, + 128, + 52, + 255, + 35, + 255, + 255, + 128, + 52, + 255, + 35, + 255, + 255, + 128, + 52, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 361, + 10, + 1, + 128, + 'Midnight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 104, + 248, + 47, + 128, + 0, + 214, + 104, + 248, + 47, + 128, + 0, + 214, + 104, + 248, + 47, + 128, + 0, + 214, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 362, + 10, + 1, + 128, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 128, + 5, + 255, + 128, + 50, + 255, + 128, + 5, + 255, + 128, + 50, + 255, + 128, + 5, + 255, + 128, + 50, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 363, + 10, + 1, + 128, + 'Mayfair Maize', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 40, + 137, + 255, + 128, + 32, + 255, + 40, + 137, + 255, + 128, + 32, + 255, + 40, + 137, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 364, + 10, + 1, + 128, + 'Limelight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 128, + 0, + 32, + 128, + 0, + 199, + 128, + 0, + 5, + 128, + 0, + 180, + 128, + 0, + 23, + 128, + 0, + 211, + 128, + 0, + 16, + 128, + 0, + 183, + 40, + 20, + 19, + 128, + 0, + 197, + 54, + 104, + 120, + 128, + 0, + 235, + 54, + 104, + 120, + 128, + 0, + 235, + 54, + 104, + 120, + 128, + 0, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 365, + 10, + 1, + 128, + 'Palladium Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66gtotin', + 30, + 19, + 255, + 128, + 0, + 201, + 40, + 20, + 255, + 128, + 0, + 239, + 40, + 13, + 255, + 128, + 0, + 239, + 30, + 35, + 255, + 128, + 0, + 190, + 40, + 20, + 19, + 128, + 0, + 197, + 128, + 24, + 96, + 128, + 1, + 244, + 128, + 24, + 96, + 128, + 1, + 244, + 128, + 24, + 96, + 128, + 1, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 366, + 10, + 1, + 129, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 17, + 122, + 255, + 128, + 15, + 253, + 24, + 255, + 255, + 128, + 15, + 253, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 28, + 255, + 255, + 128, + 15, + 253, + 37, + 255, + 255, + 128, + 17, + 255, + 15, + 255, + 255, + 128, + 23, + 253, + 0, + 'Factory', + 'As per 69 GTO CSV, but this color does not appear in the reference material for the car.' + ), + ( + 367, + 10, + 1, + 129, + 'Warwick Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 142, + 129, + 167, + 128, + 6, + 229, + 142, + 142, + 167, + 128, + 6, + 208, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 14, + 128, + 0, + 215, + 30, + 10, + 19, + 128, + 0, + 175, + 142, + 88, + 167, + 128, + 6, + 212, + 142, + 5, + 167, + 128, + 6, + 240, + 142, + 255, + 167, + 128, + 6, + 201, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 368, + 10, + 1, + 129, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 249, + 79, + 61, + 128, + 0, + 229, + 11, + 255, + 255, + 128, + 1, + 233, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 74, + 142, + 128, + 0, + 241, + 23, + 255, + 255, + 128, + 17, + 255, + 37, + 255, + 255, + 128, + 17, + 255, + 249, + 255, + 61, + 128, + 0, + 198, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 369, + 10, + 1, + 129, + 'Liberty Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 144, + 69, + 58, + 128, + 0, + 208, + 142, + 129, + 167, + 128, + 6, + 211, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 142, + 101, + 167, + 128, + 6, + 236, + 142, + 5, + 167, + 128, + 6, + 240, + 144, + 255, + 58, + 128, + 0, + 180, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 370, + 10, + 1, + 129, + 'Matador Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 2, + 69, + 144, + 128, + 0, + 227, + 15, + 255, + 255, + 128, + 17, + 255, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 23, + 255, + 255, + 128, + 17, + 255, + 37, + 255, + 255, + 128, + 17, + 255, + 2, + 255, + 144, + 128, + 0, + 227, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 371, + 10, + 1, + 129, + 'Antique Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 31, + 64, + 182, + 128, + 0, + 239, + 26, + 169, + 182, + 128, + 0, + 232, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 26, + 169, + 182, + 128, + 0, + 232, + 26, + 169, + 182, + 128, + 0, + 232, + 26, + 169, + 182, + 128, + 0, + 232, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 372, + 10, + 1, + 129, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 34, + 45, + 73, + 128, + 0, + 231, + 34, + 91, + 105, + 128, + 0, + 212, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 30, + 36, + 145, + 128, + 0, + 224, + 30, + 36, + 145, + 128, + 0, + 224, + 30, + 36, + 145, + 128, + 0, + 224, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 373, + 10, + 1, + 129, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 30, + 10, + 5, + 154, + 0, + 192, + 2, + 255, + 255, + 128, + 0, + 195, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 1, + 255, + 255, + 128, + 0, + 237, + 1, + 255, + 255, + 128, + 26, + 255, + 30, + 10, + 5, + 154, + 0, + 155, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 374, + 10, + 1, + 129, + 'Windward Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 147, + 41, + 74, + 128, + 0, + 224, + 134, + 186, + 74, + 128, + 0, + 198, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 134, + 186, + 74, + 128, + 0, + 198, + 134, + 186, + 74, + 128, + 0, + 198, + 134, + 186, + 74, + 128, + 0, + 198, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 375, + 10, + 1, + 129, + 'Goldenrod Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 37, + 62, + 255, + 128, + 18, + 255, + 28, + 255, + 255, + 128, + 26, + 225, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 24, + 255, + 255, + 128, + 26, + 255, + 18, + 255, + 255, + 128, + 26, + 255, + 31, + 255, + 255, + 128, + 17, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 376, + 10, + 1, + 129, + 'Verdoro Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 103, + 41, + 28, + 154, + 0, + 206, + 60, + 255, + 255, + 128, + 1, + 214, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 47, + 255, + 255, + 128, + 1, + 244, + 37, + 255, + 255, + 128, + 17, + 255, + 69, + 125, + 28, + 154, + 0, + 176, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 377, + 10, + 1, + 129, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 128, + 5, + 255, + 128, + 14, + 255, + 2, + 73, + 255, + 128, + 19, + 225, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 2, + 146, + 255, + 128, + 19, + 255, + 2, + 255, + 255, + 128, + 19, + 255, + 47, + 11, + 255, + 128, + 27, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 378, + 10, + 1, + 129, + 'Crystal Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 121, + 44, + 71, + 128, + 0, + 218, + 121, + 255, + 71, + 128, + 0, + 205, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 14, + 128, + 0, + 215, + 30, + 10, + 19, + 128, + 0, + 175, + 121, + 255, + 71, + 128, + 0, + 205, + 121, + 255, + 71, + 128, + 0, + 205, + 121, + 255, + 71, + 128, + 0, + 205, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 379, + 10, + 1, + 129, + 'Limelight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 50, + 45, + 95, + 128, + 0, + 229, + 50, + 108, + 95, + 128, + 0, + 211, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 50, + 108, + 95, + 128, + 0, + 211, + 50, + 108, + 95, + 128, + 0, + 211, + 50, + 108, + 95, + 128, + 0, + 211, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 380, + 10, + 1, + 129, + 'Carousel Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 2, + 77, + 255, + 128, + 0, + 245, + 13, + 255, + 255, + 128, + 9, + 255, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 22, + 255, + 255, + 128, + 9, + 255, + 32, + 255, + 255, + 128, + 9, + 255, + 2, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 381, + 10, + 1, + 129, + 'Paladium Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtotin', + 128, + 15, + 94, + 128, + 0, + 237, + 32, + 73, + 255, + 128, + 0, + 237, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 32, + 142, + 255, + 128, + 0, + 240, + 32, + 255, + 255, + 128, + 9, + 255, + 128, + 15, + 94, + 128, + 0, + 228, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 382, + 10, + 1, + 130, + 'Buccaneer Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 6, + 77, + 255, + 128, + 0, + 242, + 26, + 255, + 203, + 128, + 0, + 255, + 18, + 255, + 203, + 128, + 27, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 14, + 255, + 203, + 128, + 27, + 255, + 10, + 255, + 203, + 128, + 9, + 255, + 6, + 255, + 255, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 383, + 10, + 1, + 130, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 128, + 0, + 255, + 128, + 1, + 254, + 159, + 255, + 121, + 128, + 1, + 250, + 154, + 189, + 161, + 128, + 9, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 154, + 163, + 184, + 128, + 23, + 255, + 154, + 100, + 184, + 128, + 32, + 255, + 128, + 0, + 255, + 128, + 14, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 384, + 10, + 1, + 130, + 'Brewster Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 107, + 39, + 28, + 128, + 0, + 211, + 109, + 255, + 80, + 128, + 0, + 244, + 109, + 255, + 80, + 128, + 0, + 227, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 109, + 255, + 80, + 128, + 0, + 212, + 109, + 255, + 80, + 128, + 0, + 193, + 107, + 255, + 28, + 138, + 0, + 168, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 385, + 10, + 1, + 130, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 128, + 0, + 1, + 82, + 0, + 206, + 33, + 236, + 203, + 128, + 0, + 253, + 28, + 236, + 203, + 128, + 0, + 241, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 23, + 236, + 203, + 128, + 0, + 245, + 23, + 236, + 203, + 128, + 0, + 206, + 128, + 0, + 1, + 82, + 0, + 156, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 386, + 10, + 1, + 130, + 'Windward Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 135, + 78, + 77, + 158, + 0, + 218, + 135, + 40, + 77, + 158, + 0, + 222, + 135, + 40, + 77, + 158, + 0, + 231, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 135, + 27, + 77, + 158, + 0, + 241, + 135, + 125, + 77, + 158, + 0, + 223, + 135, + 250, + 77, + 158, + 0, + 182, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 387, + 10, + 1, + 130, + 'Palladium Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 128, + 0, + 195, + 148, + 0, + 232, + 18, + 255, + 203, + 128, + 0, + 255, + 10, + 255, + 203, + 128, + 0, + 241, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 2, + 255, + 203, + 128, + 1, + 220, + 2, + 173, + 203, + 128, + 1, + 244, + 128, + 13, + 122, + 148, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 388, + 10, + 1, + 130, + 'Goldenrod Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 31, + 146, + 255, + 128, + 5, + 255, + 31, + 50, + 255, + 128, + 0, + 240, + 31, + 50, + 255, + 128, + 0, + 218, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 31, + 133, + 255, + 128, + 0, + 218, + 31, + 239, + 255, + 128, + 0, + 231, + 31, + 255, + 255, + 128, + 11, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 389, + 10, + 1, + 130, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 250, + 79, + 45, + 128, + 0, + 222, + 33, + 236, + 203, + 128, + 0, + 253, + 28, + 236, + 203, + 128, + 0, + 241, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 23, + 236, + 203, + 128, + 0, + 245, + 23, + 236, + 203, + 128, + 0, + 206, + 250, + 255, + 45, + 128, + 0, + 172, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 390, + 10, + 1, + 130, + 'Midnight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73tratin', + 150, + 53, + 54, + 152, + 0, + 210, + 33, + 236, + 203, + 128, + 0, + 253, + 28, + 236, + 203, + 128, + 0, + 241, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 23, + 236, + 203, + 128, + 0, + 245, + 23, + 236, + 203, + 128, + 0, + 206, + 150, + 255, + 54, + 152, + 0, + 185, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 391, + 10, + 1, + 131, + 'Matador Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 0, + 41, + 255, + 128, + 0, + 255, + 128, + 0, + 156, + 128, + 0, + 218, + 0, + 120, + 255, + 128, + 18, + 255, + 26, + 56, + 99, + 128, + 0, + 250, + 26, + 56, + 99, + 128, + 0, + 250, + 126, + 7, + 255, + 128, + 31, + 255, + 0, + 255, + 255, + 128, + 0, + 255, + 0, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 392, + 10, + 1, + 131, + 'Black Mink', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 20, + 7, + 69, + 128, + 0, + 214, + 128, + 0, + 156, + 128, + 0, + 218, + 20, + 7, + 16, + 128, + 0, + 152, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 20, + 7, + 16, + 128, + 0, + 152, + 0, + 255, + 255, + 128, + 0, + 255, + 20, + 7, + 16, + 128, + 0, + 152, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 393, + 10, + 1, + 131, + 'Beale St. Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 156, + 48, + 134, + 128, + 0, + 233, + 128, + 0, + 156, + 128, + 0, + 218, + 151, + 176, + 134, + 128, + 0, + 210, + 26, + 32, + 206, + 128, + 22, + 255, + 26, + 32, + 206, + 128, + 22, + 255, + 151, + 176, + 134, + 128, + 0, + 210, + 151, + 5, + 134, + 128, + 0, + 229, + 151, + 176, + 134, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 394, + 10, + 1, + 131, + 'Hunter Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 58, + 31, + 75, + 128, + 0, + 224, + 128, + 0, + 156, + 128, + 0, + 218, + 86, + 133, + 75, + 128, + 0, + 202, + 26, + 56, + 99, + 128, + 0, + 250, + 26, + 56, + 99, + 128, + 0, + 250, + 86, + 133, + 75, + 128, + 0, + 202, + 86, + 133, + 75, + 128, + 0, + 202, + 86, + 133, + 75, + 128, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 395, + 10, + 1, + 131, + 'Pompei Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 34, + 150, + 255, + 128, + 26, + 255, + 128, + 0, + 156, + 128, + 0, + 218, + 34, + 255, + 255, + 108, + 26, + 255, + 26, + 56, + 99, + 128, + 0, + 250, + 26, + 56, + 99, + 128, + 0, + 250, + 34, + 255, + 255, + 108, + 26, + 255, + 7, + 7, + 14, + 128, + 0, + 171, + 34, + 255, + 255, + 108, + 26, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 396, + 10, + 1, + 131, + 'Frost White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 126, + 7, + 255, + 128, + 1, + 253, + 128, + 0, + 156, + 128, + 0, + 218, + 126, + 7, + 255, + 103, + 31, + 255, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 126, + 7, + 255, + 103, + 31, + 255, + 7, + 7, + 14, + 128, + 0, + 171, + 126, + 7, + 255, + 103, + 31, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 397, + 10, + 1, + 131, + 'Butternut Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 23, + 50, + 150, + 128, + 0, + 244, + 128, + 0, + 156, + 128, + 0, + 218, + 23, + 175, + 150, + 128, + 0, + 222, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 23, + 175, + 150, + 128, + 0, + 222, + 7, + 7, + 14, + 128, + 0, + 171, + 23, + 175, + 150, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 398, + 10, + 1, + 131, + 'Alamosa Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 120, + 22, + 74, + 128, + 0, + 235, + 128, + 0, + 156, + 128, + 0, + 218, + 120, + 90, + 74, + 128, + 1, + 248, + 26, + 32, + 206, + 128, + 22, + 255, + 26, + 32, + 206, + 128, + 22, + 255, + 126, + 7, + 255, + 128, + 31, + 255, + 120, + 126, + 74, + 128, + 0, + 214, + 120, + 126, + 74, + 128, + 0, + 214, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 399, + 10, + 1, + 131, + 'Bittersweet Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 18, + 126, + 255, + 128, + 27, + 255, + 128, + 0, + 156, + 128, + 0, + 218, + 18, + 231, + 255, + 128, + 1, + 207, + 128, + 0, + 2, + 128, + 0, + 239, + 128, + 0, + 2, + 128, + 0, + 239, + 7, + 7, + 14, + 128, + 0, + 171, + 18, + 231, + 255, + 128, + 19, + 246, + 18, + 231, + 255, + 128, + 19, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 400, + 10, + 1, + 131, + 'Castillian Grey', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 15, + 10, + 109, + 128, + 0, + 240, + 128, + 0, + 156, + 128, + 0, + 218, + 15, + 10, + 109, + 128, + 0, + 248, + 128, + 0, + 2, + 128, + 0, + 239, + 128, + 0, + 2, + 128, + 0, + 239, + 126, + 7, + 255, + 128, + 31, + 255, + 15, + 10, + 109, + 128, + 0, + 229, + 15, + 10, + 109, + 128, + 0, + 229, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 401, + 10, + 1, + 131, + 'Willow Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 75, + 49, + 163, + 128, + 1, + 253, + 128, + 0, + 156, + 128, + 0, + 218, + 75, + 100, + 163, + 128, + 1, + 242, + 26, + 56, + 99, + 128, + 0, + 250, + 26, + 56, + 99, + 128, + 0, + 250, + 75, + 100, + 163, + 128, + 1, + 242, + 75, + 100, + 163, + 128, + 1, + 242, + 75, + 100, + 163, + 128, + 1, + 242, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 402, + 10, + 1, + 131, + 'Regatta Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 170, + 77, + 82, + 128, + 10, + 228, + 128, + 0, + 156, + 128, + 0, + 218, + 146, + 255, + 82, + 128, + 10, + 199, + 128, + 0, + 2, + 128, + 0, + 239, + 128, + 0, + 2, + 128, + 0, + 239, + 146, + 255, + 82, + 128, + 10, + 199, + 146, + 255, + 82, + 128, + 10, + 199, + 146, + 255, + 82, + 128, + 10, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 403, + 10, + 1, + 131, + 'Big Bad Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 84, + 70, + 255, + 128, + 0, + 249, + 66, + 255, + 255, + 128, + 0, + 253, + 66, + 255, + 255, + 128, + 0, + 253, + 26, + 56, + 99, + 128, + 0, + 255, + 26, + 56, + 99, + 128, + 0, + 250, + 66, + 255, + 255, + 128, + 0, + 253, + 7, + 7, + 14, + 128, + 0, + 171, + 66, + 255, + 255, + 128, + 0, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 404, + 10, + 1, + 131, + 'Big Bad Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 16, + 113, + 255, + 128, + 23, + 255, + 16, + 254, + 255, + 113, + 23, + 255, + 16, + 254, + 255, + 113, + 23, + 255, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 16, + 254, + 255, + 113, + 23, + 255, + 7, + 7, + 14, + 128, + 0, + 171, + 16, + 254, + 255, + 113, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 405, + 10, + 1, + 131, + 'Big Bad Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 170, + 101, + 205, + 128, + 0, + 255, + 158, + 255, + 205, + 128, + 0, + 245, + 158, + 255, + 205, + 128, + 0, + 245, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 158, + 255, + 205, + 128, + 0, + 245, + 7, + 7, + 14, + 128, + 0, + 171, + 158, + 255, + 205, + 128, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 406, + 10, + 1, + 132, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 18, + 255, + 255, + 128, + 37, + 248, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 22, + 105, + 255, + 128, + 18, + 248, + 18, + 255, + 255, + 128, + 37, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 407, + 10, + 1, + 132, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 69, + 99, + 125, + 128, + 0, + 224, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 69, + 37, + 125, + 128, + 0, + 240, + 69, + 99, + 125, + 128, + 0, + 224, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 408, + 10, + 1, + 132, + 'Lime Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 88, + 244, + 255, + 128, + 1, + 255, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 88, + 77, + 255, + 128, + 1, + 255, + 88, + 244, + 255, + 128, + 1, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 409, + 10, + 1, + 132, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 31, + 253, + 255, + 97, + 49, + 255, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 39, + 95, + 255, + 128, + 22, + 255, + 31, + 253, + 255, + 97, + 49, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 410, + 10, + 1, + 132, + 'Daytona Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 152, + 233, + 147, + 128, + 0, + 246, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 16, + 253, + 170, + 83, + 147, + 128, + 0, + 246, + 152, + 233, + 147, + 128, + 0, + 246, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 411, + 10, + 1, + 132, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 1, + 255, + 255, + 128, + 0, + 255, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 1, + 95, + 255, + 128, + 0, + 255, + 1, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 412, + 10, + 1, + 132, + 'Green Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 117, + 62, + 77, + 128, + 0, + 215, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 117, + 62, + 77, + 128, + 0, + 215, + 117, + 31, + 77, + 128, + 0, + 233, + 117, + 62, + 77, + 128, + 0, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 413, + 10, + 1, + 132, + 'Fire Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 27, + 194, + 211, + 128, + 13, + 241, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 27, + 194, + 211, + 128, + 13, + 241, + 27, + 54, + 211, + 128, + 13, + 241, + 27, + 194, + 211, + 128, + 13, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 414, + 10, + 1, + 132, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 30, + 5, + 19, + 128, + 0, + 185, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 1, + 255, + 116, + 128, + 0, + 233, + 30, + 5, + 19, + 128, + 0, + 218, + 30, + 5, + 19, + 128, + 0, + 165, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 415, + 10, + 1, + 132, + 'Purple', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 225, + 255, + 62, + 128, + 0, + 215, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 225, + 60, + 62, + 128, + 0, + 231, + 225, + 255, + 62, + 128, + 0, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 416, + 10, + 1, + 132, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 35, + 13, + 100, + 128, + 0, + 229, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 22, + 16, + 1, + 128, + 2, + 163, + 35, + 13, + 100, + 128, + 0, + 229, + 35, + 13, + 100, + 128, + 0, + 229, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 417, + 10, + 1, + 132, + 'Copper', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 15, + 169, + 52, + 128, + 16, + 208, + 23, + 1, + 1, + 128, + 20, + 141, + 26, + 10, + 13, + 128, + 5, + 255, + 30, + 7, + 22, + 128, + 0, + 245, + 40, + 20, + 19, + 128, + 20, + 156, + 15, + 169, + 52, + 128, + 16, + 208, + 15, + 52, + 52, + 128, + 16, + 208, + 15, + 169, + 52, + 128, + 16, + 208, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 418, + 10, + 1, + 132, + 'White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69chatin', + 1, + 253, + 255, + 128, + 0, + 178, + 1, + 253, + 255, + 128, + 0, + 178, + 1, + 253, + 255, + 128, + 0, + 255, + 1, + 253, + 255, + 128, + 0, + 255, + 40, + 20, + 19, + 128, + 20, + 156, + 0, + 255, + 255, + 128, + 13, + 246, + 44, + 9, + 255, + 128, + 2, + 249, + 44, + 9, + 255, + 128, + 39, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 419, + 10, + 1, + 133, + 'Lime Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 66, + 78, + 48, + 128, + 0, + 231, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 66, + 143, + 48, + 128, + 0, + 211, + 1, + 0, + 2, + 128, + 0, + 182, + 66, + 143, + 48, + 128, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 420, + 10, + 1, + 133, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 147, + 79, + 101, + 128, + 0, + 239, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 147, + 255, + 101, + 128, + 0, + 223, + 1, + 0, + 2, + 128, + 0, + 182, + 147, + 255, + 101, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 421, + 10, + 1, + 133, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 5, + 124, + 165, + 128, + 0, + 245, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 5, + 255, + 165, + 128, + 0, + 225, + 1, + 0, + 2, + 128, + 0, + 182, + 5, + 255, + 165, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 422, + 10, + 1, + 133, + 'Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 189, + 88, + 52, + 128, + 0, + 239, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 184, + 255, + 52, + 128, + 0, + 219, + 1, + 0, + 2, + 128, + 0, + 182, + 184, + 255, + 52, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 423, + 10, + 1, + 133, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 134, + 73, + 62, + 128, + 0, + 227, + 134, + 255, + 62, + 128, + 0, + 242, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 134, + 2, + 219, + 128, + 23, + 255, + 134, + 255, + 62, + 128, + 0, + 207, + 134, + 255, + 62, + 128, + 0, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 424, + 10, + 1, + 133, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 20, + 137, + 181, + 82, + 36, + 253, + 20, + 255, + 231, + 52, + 49, + 253, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 20, + 255, + 231, + 52, + 49, + 253, + 1, + 0, + 2, + 128, + 0, + 182, + 20, + 255, + 231, + 52, + 49, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 425, + 10, + 1, + 133, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 66, + 47, + 33, + 128, + 0, + 236, + 66, + 143, + 33, + 128, + 0, + 192, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 48, + 80, + 164, + 128, + 1, + 239, + 66, + 143, + 33, + 128, + 0, + 192, + 66, + 143, + 33, + 128, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 426, + 10, + 1, + 133, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 134, + 43, + 109, + 128, + 0, + 254, + 134, + 163, + 109, + 94, + 13, + 244, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 134, + 2, + 219, + 128, + 23, + 255, + 134, + 163, + 109, + 94, + 13, + 244, + 134, + 163, + 109, + 94, + 13, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 427, + 10, + 1, + 133, + 'Limelight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 83, + 108, + 202, + 128, + 0, + 250, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 73, + 205, + 202, + 128, + 6, + 239, + 1, + 0, + 2, + 128, + 0, + 182, + 73, + 205, + 202, + 128, + 6, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 428, + 10, + 1, + 133, + 'Platinum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 26, + 28, + 135, + 128, + 0, + 249, + 60, + 56, + 135, + 128, + 0, + 233, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 1, + 0, + 2, + 128, + 0, + 182, + 60, + 56, + 135, + 128, + 0, + 233, + 60, + 56, + 135, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 429, + 10, + 1, + 133, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 9, + 7, + 1, + 128, + 0, + 232, + 0, + 255, + 248, + 128, + 24, + 253, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 0, + 255, + 248, + 128, + 24, + 253, + 9, + 7, + 1, + 128, + 0, + 188, + 9, + 7, + 1, + 128, + 0, + 188, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 430, + 10, + 1, + 133, + 'Sahara Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 27, + 88, + 96, + 128, + 0, + 249, + 27, + 161, + 96, + 128, + 0, + 254, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 1, + 0, + 2, + 128, + 0, + 182, + 27, + 161, + 96, + 128, + 0, + 231, + 27, + 161, + 96, + 128, + 0, + 231, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 431, + 10, + 1, + 133, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 13, + 83, + 122, + 128, + 0, + 237, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 13, + 176, + 122, + 128, + 0, + 229, + 1, + 0, + 2, + 128, + 0, + 182, + 13, + 176, + 122, + 128, + 0, + 229, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 432, + 10, + 1, + 133, + 'Walnut', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 20, + 66, + 58, + 128, + 0, + 236, + 20, + 137, + 58, + 128, + 0, + 239, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 48, + 80, + 164, + 128, + 1, + 239, + 20, + 137, + 58, + 128, + 0, + 211, + 20, + 137, + 58, + 128, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 433, + 10, + 1, + 133, + 'Rally Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 0, + 139, + 248, + 128, + 24, + 253, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 0, + 255, + 248, + 97, + 13, + 253, + 1, + 0, + 2, + 128, + 0, + 182, + 0, + 255, + 248, + 97, + 13, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 434, + 10, + 1, + 133, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 30, + 47, + 255, + 87, + 45, + 255, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 30, + 47, + 255, + 87, + 45, + 255, + 1, + 0, + 2, + 128, + 0, + 182, + 30, + 47, + 255, + 87, + 45, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 435, + 10, + 1, + 133, + 'Sunfire Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 38, + 141, + 255, + 128, + 9, + 255, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 32, + 219, + 255, + 88, + 44, + 255, + 1, + 0, + 2, + 128, + 0, + 182, + 32, + 219, + 255, + 88, + 44, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 436, + 10, + 1, + 133, + 'Yellow Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69runtin', + 32, + 87, + 210, + 128, + 35, + 227, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 32, + 189, + 210, + 128, + 35, + 249, + 1, + 0, + 2, + 128, + 0, + 182, + 32, + 189, + 210, + 128, + 35, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 437, + 10, + 1, + 134, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 9, + 255, + 255, + 92, + 44, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 438, + 10, + 1, + 134, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 47, + 163, + 165, + 128, + 1, + 250, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 439, + 10, + 1, + 134, + 'Jamaica Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 148, + 203, + 101, + 141, + 0, + 229, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 440, + 10, + 1, + 134, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 138, + 163, + 73, + 128, + 0, + 235, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 441, + 10, + 1, + 134, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 156, + 208, + 189, + 128, + 0, + 253, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 442, + 10, + 1, + 134, + 'Citron Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 49, + 97, + 139, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 443, + 10, + 1, + 134, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 142, + 126, + 112, + 128, + 0, + 240, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 444, + 10, + 1, + 134, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 96, + 176, + 48, + 148, + 0, + 203, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 445, + 10, + 1, + 134, + 'Sassy Grass Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 90, + 235, + 255, + 128, + 16, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 446, + 10, + 1, + 134, + 'Tor-Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 255, + 133, + 15, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 447, + 10, + 1, + 134, + 'Burnt Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 13, + 210, + 146, + 128, + 0, + 248, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 448, + 10, + 1, + 134, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 27, + 45, + 120, + 101, + 16, + 254, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 449, + 10, + 1, + 134, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 82, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 450, + 10, + 1, + 134, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 19, + 163, + 75, + 128, + 0, + 220, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 451, + 10, + 1, + 134, + 'In-Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 222, + 255, + 74, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 452, + 10, + 1, + 134, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 1, + 215, + 48, + 128, + 7, + 255, + 1, + 215, + 48, + 128, + 0, + 245, + 1, + 215, + 48, + 128, + 0, + 233, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 128, + 3, + 255, + 97, + 45, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 453, + 10, + 1, + 134, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 33, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 454, + 10, + 1, + 134, + 'Citron Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 28, + 172, + 255, + 116, + 27, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 455, + 10, + 1, + 134, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70vcutin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 7, + 7, + 0, + 128, + 0, + 178, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 456, + 10, + 1, + 135, + 'Tahitian Walnut', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 19, + 62, + 84, + 128, + 0, + 239, + 19, + 177, + 47, + 143, + 0, + 194, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 19, + 177, + 47, + 143, + 0, + 194, + 19, + 177, + 47, + 143, + 0, + 194, + 19, + 177, + 47, + 143, + 0, + 194, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 457, + 10, + 1, + 135, + 'Amber Sherwood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 58, + 35, + 77, + 128, + 0, + 233, + 122, + 5, + 184, + 128, + 0, + 246, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 58, + 147, + 77, + 151, + 0, + 205, + 20, + 7, + 6, + 128, + 0, + 165, + 58, + 147, + 77, + 151, + 0, + 205, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 458, + 10, + 1, + 135, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 50, + 41, + 135, + 128, + 0, + 240, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 45, + 147, + 135, + 135, + 0, + 232, + 20, + 7, + 6, + 128, + 0, + 165, + 45, + 147, + 135, + 135, + 0, + 232, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 459, + 10, + 1, + 135, + 'Bahama Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 28, + 60, + 208, + 128, + 0, + 249, + 122, + 5, + 184, + 128, + 0, + 246, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 26, + 233, + 208, + 128, + 0, + 239, + 20, + 7, + 6, + 128, + 0, + 165, + 26, + 233, + 208, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 460, + 10, + 1, + 135, + 'Rallye Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 0, + 97, + 255, + 128, + 0, + 244, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 0, + 255, + 255, + 128, + 0, + 245, + 20, + 7, + 6, + 128, + 0, + 165, + 0, + 255, + 255, + 128, + 0, + 245, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 461, + 10, + 1, + 135, + 'In Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 197, + 50, + 87, + 128, + 0, + 236, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 186, + 177, + 87, + 156, + 0, + 203, + 20, + 7, + 6, + 128, + 0, + 165, + 186, + 177, + 87, + 156, + 0, + 203, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 462, + 10, + 1, + 135, + 'Avocado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 80, + 35, + 24, + 128, + 0, + 218, + 70, + 192, + 24, + 103, + 0, + 186, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 70, + 192, + 24, + 103, + 0, + 186, + 70, + 192, + 24, + 103, + 0, + 186, + 70, + 192, + 24, + 103, + 0, + 186, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 463, + 10, + 1, + 135, + 'True Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 147, + 48, + 109, + 143, + 0, + 222, + 142, + 255, + 109, + 143, + 0, + 212, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 142, + 255, + 109, + 143, + 0, + 212, + 142, + 255, + 109, + 143, + 0, + 212, + 142, + 255, + 109, + 143, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 464, + 10, + 1, + 135, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 40, + 19, + 255, + 88, + 36, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 40, + 19, + 255, + 88, + 36, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 40, + 19, + 255, + 88, + 36, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 465, + 10, + 1, + 135, + 'Coral Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 131, + 62, + 124, + 146, + 0, + 229, + 131, + 214, + 57, + 143, + 0, + 192, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 131, + 214, + 57, + 143, + 0, + 192, + 131, + 214, + 57, + 143, + 0, + 192, + 131, + 214, + 57, + 143, + 0, + 192, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 466, + 10, + 1, + 135, + 'Sandpebble Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 27, + 35, + 108, + 128, + 0, + 246, + 24, + 118, + 176, + 133, + 0, + 240, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 24, + 118, + 176, + 133, + 0, + 240, + 24, + 118, + 176, + 133, + 0, + 240, + 24, + 118, + 176, + 133, + 0, + 240, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 467, + 10, + 1, + 135, + 'Aztec Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 27, + 82, + 160, + 128, + 0, + 254, + 23, + 215, + 160, + 128, + 0, + 252, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 23, + 215, + 160, + 128, + 0, + 252, + 23, + 215, + 160, + 128, + 0, + 252, + 23, + 215, + 160, + 128, + 0, + 252, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 468, + 10, + 1, + 135, + 'Winchester Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 136, + 24, + 202, + 116, + 9, + 255, + 136, + 24, + 202, + 116, + 5, + 229, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 136, + 24, + 202, + 116, + 5, + 229, + 20, + 7, + 6, + 128, + 0, + 165, + 136, + 24, + 202, + 116, + 5, + 229, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 469, + 10, + 1, + 135, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 14, + 69, + 255, + 97, + 19, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 18, + 255, + 255, + 94, + 28, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 18, + 255, + 255, + 94, + 28, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 470, + 10, + 1, + 135, + 'Burnished Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 254, + 48, + 79, + 128, + 0, + 233, + 254, + 252, + 79, + 148, + 0, + 212, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 254, + 252, + 79, + 148, + 0, + 212, + 254, + 252, + 79, + 148, + 0, + 212, + 254, + 252, + 79, + 148, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 471, + 10, + 1, + 135, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 33, + 131, + 255, + 118, + 19, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 33, + 255, + 255, + 118, + 26, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 33, + 255, + 255, + 118, + 26, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 472, + 10, + 1, + 135, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 37, + 10, + 1, + 73, + 1, + 239, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 37, + 10, + 1, + 69, + 1, + 194, + 37, + 10, + 1, + 69, + 1, + 194, + 37, + 10, + 1, + 69, + 1, + 194, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 473, + 10, + 1, + 135, + 'Autumn Bronze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71dustin', + 14, + 82, + 79, + 144, + 0, + 220, + 14, + 252, + 79, + 144, + 0, + 212, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 14, + 252, + 79, + 144, + 0, + 212, + 14, + 252, + 79, + 144, + 0, + 212, + 14, + 252, + 79, + 144, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 474, + 10, + 4, + 101, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '32forfla', + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 179, + 230, + 240, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 475, + 10, + 5, + 101, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '32forsca', + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 1, + 255, + 168, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 476, + 10, + 6, + 101, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '32fordec', + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 28, + 196, + 245, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 477, + 10, + 7, + 101, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '32forrus', + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 91, + 48, + 143, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 478, + 10, + 3, + 102, + 'Cop', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 99999999, + '40forcop', + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 479, + 10, + 4, + 102, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '40forfla', + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 1, + 186, + 255, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 480, + 10, + 5, + 102, + 'Runnin'' Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '40forsca', + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 196, + 184, + 224, + 128, + 0, + 255, + 0, + 'Dane Anderson', + 'I spent seven weeks on this, getting it just right for the ''40 Coupe. I hope you enjoy it.' + ), + ( + 481, + 10, + 6, + 102, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '40fordec', + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 1, + 255, + 237, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 482, + 10, + 7, + 102, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '40forrus', + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 38, + 112, + 92, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 483, + 10, + 4, + 103, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '53forfla', + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 252, + 161, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 484, + 10, + 5, + 103, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '53forsca', + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 131, + 255, + 178, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 485, + 10, + 6, + 103, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '53fordec', + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 152, + 173, + 196, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 486, + 10, + 7, + 103, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '53forrus', + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 18, + 82, + 120, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 487, + 10, + 4, + 104, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57faifla', + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 196, + 212, + 212, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 488, + 10, + 5, + 104, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57faisca', + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 126, + 255, + 207, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 489, + 10, + 6, + 104, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57faidec', + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 255, + 245, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 490, + 10, + 7, + 104, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57fairus', + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 23, + 48, + 224, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 491, + 10, + 4, + 105, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57ranfla', + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 182, + 184, + 204, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 492, + 10, + 5, + 105, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57ransca', + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 242, + 235, + 184, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 493, + 10, + 6, + 105, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57randec', + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 148, + 227, + 237, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 494, + 10, + 7, + 105, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57ranrus', + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 47, + 107, + 99, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 495, + 10, + 4, + 106, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57tbifla', + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 222, + 196, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 496, + 10, + 5, + 106, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57tbisca', + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 188, + 255, + 222, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 497, + 10, + 6, + 106, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57tbidec', + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 159, + 201, + 219, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 498, + 10, + 7, + 106, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57tbirus', + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 147, + 107, + 130, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 499, + 10, + 4, + 107, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63tbifla', + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 111, + 92, + 189, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 500, + 10, + 5, + 107, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63tbisca', + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 191, + 199, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 501, + 10, + 6, + 107, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63tbidec', + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 0, + 240, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 502, + 10, + 7, + 107, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '63tbirus', + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 23, + 143, + 156, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 503, + 10, + 4, + 108, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64stafla', + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 174, + 255, + 186, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 504, + 10, + 5, + 108, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64stasca', + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + 255, + 125, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 505, + 10, + 6, + 108, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64stadec', + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 506, + 10, + 7, + 108, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '64starus', + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 135, + 143, + 105, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 507, + 10, + 3, + 109, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 99999999, + '64galcop', + 32, + 178, + 156, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 508, + 10, + 4, + 109, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64galfla', + 113, + 235, + 140, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 509, + 10, + 5, + 109, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64galsca', + 162, + 112, + 232, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 510, + 10, + 6, + 109, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64galdec', + 2, + 222, + 237, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 511, + 10, + 7, + 109, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '64galrus', + 0, + 145, + 135, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 512, + 10, + 4, + 110, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69torfla', + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 185, + 173, + 163, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 513, + 10, + 5, + 110, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69torsca', + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 230, + 150, + 204, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 514, + 10, + 6, + 110, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69tordec', + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 170, + 163, + 196, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 515, + 10, + 7, + 110, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69torrus', + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 19, + 92, + 66, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 516, + 10, + 4, + 111, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb3fla', + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 170, + 150, + 117, + 128, + 0, + 255, + 0, + 'Matt Kovacs', + 'This paint job ain''t for punks!' + ), + ( + 517, + 10, + 5, + 111, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb3sca', + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 158, + 69, + 194, + 128, + 0, + 255, + 0, + 'Jeff Grantz', + 'You''ll smoke ''em with this paint job.' + ), + ( + 518, + 10, + 6, + 111, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb3dec', + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 3, + 201, + 235, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 519, + 10, + 7, + 111, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70mb3rus', + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 50, + 69, + 171, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 520, + 10, + 4, + 112, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '49merfla', + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 183, + 196, + 138, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 521, + 10, + 5, + 112, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '49mersca', + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 254, + 235, + 209, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 522, + 10, + 6, + 112, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '49merdec', + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 125, + 64, + 166, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 523, + 10, + 7, + 112, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '49merrus', + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 160, + 143, + 156, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 524, + 10, + 4, + 113, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57chefla', + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 177, + 255, + 161, + 128, + 0, + 255, + 0, + 'Pete Hammond', + 'Your Bel Air will be the will ring everyone''s bell when they see these flames coming!' + ), + ( + 525, + 10, + 5, + 113, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57chesca', + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 128, + 255, + 161, + 128, + 0, + 255, + 0, + 'Joe Kasinski', + 'Does the Big K know his stuff? This is AWESOME!' + ), + ( + 526, + 10, + 6, + 113, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57chedec', + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 164, + 130, + 153, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 527, + 10, + 7, + 113, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57cherus', + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 61, + 82, + 71, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 528, + 10, + 4, + 114, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57vetfla', + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 26, + 255, + 245, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 529, + 10, + 5, + 114, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57vetsca', + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 155, + 79, + 199, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 530, + 10, + 6, + 114, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57vetdec', + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 149, + 255, + 212, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 531, + 10, + 7, + 114, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57vetrus', + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 5, + 176, + 97, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 532, + 10, + 4, + 115, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57nomfla', + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 249, + 255, + 158, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 533, + 10, + 5, + 115, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57nomsca', + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 74, + 255, + 107, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 534, + 10, + 6, + 115, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '57nomdec', + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 171, + 207, + 145, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 535, + 10, + 7, + 115, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57nomrus', + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 7, + 153, + 140, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 536, + 10, + 3, + 116, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 99999999, + '64impcop', + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 537, + 10, + 4, + 116, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64impfla', + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 195, + 237, + 227, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 538, + 10, + 5, + 116, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64impsca', + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 32, + 255, + 227, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 539, + 10, + 6, + 116, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64impdec', + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 142, + 107, + 186, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 540, + 10, + 7, + 116, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '64imprus', + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 30, + 36, + 130, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 541, + 10, + 4, + 117, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63vetfla', + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 186, + 240, + 242, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 542, + 10, + 5, + 117, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63vetsca', + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 169, + 194, + 209, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 543, + 10, + 6, + 117, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '63vetdec', + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 217, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 544, + 10, + 7, + 117, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '63vetrus', + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 0, + 145, + 135, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 545, + 10, + 4, + 118, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '58impfla', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 546, + 10, + 5, + 118, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '58impsca', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + NULL, + NULL + ), + ( + 547, + 10, + 6, + 118, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '58impdec', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 548, + 10, + 7, + 118, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '58imprus', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 549, + 10, + 4, + 119, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67chefla', + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 166, + 255, + 240, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 550, + 10, + 5, + 119, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67chesca', + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 186, + 219, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 551, + 10, + 6, + 119, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67chedec', + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 255, + 240, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 552, + 10, + 7, + 119, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67cherus', + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 33, + 18, + 189, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 553, + 10, + 4, + 120, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67camfla', + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 0, + 31, + 128, + 0, + 255, + 0, + 'Steve Hayes', + 'Sssssssmokin!' + ), + ( + 554, + 10, + 5, + 120, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67camsca', + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 23, + 186, + 227, + 128, + 0, + 255, + 0, + 'Grant Weyman', + 'This is THE Big One! Check it out!' + ), + ( + 555, + 10, + 6, + 120, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67camdec', + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 0, + 247, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 556, + 10, + 7, + 120, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67camrus', + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 29, + 181, + 128, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 557, + 10, + 4, + 121, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70chefla', + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 106, + 252, + 89, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 558, + 10, + 5, + 121, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70chesca', + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 134, + 230, + 166, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 559, + 10, + 6, + 121, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70chedec', + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 169, + 166, + 181, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 560, + 10, + 7, + 121, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70cherus', + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 191, + 54, + 110, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 561, + 10, + 4, + 122, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70camfla', + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 205, + 237, + 122, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 562, + 10, + 5, + 122, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70camsca', + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + 0, + 36, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 563, + 10, + 6, + 122, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70camdec', + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 12, + 255, + 133, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 564, + 10, + 7, + 122, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70camrus', + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 135, + 201, + 133, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 565, + 10, + 4, + 123, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70novfla', + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 36, + 255, + 201, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 566, + 10, + 5, + 123, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70novsca', + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 176, + 255, + 117, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 567, + 10, + 6, + 123, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70novdec', + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 0, + 0, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 568, + 10, + 7, + 123, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70novrus', + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 97, + 255, + 84, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 569, + 10, + 4, + 124, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '47cadfla', + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 0, + 51, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 570, + 10, + 5, + 124, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '47cadsca', + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 108, + 255, + 222, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 571, + 10, + 6, + 124, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '47caddec', + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 219, + 227, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 572, + 10, + 7, + 124, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '47cadrus', + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 23, + 31, + 143, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 573, + 10, + 4, + 125, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '59cadfla', + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 243, + 166, + 252, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 574, + 10, + 5, + 125, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '59cadsca', + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 26, + 59, + 166, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 575, + 10, + 6, + 125, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '59caddec', + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 78, + 115, + 199, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 576, + 10, + 7, + 125, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '59cadrus', + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 28, + 97, + 186, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 577, + 10, + 4, + 126, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69oldfla', + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 155, + 178, + 209, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 578, + 10, + 5, + 126, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69oldsca', + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 579, + 10, + 6, + 126, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69olddec', + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 580, + 10, + 7, + 126, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69oldrus', + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 153, + 97, + 143, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 581, + 10, + 3, + 127, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 99999999, + '55cencop', + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 169, + 207, + 74, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 582, + 10, + 4, + 127, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '55cenfla', + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 38, + 252, + 255, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 583, + 10, + 5, + 127, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '55censca', + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 183, + 240, + 242, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 584, + 10, + 6, + 127, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '55cendec', + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 1, + 242, + 242, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 585, + 10, + 7, + 127, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '55cenrus', + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 120, + 140, + 107, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 586, + 10, + 4, + 128, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66gtofla', + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 192, + 252, + 196, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 587, + 10, + 5, + 128, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66gtosca', + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 190, + 255, + 232, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 588, + 10, + 6, + 128, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66gtodec', + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 162, + 252, + 196, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 589, + 10, + 7, + 128, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '66gtorus', + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 49, + 10, + 189, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 590, + 10, + 4, + 129, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtofla', + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 591, + 10, + 5, + 129, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtosca', + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 28, + 227, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 592, + 10, + 6, + 129, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtodec', + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 0, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 593, + 10, + 7, + 129, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69gtorus', + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 82, + 64, + 61, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 594, + 10, + 4, + 130, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73trafla', + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 181, + 255, + 245, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 595, + 10, + 5, + 130, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73trasca', + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 149, + 255, + 242, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 596, + 10, + 6, + 130, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73tradec', + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 255, + 201, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 597, + 10, + 7, + 130, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '73trarus', + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 118, + 201, + 107, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 598, + 10, + 4, + 131, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69amcfla', + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 155, + 18, + 242, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 599, + 10, + 5, + 131, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69amcsca', + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 33, + 242, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 600, + 10, + 6, + 131, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69amcdec', + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 169, + 117, + 79, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 601, + 10, + 7, + 131, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69amcrus', + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 31, + 140, + 138, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 602, + 10, + 4, + 132, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69chafla', + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 161, + 135, + 33, + 128, + 0, + 255, + 0, + 'Eric Saakian', + 'These flames should frighten away the posers. Real racers ONLY!' + ), + ( + 603, + 10, + 5, + 132, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69chasca', + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 27, + 245, + 250, + 128, + 0, + 255, + 0, + 'Mike Wojtas', + 'You don''t get it much better than this. Rock on!' + ), + ( + 604, + 10, + 6, + 132, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69chadec', + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 159, + 186, + 194, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 605, + 10, + 7, + 132, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69charus', + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 137, + 76, + 112, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 606, + 10, + 3, + 133, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 99999999, + '69runcop', + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 32, + 178, + 156, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 607, + 10, + 4, + 133, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69runfla', + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 16, + 173, + 230, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 608, + 10, + 5, + 133, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69runsca', + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 33, + 232, + 252, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 609, + 10, + 6, + 133, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69rundec', + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 132, + 255, + 222, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 610, + 10, + 7, + 133, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69runrus', + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 97, + 117, + 150, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 611, + 10, + 4, + 134, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70cudfla', + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 20, + 250, + 227, + 128, + 0, + 255, + 0, + 'Bret Gootch', + 'All that power under the hood''s got only one way to go!' + ), + ( + 612, + 10, + 5, + 134, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70cudsca', + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 40, + 214, + 255, + 128, + 0, + 255, + 0, + 'Paul O''Tuna', + 'I made it this way ''cuz I''m swe-e-e-eet!' + ), + ( + 613, + 10, + 6, + 134, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70cuddec', + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 6, + 252, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 614, + 10, + 7, + 134, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70cudrus', + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 141, + 107, + 107, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 615, + 10, + 4, + 135, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71dusfla', + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 158, + 209, + 153, + 128, + 0, + 255, + 0, + 'Mac Emerson', + 'This paint job rocks!' + ), + ( + 616, + 10, + 5, + 135, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71dussca', + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 101, + 191, + 148, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 617, + 10, + 6, + 135, + 'Decal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71dusdec', + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 169, + 189, + 255, + 128, + 0, + 255, + 0, + 'Corporate sponsor', + 'You''ve sold out to The Man.' + ), + ( + 618, + 10, + 7, + 135, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '71dusrus', + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 29, + 181, + 135, + 128, + 0, + 255, + 1, + 'Oxidation', + 'This process mimics the natural process of paint damage due to weather.' + ), + ( + 619, + 10, + 9, + 106, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '57tbibad', + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + 3, + 76, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 620, + 10, + 9, + 117, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '63vetbad', + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 31, + 107, + 143, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 621, + 10, + 9, + 120, + 'The Grim Reaper', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '67cambad', + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 154, + 36, + 227, + 128, + 0, + 255, + 0, + 'Jim Fink', + 'This time, you better fear the Reaper...' + ), + ( + 622, + 10, + 9, + 134, + 'American Pie', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '70cudbad', + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 163, + 181, + 252, + 128, + 0, + 255, + 0, + 'Mongo Pena', + 'Mongo like!' + ), + ( + 623, + 10, + 9, + 111, + 'My Lady', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '70stabad', + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 188, + 105, + 255, + 128, + 0, + 255, + 0, + 'Carl Lipowitz', + 'NOBODY touches My Lady!' + ), + ( + 624, + 10, + 9, + 130, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '73trabad', + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 37, + 255, + 237, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 625, + 10, + 8, + 125, + 'taxi 1', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '59cadtr1', + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 25, + 184, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 626, + 10, + 8, + 125, + 'taxi 2', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '59cadtr2', + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 84, + 255, + 122, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 627, + 10, + 9, + 113, + 'Meat Wagon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '57chebad', + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 186, + 178, + 110, + 128, + 0, + 255, + 0, + 'Art Siebold', + 'When the Meat Wagon comes to town, better get out of it''s way!' + ), + ( + 628, + 10, + 9, + 109, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '64galbad', + 200, + 130, + 191, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + NULL, + NULL, + NULL, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 629, + 10, + 9, + 123, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '70novbad', + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 18, + 255, + 150, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 630, + 10, + 9, + 121, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '70chebad', + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 22, + 209, + 255, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 631, + 10, + 1, + 207, + 'Navajo Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 27, + 80, + 255, + 128, + 0, + 255, + NULL, + 80, + 255, + 128, + 0, + 255, + 27, + 80, + NULL, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 632, + 10, + 1, + 207, + 'Vintage Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 246, + 242, + 84, + 128, + 5, + 253, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 246, + 242, + 84, + 128, + 0, + 210, + NULL, + 242, + 84, + 128, + 0, + 210, + 246, + 242, + NULL, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 633, + 10, + 1, + 207, + 'Chantilly Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 225, + 40, + 20, + 6, + 128, + 0, + 176, + 35, + 66, + 86, + 128, + 3, + 225, + NULL, + 0, + 1, + 128, + 0, + 168, + 35, + 66, + NULL, + 128, + 3, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 634, + 10, + 1, + 207, + 'Pagoda Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 120, + 100, + 49, + 128, + 5, + 250, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 255, + 128, + 15, + 255, + 124, + 254, + 77, + 128, + 13, + 225, + NULL, + 254, + 77, + 128, + 13, + 225, + 124, + 254, + NULL, + 128, + 13, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 635, + 10, + 1, + 207, + 'Skylight Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 132, + 126, + 255, + 128, + 35, + 225, + 131, + 11, + 255, + 128, + 15, + 255, + 131, + 11, + 255, + 128, + 15, + 255, + 131, + 11, + 255, + 128, + 15, + 255, + 40, + 20, + 255, + 128, + 15, + 255, + 132, + 126, + 255, + 128, + 35, + 235, + NULL, + 126, + 255, + 128, + 35, + 235, + 132, + 126, + NULL, + 128, + 35, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 636, + 10, + 1, + 207, + 'Dynasty Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 120, + 100, + 49, + 128, + 0, + 222, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 35, + 66, + 86, + 128, + 3, + 254, + 40, + 20, + 6, + 128, + 0, + 176, + 120, + 100, + 49, + 128, + 0, + 222, + NULL, + 0, + 1, + 128, + 0, + 168, + 120, + 100, + NULL, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 637, + 10, + 1, + 207, + 'Prairie Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 255, + 128, + 15, + 255, + 19, + 163, + 113, + 128, + 0, + 255, + NULL, + 30, + 255, + 128, + 38, + 255, + 19, + 163, + NULL, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 638, + 10, + 1, + 207, + 'Phoenician Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 32, + 215, + 255, + 128, + 45, + 249, + NULL, + 215, + 255, + 128, + 45, + 249, + 32, + 215, + NULL, + 128, + 45, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 639, + 10, + 1, + 207, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 40, + 20, + 255, + 128, + 0, + 180, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 128, + 0, + 1, + 128, + 0, + 181, + NULL, + 0, + 1, + 128, + 0, + 181, + 128, + 0, + NULL, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 640, + 10, + 1, + 207, + 'Guardsman Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 148, + 218, + 49, + 128, + 0, + 210, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 148, + 218, + 49, + 128, + 0, + 210, + NULL, + 218, + 49, + 128, + 0, + 210, + 148, + 218, + NULL, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 641, + 10, + 1, + 207, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 28, + 50, + 255, + 128, + 38, + 255, + NULL, + 0, + 1, + 128, + 0, + 168, + 28, + 50, + NULL, + 128, + 38, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 642, + 10, + 1, + 207, + 'Silver Smoke Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 121, + 36, + 85, + 128, + 3, + 254, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 121, + 36, + 85, + 128, + 0, + 222, + NULL, + 36, + 85, + 128, + 0, + 222, + 121, + 36, + NULL, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 643, + 10, + 1, + 207, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 66, + 86, + 128, + 3, + 252, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 216, + 40, + 20, + 6, + 128, + 0, + 176, + 2, + 255, + 255, + 128, + 0, + 250, + NULL, + 255, + 255, + 128, + 0, + 250, + 2, + 255, + NULL, + 128, + 0, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 720, + 10, + 3, + 226, + 'Judge GTO Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '69judtin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'System', + 'This skin attached for testing purposes.' + ), + ( + 721, + 10, + 1, + 140, + 'Bolero Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 255, + 255, + 128, + 0, + 250, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 52, + 255, + 128, + 0, + 249, + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 'Factory', + 'Copied from 67 Camaro base paint scheme for temporary use.' + ), + ( + 722, + 10, + 1, + 140, + 'Deepwater Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 148, + 255, + 54, + 152, + 0, + 202, + 148, + 255, + 54, + 152, + 0, + 202, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 170, + 33, + 54, + 128, + 0, + 231, + 148, + 255, + 54, + 152, + 0, + 202, + 0, + 'factory', + 'Copied from 67 Camaro base paint scheme for temporary use.' + ), + ( + 723, + 10, + 1, + 142, + 'Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 0, + 'factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 724, + 10, + 1, + 142, + 'Medium Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 0, + 'factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 726, + 1, + 3, + 142, + 'Boss 429', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70mb4tin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Unknown creator. Skin attached for testing purposes.' + ), + ( + 727, + 10, + 1, + 210, + 'Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 151, + 135, + 158, + 128, + 16, + 232, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 728, + 10, + 1, + 218, + 'Bolero Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 30, + 10, + 5, + 128, + 0, + 214, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 0, + 255, + 255, + 111, + 16, + 255, + 0, + 83, + 255, + 128, + 15, + 255, + 0, + 255, + 255, + 111, + 16, + 255, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 729, + 10, + 1, + 218, + 'Deep Water Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 30, + 10, + 126, + 128, + 0, + 248, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 148, + 255, + 54, + 135, + 0, + 194, + 170, + 33, + 54, + 128, + 0, + 239, + 148, + 255, + 54, + 135, + 0, + 194, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 730, + 10, + 1, + 219, + 'Provincial White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 16, + 255, + 255, + 128, + 22, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 0, + 'system', + 'Skin taken from 67 Camaro (base) for temporary use.' + ), + ( + 731, + 10, + 1, + 219, + 'Bolero Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 255, + 255, + 128, + 0, + 250, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 52, + 255, + 128, + 0, + 168, + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 'system', + 'Skin taken from 67 Camaro (base) for temporary use.' + ), + ( + 732, + 10, + 3, + 219, + 'RS Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '67rsctin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 733, + 10, + 1, + 220, + 'Provincial White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 16, + 255, + 255, + 128, + 22, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 0, + 'system', + 'Skin taken from 67 Camaro (base) for temporary use.' + ), + ( + 734, + 10, + 3, + 220, + 'Z-28 Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '67Z28tin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 735, + 10, + 1, + 154, + 'Big Bad Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 84, + 70, + 255, + 128, + 0, + 249, + 66, + 255, + 255, + 128, + 0, + 253, + 66, + 255, + 255, + 128, + 0, + 253, + 26, + 56, + 94, + 128, + 0, + 255, + 26, + 56, + 94, + 128, + 0, + 250, + 66, + 255, + 255, + 128, + 0, + 253, + 7, + 7, + 14, + 128, + 0, + 171, + 66, + 255, + 255, + 128, + 0, + 253, + 0, + 'system', + 'Skin taken from 69 AMX (base). Should be a correct skin for this car.' + ), + ( + 736, + 10, + 1, + 154, + 'Big Bad Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 16, + 113, + 255, + 128, + 23, + 255, + 16, + 254, + 255, + 113, + 23, + 255, + 16, + 254, + 255, + 113, + 23, + 255, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 16, + 254, + 255, + 113, + 23, + 255, + 7, + 7, + 14, + 128, + 0, + 171, + 16, + 254, + 255, + 113, + 23, + 255, + 0, + 'system', + 'Skin taken from 69 AMX (base). Should be a correct skin for this car.' + ), + ( + 737, + 10, + 1, + 154, + 'Big Bad Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69amctin', + 170, + 101, + 205, + 128, + 0, + 255, + 158, + 255, + 205, + 128, + 0, + 245, + 158, + 255, + 205, + 128, + 0, + 245, + 10, + 10, + 10, + 128, + 0, + 246, + 10, + 10, + 10, + 128, + 0, + 246, + 158, + 255, + 205, + 128, + 0, + 171, + 7, + 7, + 14, + 128, + 0, + 171, + 158, + 255, + 205, + 128, + 0, + 245, + 0, + 'system', + 'Skin taken from 69 AMX (base). Should be a correct skin for this car.' + ), + ( + 738, + 10, + 1, + 157, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 134, + 43, + 109, + 128, + 0, + 254, + 134, + 163, + 109, + 94, + 13, + 244, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 134, + 2, + 219, + 128, + 23, + 255, + 134, + 163, + 109, + 94, + 13, + 244, + 134, + 163, + 109, + 94, + 13, + 244, + 0, + 'system', + 'Skin taken from 69 Road Runner (base) for temporary use.' + ), + ( + 739, + 10, + 1, + 157, + 'Platinum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 26, + 28, + 135, + 128, + 0, + 249, + 60, + 56, + 135, + 128, + 0, + 233, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 1, + 0, + 2, + 128, + 0, + 182, + 60, + 56, + 135, + 128, + 0, + 233, + 60, + 56, + 135, + 128, + 0, + 233, + 0, + 'system', + 'Skin taken from 69 Road Runner (base) for temporary use.' + ), + ( + 740, + 10, + 1, + 210, + 'Medium Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 45, + 102, + 112, + 128, + 16, + 211, + 0, + 'system', + 'As per 70 Mustang CSV.' + ), + ( + 743, + 10, + 2, + 211, + 'GT Cobra Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '69gtttin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin applied for testing purposes.' + ), + ( + 744, + 10, + 1, + 212, + 'Medium Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 102, + 112, + 128, + 16, + 211, + 0, + 'system', + 'As per 70 Mach 1 CSV.' + ), + ( + 745, + 10, + 3, + 212, + 'Mach 1 Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70mactin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 746, + 10, + 1, + 213, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 47, + 163, + 165, + 128, + 1, + 250, + 0, + 'system', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 748, + 10, + 1, + 214, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 47, + 163, + 165, + 128, + 1, + 250, + 0, + 'system', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 749, + 10, + 3, + 214, + '440 Cuda Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70h44tin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 750, + 10, + 1, + 215, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 47, + 163, + 165, + 128, + 1, + 250, + 0, + 'system', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 751, + 10, + 3, + 215, + 'AAR Cuda Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70aartin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 752, + 10, + 1, + 216, + 'Tahitian Walnut', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 19, + 62, + 84, + 128, + 0, + 239, + 19, + 177, + 47, + 143, + 0, + 194, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 19, + 177, + 47, + 143, + 0, + 194, + 19, + 177, + 47, + 143, + 0, + 194, + 19, + 177, + 47, + 143, + 0, + 194, + 0, + 'System', + 'As per 71 Duster CSV.' + ), + ( + 753, + 10, + 3, + 216, + '340 Duster Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '71wedtin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'Skin attached for testing purposes.' + ), + ( + 754, + 10, + 1, + 222, + 'Cranberry Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 6, + 56, + 91, + 128, + 0, + 245, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 6, + 254, + 91, + 128, + 0, + 233, + 6, + 254, + 91, + 128, + 0, + 233, + 6, + 254, + 91, + 128, + 0, + 233, + 0, + 'system', + 'As per 70 El Camino CSV.' + ), + ( + 755, + 10, + 3, + 222, + 'El Camino SS Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70ssetin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'This skin assigned for testing purposes.' + ), + ( + 756, + 10, + 1, + 223, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 137, + 57, + 52, + 128, + 0, + 237, + 137, + 255, + 52, + 128, + 0, + 192, + 137, + 255, + 52, + 128, + 0, + 192, + 0, + 'system', + 'As per 70 Nova CSV.' + ), + ( + 757, + 10, + 3, + 223, + 'Nova SS Paint', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 300, + '70ssntin', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 0, + 'system', + 'This skin assigned for testing purposes.' + ), + ( + 758, + 10, + 1, + 227, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 128, + 0, + 255, + 128, + 1, + 254, + 20, + 7, + 14, + 128, + 0, + 227, + 128, + 0, + 255, + 128, + 14, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 128, + 0, + 255, + 128, + 14, + 255, + 0, + 'System', + 'As per 70 Firebird CSV' + ), + ( + 760, + 10, + 1, + 226, + 'Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 17, + 122, + 255, + 128, + 15, + 253, + 24, + 255, + 255, + 128, + 15, + 253, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 28, + 255, + 255, + 128, + 15, + 253, + 37, + 255, + 255, + 128, + 17, + 255, + 15, + 255, + 255, + 128, + 23, + 253, + 0, + 'system', + 'As per 69 GTO CSV, but this color does not appear in the reference material for the car.' + ), + ( + 761, + 10, + 1, + 224, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69oldtin', + 2, + 150, + 255, + 128, + 0, + 236, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 28, + 26, + 164, + 128, + 10, + 255, + 30, + 10, + 1, + 128, + 0, + 194, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 0, + 'system', + 'This color is not in the 60 Olds 442 CSV and can not be verified. It is also not a referenced factory color.' + ), + ( + 763, + 10, + 1, + 221, + 'Monza Red/White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 47, + 255, + 128, + 0, + 255, + 142, + 3, + 255, + 128, + 36, + 255, + 1, + 255, + 255, + 139, + 0, + 249, + 0, + 'system', + 'This skin taken from 70 Chevelle (base) for testing purposes.' + ), + ( + 764, + 10, + 1, + 217, + 'Ember Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 5, + 254, + 146, + 128, + 0, + 231, + 24, + 71, + 202, + 152, + 3, + 214, + 5, + 254, + 146, + 128, + 0, + 219, + 24, + 71, + 202, + 152, + 3, + 231, + 1, + 71, + 255, + 128, + 0, + 249, + 24, + 71, + 202, + 152, + 3, + 231, + 5, + 254, + 146, + 128, + 0, + 219, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 765, + 10, + 1, + 216, + 'Amber Sherwood', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 58, + 35, + 77, + 128, + 0, + 233, + 122, + 5, + 184, + 128, + 0, + 246, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 58, + 147, + 77, + 151, + 0, + 205, + 20, + 7, + 6, + 128, + 0, + 165, + 58, + 147, + 77, + 151, + 0, + 205, + 0, + 'system', + 'As per 71 Duster CSV.' + ), + ( + 766, + 10, + 1, + 215, + 'Lime Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 58, + 35, + 77, + 128, + 0, + 233, + 122, + 5, + 184, + 128, + 0, + 246, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 58, + 147, + 77, + 151, + 0, + 205, + 20, + 7, + 6, + 128, + 0, + 165, + 58, + 147, + 77, + 151, + 0, + 205, + 0, + 'system', + 'Skin taken from 71 Duster (base) for testing purposes. Should be removed at conclusion of Beta or sooner.' + ), + ( + 767, + 10, + 1, + 214, + 'Lime Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 58, + 35, + 77, + 128, + 0, + 233, + 122, + 5, + 184, + 128, + 0, + 246, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 58, + 147, + 77, + 151, + 0, + 205, + 20, + 7, + 6, + 128, + 0, + 165, + 58, + 147, + 77, + 151, + 0, + 205, + 0, + 'system', + 'Skin taken from 71 Duster (base) for testing purposes. Should be removed at conclusion of Beta or sooner.' + ), + ( + 768, + 10, + 1, + 213, + 'Jamaica Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 148, + 203, + 101, + 141, + 0, + 229, + 0, + 'system', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 769, + 10, + 1, + 212, + 'Candyapple Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 6, + 194, + 143, + 128, + 6, + 240, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 6, + 194, + 143, + 128, + 6, + 240, + 35, + 64, + 158, + 128, + 16, + 244, + 6, + 164, + 143, + 128, + 6, + 240, + 0, + 'system', + 'As per 70 Mach 1 CSV.' + ), + ( + 775, + 10, + 1, + 207, + 'Stock Color 5', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 44, + 178, + 128, + 3, + 252, + 35, + 108, + 64, + 116, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 44, + 178, + 128, + 128, + 223, + 168, + 173, + 78, + 124, + 18, + 228, + 168, + 173, + 78, + 124, + 18, + 228, + 168, + 173, + 78, + 124, + 18, + 228, + 0, + NULL, + NULL + ), + ( + 776, + 10, + 1, + 207, + 'Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '66cobtin', + 35, + 44, + 178, + 128, + 3, + 252, + 35, + 108, + 64, + 116, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 1, + 1, + 2, + 1, + 0, + 254, + 1, + 253, + 131, + 121, + 40, + 214, + 1, + 253, + 131, + 121, + 40, + 214, + 1, + 253, + 131, + 121, + 40, + 214, + 0, + NULL, + NULL + ), + ( + 777, + 10, + 1, + 207, + 'Sebring Silver / White Stripes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '66cobtin', + 35, + 44, + 178, + 128, + 3, + 252, + 35, + 108, + 64, + 116, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 44, + 178, + 128, + 128, + 223, + 3, + 1, + 255, + 127, + 2, + 250, + 148, + 66, + 126, + 152, + 67, + 199, + 148, + 66, + 126, + 152, + 67, + 199, + 0, + NULL, + NULL + ), + ( + 778, + 10, + 1, + 207, + 'Red / White Stripes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '66cobtin', + 35, + 44, + 178, + 128, + 3, + 252, + 35, + 108, + 64, + 116, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 1, + 1, + 2, + 1, + 0, + 254, + 3, + 1, + 255, + 127, + 2, + 250, + 1, + 253, + 131, + 121, + 40, + 214, + 1, + 253, + 131, + 121, + 40, + 214, + 0, + NULL, + NULL + ), + ( + 779, + 10, + 1, + 207, + 'Blue / White Stripes', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '66cobtin', + 35, + 44, + 178, + 128, + 3, + 252, + 35, + 108, + 64, + 116, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 66, + 86, + 128, + 3, + 252, + 35, + 44, + 178, + 128, + 128, + 223, + 3, + 1, + 255, + 127, + 2, + 250, + 168, + 173, + 78, + 124, + 18, + 228, + 168, + 173, + 78, + 124, + 18, + 228, + 0, + NULL, + NULL + ), + ( + 780, + 10, + 4, + 207, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66cobfla', + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 247, + 232, + 128, + 0, + 255, + 0, + 'Ryan Blinsky', + NULL + ), + ( + 781, + 10, + 5, + 207, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66cobsca', + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 22, + 255, + 224, + 128, + 0, + 255, + 0, + 'Ryan Blinsky', + NULL + ), + ( + 782, + 10, + 6, + 207, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '66cobdec', + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 18, + 247, + 207, + 128, + 0, + 255, + 0, + 'Ryan Blinsky', + NULL + ), + ( + 783, + 10, + 7, + 207, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '66cobrus', + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 162, + 87, + 92, + 128, + 0, + 255, + 0, + 'Ryan Blinsky', + NULL + ), + ( + 784, + 10, + 4, + 217, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64ssifla', + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 129, + 255, + 163, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 785, + 10, + 7, + 217, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '64ssirus', + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 250, + 28, + 84, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 786, + 10, + 5, + 217, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64ssisca', + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 235, + 153, + 227, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 787, + 10, + 6, + 217, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '64ssidec', + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 35, + 204, + 247, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 788, + 10, + 4, + 218, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67cssfla', + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 250, + 219, + 184, + 128, + 0, + 255, + 0, + 'Blinksy', + NULL + ), + ( + 789, + 10, + 5, + 218, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67csssca', + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 190, + 214, + 189, + 128, + 0, + 255, + 0, + 'Blinksy', + NULL + ), + ( + 790, + 10, + 7, + 218, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67cssrus', + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 10, + 89, + 84, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 791, + 10, + 6, + 218, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67cssdec', + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 55, + 230, + 166, + 128, + 0, + 255, + 0, + 'Blinksy', + NULL + ), + ( + 792, + 10, + 4, + 219, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67rscfla', + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 152, + 178, + 201, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 793, + 10, + 6, + 219, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67rscdec', + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 114, + 168, + 209, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 794, + 10, + 5, + 219, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67rscsca', + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 35, + 176, + 219, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 795, + 10, + 7, + 219, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67rscrus', + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 4, + 102, + 115, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 796, + 10, + 4, + 140, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67sscfla', + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 146, + 168, + 194, + 128, + 0, + 255, + 0, + 'Blinksy', + NULL + ), + ( + 797, + 10, + 5, + 140, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67sscsca', + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 105, + 138, + 199, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 798, + 10, + 6, + 140, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67sscdec', + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 163, + 92, + 207, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 799, + 10, + 7, + 140, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67sscrus', + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 6, + 84, + 102, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 800, + 10, + 4, + 220, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67z28fla', + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 16, + 184, + 214, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 801, + 10, + 5, + 220, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67z28sca', + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 246, + 171, + 186, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 802, + 10, + 6, + 220, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '67z28dec', + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 112, + 92, + 178, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 803, + 10, + 7, + 220, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '67z28rus', + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 10, + 33, + 99, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 804, + 10, + 4, + 154, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69bigfla', + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 46, + 184, + 199, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 805, + 10, + 5, + 154, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69bigsca', + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 200, + 166, + 232, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 806, + 10, + 6, + 154, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69bigdec', + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 201, + 20, + 199, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 807, + 10, + 7, + 154, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69bigrus', + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 246, + 23, + 105, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 808, + 10, + 4, + 224, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69w30fla', + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 25, + 255, + 192, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 809, + 10, + 5, + 224, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69w30sca', + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 157, + 120, + 209, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 810, + 10, + 6, + 224, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69w30dec', + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 170, + 255, + 191, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 811, + 10, + 7, + 224, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69w30rus', + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 112, + 140, + 69, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 812, + 10, + 4, + 211, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gttfla', + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 155, + 232, + 255, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 813, + 10, + 5, + 211, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gttsca', + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 251, + 255, + 212, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 814, + 10, + 6, + 211, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gttdec', + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 105, + 107, + 158, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 815, + 10, + 7, + 211, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69gttrus', + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 212, + 13, + 112, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 816, + 10, + 4, + 225, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69hurfla', + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 197, + 128, + 212, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 817, + 10, + 5, + 225, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69hursca', + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 41, + 143, + 204, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 818, + 10, + 6, + 225, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69hurdec', + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 174, + 43, + 59, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 819, + 10, + 7, + 225, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69hurrus', + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 11, + 69, + 69, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 820, + 10, + 4, + 226, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69judfla', + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 186, + 117, + 222, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 821, + 10, + 5, + 226, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69judsca', + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 35, + 201, + 224, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 822, + 10, + 6, + 226, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69juddec', + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 246, + 181, + 222, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 823, + 10, + 7, + 226, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69judrus', + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 5, + 107, + 84, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 824, + 10, + 4, + 222, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssefla', + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 163, + 232, + 150, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 825, + 10, + 5, + 222, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssesca', + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 10, + 235, + 194, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 826, + 10, + 6, + 222, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssedec', + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 80, + 168, + 125, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 827, + 10, + 7, + 222, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70sserus', + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 8, + 150, + 92, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 828, + 10, + 4, + 223, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssnfla', + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 140, + 212, + 150, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 829, + 10, + 5, + 223, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssnsca', + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 33, + 201, + 184, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 830, + 10, + 6, + 223, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70ssndec', + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 179, + 184, + 201, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 831, + 10, + 7, + 223, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70ssnrus', + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 249, + 43, + 87, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 832, + 10, + 4, + 221, + 'Blaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70cssfla', + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 227, + 161, + 199, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 833, + 10, + 5, + 221, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70csssca', + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 139, + 247, + 189, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 834, + 10, + 6, + 221, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70cssdec', + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 28, + 186, + 214, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 835, + 10, + 7, + 221, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70cssrus', + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 2, + 97, + 92, + 128, + 0, + 255, + 0, + 'Blinsky', + NULL + ), + ( + 836, + 10, + 4, + 212, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70macfla', + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 250, + 255, + 112, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 837, + 10, + 5, + 212, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70macsca', + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 186, + 74, + 209, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 838, + 10, + 6, + 212, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70macdec', + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 0, + 227, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 839, + 10, + 7, + 212, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70macrus', + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 125, + 125, + 143, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 840, + 10, + 4, + 214, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70h44fla', + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 187, + 217, + 214, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 841, + 10, + 5, + 214, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70h44sca', + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 37, + 117, + 217, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 842, + 10, + 6, + 214, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70h44dec', + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 154, + 184, + 189, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 843, + 10, + 7, + 214, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70h44rus', + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 91, + 31, + 171, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 844, + 10, + 4, + 215, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70aarfla', + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 139, + 31, + 184, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 845, + 10, + 5, + 215, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70aarsca', + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 185, + 145, + 214, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 846, + 10, + 6, + 215, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70aardec', + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 26, + 201, + 224, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 847, + 10, + 7, + 215, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70aarrus', + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 60, + 74, + 178, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 848, + 10, + 4, + 213, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70hemfla', + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 23, + 43, + 222, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 849, + 10, + 5, + 213, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70hemsca', + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 162, + 69, + 189, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 850, + 10, + 6, + 213, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70hemdec', + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 28, + 209, + 227, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 851, + 10, + 7, + 213, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70hemrus', + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 145, + 76, + 184, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 852, + 10, + 4, + 216, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71wedfla', + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 9, + 181, + 219, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 853, + 10, + 5, + 216, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71wedsca', + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 119, + 196, + 150, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 854, + 10, + 7, + 216, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '71wedrus', + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 154, + 135, + 102, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 855, + 10, + 4, + 228, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73firfla', + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 255, + 135, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 856, + 10, + 5, + 228, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73firsca', + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 33, + 250, + 230, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 857, + 10, + 6, + 228, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73firdec', + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 0, + 214, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 858, + 10, + 7, + 228, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '73firrus', + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 27, + 71, + 89, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 859, + 10, + 4, + 227, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73forfla', + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 33, + 163, + 240, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 860, + 10, + 5, + 227, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73forsca', + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 174, + 194, + 138, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 861, + 10, + 6, + 227, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '73fordec', + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 131, + 71, + 46, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 862, + 10, + 7, + 227, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '73forrus', + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 172, + 51, + 107, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 863, + 10, + 4, + 142, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb4fla', + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 33, + 102, + 242, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 864, + 10, + 5, + 142, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb4sca', + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 130, + 219, + 153, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 865, + 10, + 6, + 142, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70mb4dec', + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 17, + 201, + 194, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 866, + 10, + 7, + 142, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70mb4rus', + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 26, + 122, + 122, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 867, + 10, + 6, + 216, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '71weddec', + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 32, + 252, + 150, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 868, + 10, + 9, + 132, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '69chabad', + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 6, + 255, + 219, + 128, + 0, + 255, + 0, + 'Unknown', + NULL + ), + ( + 869, + 10, + 4, + 210, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70stafla', + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 42, + 71, + 189, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 870, + 10, + 5, + 210, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70stasca', + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 166, + 79, + 255, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 871, + 10, + 6, + 210, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '70stadec', + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 13, + 255, + 237, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 872, + 10, + 7, + 210, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '70starus', + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 153, + 79, + 158, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 873, + 10, + 4, + 157, + 'Flames', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtxfla', + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 142, + 255, + 140, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 874, + 10, + 5, + 157, + 'Scallops', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtxsca', + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 43, + 255, + 138, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 875, + 10, + 6, + 157, + 'Decals', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 5000, + '69gtxdec', + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 0, + 204, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 876, + 10, + 7, + 157, + 'Rust Bucket', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '69gtxrus', + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 132, + 232, + 84, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 877, + 10, + 7, + 127, + 'Spray Paint Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '55cenru2', + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 18, + 140, + 77, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 878, + 10, + 7, + 127, + 'Graffiti', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '55cenru3', + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 142, + 219, + 94, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 879, + 10, + 7, + 104, + 'Spray Paint Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57fairu2', + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 145, + 97, + 105, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 880, + 10, + 7, + 104, + 'Graffiti', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57fairu3', + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 59, + 102, + 102, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 881, + 10, + 9, + 207, + 'Bad-Ass', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10000, + '66cobbad', + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 172, + 46, + 120, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 882, + 10, + 7, + 113, + 'Spray Paint Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57cheru2', + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 0, + 41, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 883, + 10, + 7, + 113, + 'Graffiti', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57cheru3', + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 132, + 102, + 196, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 884, + 10, + 7, + 105, + 'Spray Paint Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57ranru2', + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 140, + 31, + 145, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 885, + 10, + 7, + 105, + 'Graffiti', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57ranru3', + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 195, + 105, + 125, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 886, + 10, + 1, + 225, + 'Hurst Olds', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69hurtin', + 31, + 143, + 204, + 129, + 40, + 255, + 31, + 143, + 204, + 129, + 40, + 255, + 31, + 143, + 204, + 129, + 40, + 255, + 31, + 143, + 204, + 129, + 40, + 255, + 27, + 173, + 209, + 97, + 126, + 124, + 27, + 173, + 209, + 127, + 126, + 124, + 32, + 16, + 252, + 190, + 48, + 248, + 32, + 16, + 252, + 190, + 48, + 248, + 0, + 'Medina', + NULL + ), + ( + 888, + 10, + 1, + 212, + 'Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 128, + 0, + 0, + 128, + 0, + 128, + 151, + 135, + 158, + 128, + 16, + 232, + 0, + 'system', + 'As per 70 Mach 1 CSV.' + ), + ( + 889, + 10, + 1, + 211, + 'Red/Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 1, + 41, + 163, + 128, + 7, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 1, + 254, + 163, + 128, + 13, + 241, + 1, + 254, + 163, + 128, + 13, + 241, + 1, + 254, + 163, + 128, + 13, + 241, + 1, + 254, + 163, + 128, + 13, + 241, + 0, + 'system', + NULL + ), + ( + 890, + 10, + 7, + 115, + 'Spray Paint Special', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57nomru2', + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 18, + 207, + 115, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 891, + 10, + 7, + 115, + 'Graffiti', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 50, + '57nomru3', + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 231, + 27, + 87, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 893, + 10, + 1, + 228, + 'Admiralty Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 150, + 53, + 54, + 152, + 0, + 210, + 20, + 7, + 14, + 128, + 0, + 227, + 150, + 255, + 54, + 152, + 0, + 172, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 150, + 255, + 54, + 152, + 0, + 172, + 0, + 'Factory', + 'As per 70 Firebird CSV' + ), + ( + 894, + 10, + 1, + 211, + 'Lime Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 40, + 50, + 146, + 128, + 0, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 40, + 131, + 146, + 128, + 0, + 233, + 128, + 0, + 2, + 128, + 0, + 173, + 48, + 122, + 146, + 128, + 0, + 255, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 895, + 10, + 1, + 211, + 'Winter Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 142, + 62, + 73, + 128, + 0, + 237, + 142, + 13, + 73, + 128, + 0, + 252, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 142, + 252, + 73, + 128, + 0, + 227, + 142, + 54, + 73, + 128, + 0, + 237, + 142, + 13, + 73, + 128, + 0, + 252, + 142, + 252, + 73, + 128, + 0, + 227, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 896, + 10, + 1, + 211, + 'Royal Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 250, + 65, + 52, + 128, + 0, + 235, + 32, + 177, + 128, + 128, + 0, + 236, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 250, + 237, + 52, + 128, + 0, + 206, + 26, + 237, + 52, + 128, + 0, + 222, + 32, + 177, + 128, + 128, + 0, + 236, + 250, + 237, + 52, + 128, + 0, + 206, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 897, + 10, + 1, + 211, + 'Acapulco Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 159, + 61, + 53, + 128, + 0, + 233, + 159, + 249, + 53, + 128, + 0, + 208, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 898, + 10, + 1, + 211, + 'New Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 37, + 43, + 152, + 128, + 22, + 220, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 899, + 10, + 1, + 211, + 'Silver Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 124, + 57, + 56, + 128, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 114, + 54, + 124, + 128, + 0, + 219, + 128, + 0, + 2, + 128, + 0, + 173, + 109, + 54, + 124, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 900, + 10, + 1, + 211, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 128, + 0, + 255, + 128, + 1, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 44, + 45, + 255, + 128, + 45, + 222, + 128, + 0, + 2, + 128, + 0, + 173, + 44, + 45, + 255, + 128, + 66, + 222, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 901, + 10, + 1, + 211, + 'Black Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 30, + 10, + 1, + 128, + 2, + 224, + 30, + 10, + 1, + 128, + 2, + 155, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 30, + 10, + 1, + 128, + 2, + 155, + 1, + 254, + 163, + 128, + 13, + 220, + 1, + 254, + 163, + 128, + 13, + 241, + 30, + 10, + 1, + 128, + 2, + 155, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 902, + 10, + 1, + 211, + 'Gulfstream Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 130, + 32, + 47, + 163, + 0, + 214, + 130, + 172, + 47, + 163, + 0, + 195, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 903, + 10, + 1, + 211, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 1, + 41, + 163, + 128, + 7, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 1, + 254, + 163, + 128, + 1, + 224, + 128, + 0, + 2, + 128, + 0, + 173, + 1, + 254, + 163, + 128, + 13, + 241, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 904, + 10, + 1, + 211, + 'Indian Fire Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 6, + 60, + 135, + 165, + 11, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 905, + 10, + 1, + 211, + 'Dresden Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 128, + 24, + 212, + 128, + 2, + 250, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 133, + 116, + 212, + 128, + 13, + 227, + 133, + 116, + 212, + 128, + 13, + 207, + 128, + 0, + 2, + 128, + 0, + 173, + 133, + 116, + 116, + 128, + 13, + 227, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 906, + 10, + 1, + 211, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 30, + 30, + 255, + 118, + 27, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 30, + 254, + 255, + 118, + 45, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 30, + 254, + 255, + 118, + 45, + 252, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 907, + 10, + 1, + 211, + 'Pastel Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 128, + 18, + 164, + 128, + 6, + 253, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 908, + 10, + 1, + 211, + 'Presidential Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 148, + 69, + 103, + 186, + 2, + 210, + 148, + 255, + 103, + 186, + 2, + 185, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 909, + 10, + 1, + 211, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 19, + 32, + 88, + 155, + 0, + 223, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 19, + 90, + 88, + 155, + 0, + 202, + 128, + 0, + 2, + 128, + 0, + 173, + 19, + 90, + 88, + 155, + 0, + 211, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 910, + 10, + 1, + 211, + 'Brittany Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtttin', + 138, + 50, + 92, + 137, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 163, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 163, + 138, + 219, + 92, + 137, + 0, + 214, + 128, + 0, + 2, + 128, + 0, + 163, + 138, + 219, + 92, + 137, + 0, + 224, + 0, + 'Factory', + 'As per 69 Torino CSV' + ), + ( + 911, + 10, + 1, + 218, + 'Capri Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 3, + 250, + 64, + 128, + 0, + 252, + 30, + 10, + 5, + 128, + 0, + 245, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 43, + 26, + 255, + 100, + 48, + 255, + 43, + 26, + 255, + 100, + 35, + 255, + 43, + 26, + 255, + 100, + 48, + 255, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 912, + 10, + 1, + 218, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 20, + 5, + 1, + 99, + 0, + 206, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 99, + 0, + 206, + 20, + 5, + 1, + 128, + 0, + 229, + 20, + 5, + 1, + 99, + 0, + 206, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 913, + 10, + 1, + 218, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 3, + 250, + 64, + 128, + 0, + 227, + 22, + 104, + 94, + 128, + 0, + 252, + 22, + 104, + 94, + 128, + 0, + 252, + 22, + 104, + 94, + 128, + 0, + 252, + 30, + 15, + 2, + 128, + 0, + 214, + 3, + 250, + 64, + 128, + 0, + 227, + 248, + 45, + 64, + 128, + 0, + 244, + 3, + 250, + 64, + 128, + 0, + 227, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 914, + 10, + 1, + 218, + 'Sierra Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 30, + 10, + 126, + 128, + 0, + 248, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 130, + 5, + 124, + 122, + 1, + 232, + 28, + 14, + 124, + 122, + 1, + 253, + 28, + 14, + 124, + 122, + 1, + 232, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 915, + 10, + 1, + 218, + 'Nantucket Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 30, + 10, + 126, + 128, + 36, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 154, + 30, + 15, + 255, + 128, + 60, + 255, + 142, + 117, + 141, + 128, + 0, + 235, + 142, + 44, + 171, + 128, + 0, + 253, + 142, + 117, + 141, + 128, + 0, + 235, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 916, + 10, + 1, + 218, + 'Butternut Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 35, + 134, + 255, + 128, + 43, + 255, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 255, + 128, + 60, + 255, + 35, + 134, + 255, + 128, + 43, + 255, + 35, + 82, + 255, + 128, + 7, + 255, + 35, + 134, + 255, + 128, + 43, + 255, + 0, + 'System', + 'As per 67 Chevelle CSV' + ), + ( + 917, + 10, + 1, + 218, + 'Ermine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 128, + 5, + 255, + 83, + 58, + 255, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 128, + 5, + 255, + 83, + 58, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 83, + 58, + 255, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 918, + 10, + 1, + 218, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 79, + 64, + 91, + 118, + 0, + 249, + 28, + 104, + 94, + 128, + 20, + 252, + 28, + 104, + 94, + 128, + 20, + 252, + 28, + 104, + 94, + 128, + 20, + 252, + 30, + 15, + 2, + 128, + 0, + 214, + 79, + 64, + 91, + 118, + 0, + 249, + 79, + 36, + 91, + 118, + 15, + 254, + 79, + 64, + 91, + 118, + 0, + 249, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 919, + 10, + 1, + 218, + 'Granada Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 30, + 10, + 5, + 128, + 0, + 214, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 31, + 135, + 142, + 128, + 2, + 249, + 31, + 22, + 142, + 128, + 11, + 254, + 31, + 135, + 142, + 128, + 2, + 249, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 920, + 10, + 1, + 218, + 'Tahoe Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 128, + 254, + 43, + 143, + 0, + 197, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 128, + 254, + 43, + 143, + 0, + 197, + 128, + 56, + 137, + 143, + 0, + 224, + 128, + 254, + 43, + 143, + 0, + 197, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 921, + 10, + 1, + 218, + 'Royal Plum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 224, + 253, + 32, + 114, + 0, + 198, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 224, + 253, + 32, + 114, + 0, + 198, + 224, + 53, + 32, + 114, + 0, + 252, + 224, + 253, + 32, + 114, + 0, + 198, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 922, + 10, + 1, + 218, + 'Marina Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 133, + 171, + 108, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 133, + 171, + 108, + 128, + 0, + 237, + 133, + 28, + 108, + 128, + 10, + 255, + 133, + 171, + 108, + 128, + 0, + 237, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 923, + 10, + 1, + 218, + 'Emerald Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67csstin', + 128, + 0, + 255, + 128, + 33, + 255, + 30, + 15, + 255, + 78, + 60, + 255, + 30, + 15, + 255, + 78, + 60, + 255, + 30, + 15, + 255, + 78, + 60, + 255, + 30, + 15, + 255, + 128, + 60, + 255, + 124, + 171, + 193, + 134, + 0, + 246, + 124, + 53, + 193, + 134, + 9, + 255, + 124, + 171, + 193, + 134, + 0, + 246, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 924, + 10, + 1, + 218, + 'White/Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 128, + 5, + 255, + 83, + 58, + 255, + 30, + 15, + 2, + 128, + 0, + 214, + 30, + 15, + 2, + 128, + 0, + 214, + 30, + 15, + 2, + 128, + 0, + 214, + 30, + 15, + 2, + 128, + 0, + 214, + 142, + 131, + 141, + 128, + 16, + 235, + 128, + 5, + 255, + 83, + 58, + 255, + 128, + 5, + 255, + 83, + 58, + 255, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 925, + 10, + 1, + 218, + 'Medium Blue/White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 30, + 10, + 126, + 128, + 36, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 30, + 15, + 255, + 128, + 60, + 255, + 128, + 5, + 255, + 83, + 58, + 255, + 142, + 131, + 141, + 128, + 16, + 235, + 142, + 131, + 141, + 128, + 16, + 235, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 926, + 10, + 1, + 218, + 'Medium Blue/Dark Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 30, + 10, + 126, + 128, + 36, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 32, + 26, + 207, + 108, + 52, + 254, + 30, + 15, + 255, + 128, + 60, + 255, + 148, + 255, + 54, + 135, + 0, + 194, + 142, + 131, + 141, + 128, + 16, + 235, + 142, + 131, + 141, + 128, + 16, + 235, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 927, + 10, + 1, + 218, + 'Dark Blue/Medium Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 30, + 10, + 126, + 128, + 0, + 248, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 237, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 142, + 131, + 141, + 128, + 16, + 235, + 148, + 255, + 54, + 135, + 0, + 194, + 148, + 255, + 54, + 135, + 0, + 194, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 928, + 10, + 1, + 218, + 'Gold/Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 30, + 10, + 5, + 128, + 0, + 214, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 43, + 26, + 255, + 100, + 48, + 255, + 31, + 22, + 142, + 128, + 11, + 254, + 31, + 135, + 142, + 128, + 2, + 249, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 929, + 10, + 1, + 218, + 'Dark Turquoise/White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 128, + 254, + 43, + 143, + 0, + 197, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 240, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 128, + 5, + 255, + 83, + 58, + 255, + 128, + 56, + 137, + 143, + 0, + 224, + 128, + 254, + 43, + 143, + 0, + 197, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 930, + 10, + 1, + 218, + 'Fawn/Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '67csstin', + 30, + 10, + 126, + 128, + 0, + 248, + 30, + 10, + 5, + 128, + 0, + 250, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 43, + 26, + 255, + 100, + 48, + 255, + 28, + 14, + 124, + 122, + 1, + 232, + 28, + 14, + 124, + 122, + 1, + 232, + 0, + 'system', + 'As per 67 Chevelle CSV' + ), + ( + 931, + 10, + 1, + 101, + 'Lime Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 40, + 50, + 146, + 128, + 0, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 40, + 0, + 0, + 135, + 0, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 48, + 122, + 146, + 128, + 0, + 255, + 0, + NULL, + NULL + ), + ( + 932, + 10, + 1, + 101, + 'Winter Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 142, + 62, + 73, + 128, + 0, + 237, + 142, + 13, + 73, + 128, + 0, + 252, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 142, + 252, + 73, + 128, + 0, + 227, + 32, + 177, + 128, + 128, + 8, + 249, + 142, + 13, + 73, + 128, + 0, + 252, + 142, + 252, + 73, + 128, + 0, + 227, + 0, + NULL, + NULL + ), + ( + 933, + 10, + 1, + 101, + 'Royal Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 250, + 65, + 52, + 128, + 0, + 235, + 32, + 177, + 128, + 128, + 0, + 236, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 250, + 237, + 52, + 128, + 0, + 206, + 32, + 177, + 128, + 128, + 8, + 249, + 32, + 177, + 128, + 128, + 0, + 236, + 250, + 237, + 52, + 128, + 0, + 206, + 0, + NULL, + NULL + ), + ( + 934, + 10, + 1, + 101, + 'Acapulco Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 159, + 61, + 53, + 128, + 0, + 233, + 159, + 249, + 53, + 128, + 0, + 208, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 159, + 249, + 53, + 128, + 0, + 208, + 142, + 0, + 252, + 128, + 34, + 237, + 159, + 249, + 53, + 128, + 0, + 208, + 159, + 249, + 53, + 128, + 0, + 208, + 0, + NULL, + NULL + ), + ( + 935, + 10, + 1, + 101, + 'New Lime', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 37, + 43, + 152, + 128, + 22, + 220, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 37, + 142, + 152, + 128, + 22, + 220, + 40, + 0, + 0, + 135, + 0, + 212, + 37, + 142, + 152, + 128, + 22, + 220, + 37, + 142, + 152, + 128, + 22, + 220, + 0, + NULL, + NULL + ), + ( + 936, + 10, + 1, + 101, + 'Silver Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 124, + 57, + 56, + 128, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 0, + 2, + 128, + 0, + 173, + 109, + 54, + 124, + 128, + 0, + 231, + 0, + NULL, + NULL + ), + ( + 937, + 10, + 1, + 101, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 0, + 255, + 128, + 1, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 253, + 234, + 191, + 128, + 48, + 229, + 128, + 0, + 2, + 128, + 0, + 173, + 44, + 45, + 255, + 128, + 66, + 222, + 0, + NULL, + NULL + ), + ( + 938, + 10, + 1, + 101, + 'Black Jade', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 30, + 10, + 1, + 128, + 2, + 224, + 30, + 10, + 1, + 128, + 2, + 155, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 30, + 10, + 1, + 128, + 2, + 155, + 253, + 234, + 191, + 128, + 48, + 229, + 1, + 254, + 163, + 128, + 13, + 241, + 30, + 10, + 1, + 128, + 2, + 155, + 0, + NULL, + NULL + ), + ( + 939, + 10, + 1, + 101, + 'Gulfstream Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 130, + 32, + 47, + 163, + 0, + 214, + 130, + 172, + 47, + 163, + 0, + 195, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 130, + 172, + 47, + 163, + 0, + 195, + 32, + 177, + 128, + 128, + 8, + 249, + 130, + 172, + 47, + 163, + 0, + 195, + 130, + 172, + 47, + 163, + 0, + 195, + 0, + NULL, + NULL + ), + ( + 940, + 10, + 1, + 101, + 'Rangoon Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 1, + 41, + 163, + 128, + 7, + 241, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 0, + 2, + 128, + 0, + 173, + 1, + 254, + 163, + 128, + 13, + 241, + 0, + NULL, + NULL + ), + ( + 941, + 10, + 1, + 101, + 'Indian Fire Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 6, + 60, + 135, + 165, + 11, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 6, + 255, + 135, + 165, + 11, + 203, + 32, + 177, + 128, + 128, + 8, + 249, + 6, + 255, + 135, + 165, + 11, + 203, + 6, + 255, + 135, + 165, + 11, + 203, + 0, + NULL, + NULL + ), + ( + 942, + 10, + 1, + 101, + 'Dresden Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 24, + 212, + 128, + 2, + 250, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 133, + 116, + 212, + 128, + 13, + 227, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 0, + 2, + 128, + 0, + 173, + 133, + 116, + 212, + 128, + 13, + 227, + 0, + NULL, + NULL + ), + ( + 943, + 10, + 1, + 101, + 'Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 30, + 30, + 255, + 118, + 27, + 252, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 40, + 0, + 0, + 135, + 0, + 212, + 128, + 0, + 2, + 128, + 0, + 173, + 30, + 254, + 255, + 118, + 45, + 252, + 0, + NULL, + NULL + ), + ( + 944, + 10, + 1, + 101, + 'Pastel Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 128, + 18, + 164, + 128, + 6, + 253, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 33, + 164, + 128, + 0, + 248, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 33, + 164, + 128, + 0, + 248, + 128, + 33, + 164, + 128, + 0, + 248, + 0, + NULL, + NULL + ), + ( + 945, + 10, + 1, + 101, + 'Presidential Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 148, + 69, + 103, + 186, + 2, + 210, + 148, + 255, + 103, + 186, + 2, + 185, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 148, + 255, + 103, + 186, + 2, + 185, + 253, + 234, + 191, + 128, + 48, + 229, + 148, + 255, + 103, + 186, + 2, + 185, + 148, + 255, + 103, + 186, + 2, + 185, + 0, + NULL, + NULL + ), + ( + 946, + 10, + 1, + 101, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 19, + 32, + 88, + 155, + 0, + 223, + 128, + 0, + 2, + 128, + 0, + 173, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 173, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 0, + 2, + 128, + 0, + 173, + 19, + 90, + 88, + 155, + 0, + 211, + 0, + NULL, + NULL + ), + ( + 947, + 10, + 1, + 101, + 'Brittany Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '32fortin', + 138, + 50, + 92, + 137, + 0, + 240, + 128, + 0, + 2, + 128, + 0, + 163, + 128, + 0, + 54, + 128, + 0, + 242, + 128, + 0, + 49, + 128, + 0, + 242, + 128, + 0, + 2, + 128, + 0, + 163, + 142, + 0, + 252, + 128, + 34, + 237, + 128, + 0, + 2, + 128, + 0, + 163, + 138, + 219, + 92, + 137, + 0, + 224, + 0, + NULL, + NULL + ), + ( + 965, + 10, + 1, + 228, + 'Florentine Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 250, + 79, + 45, + 128, + 0, + 236, + 26, + 101, + 184, + 128, + 0, + 222, + 252, + 255, + 75, + 128, + 0, + 173, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 252, + 255, + 75, + 128, + 0, + 173, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 966, + 10, + 1, + 228, + 'Sunlight Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 31, + 146, + 255, + 128, + 5, + 255, + 20, + 7, + 14, + 128, + 0, + 227, + 31, + 236, + 255, + 128, + 6, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 31, + 236, + 255, + 128, + 6, + 255, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 967, + 10, + 1, + 228, + 'Brewster Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 107, + 39, + 28, + 128, + 0, + 211, + 26, + 101, + 184, + 128, + 0, + 222, + 107, + 255, + 28, + 138, + 0, + 168, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 107, + 255, + 28, + 138, + 0, + 168, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 968, + 10, + 1, + 228, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 128, + 0, + 75, + 82, + 0, + 242, + 128, + 0, + 1, + 82, + 0, + 206, + 128, + 0, + 1, + 82, + 0, + 156, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 128, + 0, + 1, + 82, + 0, + 156, + 128, + 0, + 1, + 82, + 0, + 156, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 969, + 10, + 1, + 228, + 'Regatta Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 135, + 78, + 77, + 158, + 0, + 218, + 20, + 7, + 14, + 128, + 0, + 227, + 146, + 255, + 109, + 135, + 0, + 214, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 146, + 255, + 109, + 135, + 0, + 214, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 970, + 10, + 1, + 228, + 'Ascot Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 128, + 0, + 195, + 148, + 0, + 232, + 20, + 7, + 14, + 128, + 0, + 227, + 128, + 13, + 122, + 137, + 0, + 220, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 128, + 13, + 122, + 137, + 0, + 220, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 971, + 10, + 1, + 228, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 128, + 0, + 255, + 128, + 1, + 254, + 20, + 7, + 14, + 128, + 0, + 227, + 128, + 0, + 255, + 128, + 14, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 128, + 0, + 255, + 128, + 14, + 255, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 972, + 10, + 1, + 228, + 'Buccaneer Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 6, + 77, + 255, + 128, + 0, + 242, + 20, + 7, + 14, + 128, + 0, + 227, + 1, + 255, + 255, + 128, + 0, + 240, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 1, + 255, + 255, + 128, + 0, + 240, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 973, + 10, + 1, + 228, + 'Golden Olive', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 45, + 33, + 134, + 154, + 0, + 210, + 20, + 7, + 14, + 128, + 0, + 227, + 37, + 165, + 109, + 154, + 0, + 199, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 37, + 165, + 109, + 154, + 0, + 199, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 974, + 10, + 1, + 228, + 'Desert Sand', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 27, + 44, + 156, + 128, + 0, + 254, + 20, + 7, + 14, + 128, + 0, + 227, + 27, + 180, + 156, + 128, + 0, + 248, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 27, + 180, + 156, + 128, + 0, + 248, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 975, + 10, + 1, + 228, + 'Burnished Amber', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73firtin', + 35, + 22, + 61, + 158, + 0, + 208, + 26, + 101, + 184, + 128, + 0, + 222, + 35, + 83, + 61, + 158, + 0, + 181, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 35, + 83, + 61, + 158, + 0, + 181, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 976, + 10, + 1, + 227, + 'Florentine Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 250, + 79, + 45, + 128, + 0, + 236, + 26, + 101, + 184, + 128, + 0, + 222, + 252, + 255, + 75, + 128, + 0, + 173, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 252, + 255, + 75, + 128, + 0, + 173, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 977, + 10, + 1, + 227, + 'Sunlight Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 31, + 146, + 255, + 128, + 5, + 255, + 20, + 7, + 14, + 128, + 0, + 227, + 31, + 236, + 255, + 128, + 6, + 255, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 31, + 236, + 255, + 128, + 6, + 255, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 978, + 10, + 1, + 227, + 'Brewster Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 107, + 39, + 28, + 128, + 0, + 211, + 26, + 101, + 184, + 128, + 0, + 222, + 107, + 255, + 28, + 138, + 0, + 168, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 107, + 255, + 28, + 138, + 0, + 168, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 979, + 10, + 1, + 227, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 128, + 0, + 75, + 82, + 0, + 242, + 128, + 0, + 1, + 82, + 0, + 206, + 128, + 0, + 1, + 82, + 0, + 156, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 128, + 0, + 1, + 82, + 0, + 156, + 128, + 0, + 1, + 82, + 0, + 156, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 980, + 10, + 1, + 227, + 'Regatta Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 135, + 78, + 77, + 158, + 0, + 218, + 20, + 7, + 14, + 128, + 0, + 227, + 146, + 255, + 109, + 135, + 0, + 214, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 146, + 255, + 109, + 135, + 0, + 214, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 981, + 10, + 1, + 227, + 'Ascot Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 128, + 0, + 195, + 148, + 0, + 232, + 20, + 7, + 14, + 128, + 0, + 227, + 128, + 13, + 122, + 137, + 0, + 220, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 128, + 13, + 122, + 137, + 0, + 220, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 982, + 10, + 1, + 227, + 'Buccaneer Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 6, + 77, + 255, + 128, + 0, + 242, + 20, + 7, + 14, + 128, + 0, + 227, + 1, + 255, + 255, + 128, + 0, + 240, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 1, + 255, + 255, + 128, + 0, + 240, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 983, + 10, + 1, + 227, + 'Golden Olive', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 45, + 33, + 134, + 154, + 0, + 210, + 20, + 7, + 14, + 128, + 0, + 227, + 37, + 165, + 109, + 154, + 0, + 199, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 37, + 165, + 109, + 154, + 0, + 199, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 984, + 10, + 1, + 227, + 'Desert Sand', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 27, + 44, + 156, + 128, + 0, + 254, + 20, + 7, + 14, + 128, + 0, + 227, + 27, + 180, + 156, + 128, + 0, + 248, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 215, + 20, + 7, + 14, + 128, + 0, + 158, + 27, + 180, + 156, + 128, + 0, + 248, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 985, + 10, + 1, + 227, + 'Burnished Amber', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 35, + 22, + 61, + 158, + 0, + 208, + 26, + 101, + 184, + 128, + 0, + 222, + 35, + 83, + 61, + 158, + 0, + 181, + 20, + 7, + 9, + 118, + 3, + 241, + 26, + 101, + 184, + 128, + 0, + 214, + 131, + 20, + 168, + 128, + 0, + 215, + 26, + 101, + 184, + 128, + 0, + 214, + 35, + 83, + 61, + 158, + 0, + 181, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 986, + 10, + 1, + 226, + 'Expresso Brown', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 19, + 54, + 52, + 128, + 0, + 208, + 19, + 169, + 52, + 128, + 0, + 193, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 19, + 169, + 52, + 128, + 0, + 193, + 19, + 169, + 52, + 128, + 0, + 193, + 19, + 169, + 52, + 128, + 0, + 193, + 0, + 'system', + 'As per 69 GTO CSV' + ), + ( + 987, + 10, + 1, + 226, + 'Mayfair Maize', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 30, + 79, + 255, + 128, + 7, + 255, + 30, + 151, + 255, + 128, + 7, + 255, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 30, + 151, + 255, + 128, + 7, + 255, + 30, + 151, + 255, + 128, + 7, + 255, + 30, + 151, + 255, + 128, + 7, + 255, + 0, + 'system', + 'As per 69 GTO CSV' + ), + ( + 988, + 10, + 1, + 226, + 'Warwick Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 142, + 129, + 167, + 128, + 6, + 229, + 142, + 142, + 167, + 128, + 6, + 208, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 14, + 128, + 0, + 215, + 30, + 10, + 19, + 128, + 0, + 175, + 142, + 88, + 167, + 128, + 6, + 212, + 142, + 5, + 167, + 128, + 6, + 240, + 142, + 255, + 167, + 128, + 6, + 201, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 989, + 10, + 1, + 226, + 'Burgundy', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 249, + 79, + 61, + 128, + 0, + 229, + 11, + 255, + 255, + 128, + 1, + 233, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 74, + 142, + 128, + 0, + 241, + 23, + 255, + 255, + 128, + 17, + 255, + 37, + 255, + 255, + 128, + 17, + 255, + 249, + 255, + 61, + 128, + 0, + 198, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 990, + 10, + 1, + 226, + 'Liberty Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 144, + 69, + 58, + 128, + 0, + 208, + 142, + 129, + 167, + 128, + 6, + 211, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 142, + 101, + 167, + 128, + 6, + 236, + 142, + 5, + 167, + 128, + 6, + 240, + 144, + 255, + 58, + 128, + 0, + 180, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 991, + 10, + 1, + 226, + 'Matador Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 2, + 69, + 144, + 128, + 0, + 227, + 15, + 255, + 255, + 128, + 17, + 255, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 23, + 255, + 255, + 128, + 17, + 255, + 37, + 255, + 255, + 128, + 17, + 255, + 2, + 255, + 144, + 128, + 0, + 227, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 992, + 10, + 1, + 226, + 'Antique Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 31, + 64, + 182, + 128, + 0, + 239, + 26, + 169, + 182, + 128, + 0, + 232, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 26, + 169, + 182, + 128, + 0, + 232, + 26, + 169, + 182, + 128, + 0, + 232, + 26, + 169, + 182, + 128, + 0, + 232, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 993, + 10, + 1, + 226, + 'Champagne', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 34, + 45, + 73, + 128, + 0, + 231, + 34, + 91, + 105, + 128, + 0, + 212, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 30, + 36, + 145, + 128, + 0, + 224, + 30, + 36, + 145, + 128, + 0, + 224, + 30, + 36, + 145, + 128, + 0, + 224, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 994, + 10, + 1, + 226, + 'Starlight Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 30, + 10, + 5, + 154, + 0, + 192, + 2, + 255, + 255, + 128, + 0, + 195, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 1, + 255, + 255, + 128, + 0, + 237, + 1, + 255, + 255, + 128, + 26, + 255, + 30, + 10, + 5, + 154, + 0, + 155, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 995, + 10, + 1, + 226, + 'Windward Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 147, + 41, + 74, + 128, + 0, + 224, + 134, + 186, + 74, + 128, + 0, + 198, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 134, + 186, + 74, + 128, + 0, + 198, + 134, + 186, + 74, + 128, + 0, + 198, + 134, + 186, + 74, + 128, + 0, + 198, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 996, + 10, + 1, + 226, + 'Goldenrod Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 37, + 62, + 255, + 128, + 18, + 255, + 28, + 255, + 255, + 128, + 26, + 225, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 24, + 255, + 255, + 128, + 26, + 255, + 18, + 255, + 255, + 128, + 26, + 255, + 31, + 255, + 255, + 128, + 17, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 997, + 10, + 1, + 226, + 'Verdoro Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 103, + 41, + 28, + 154, + 0, + 206, + 60, + 255, + 255, + 128, + 1, + 214, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 47, + 255, + 255, + 128, + 1, + 244, + 37, + 255, + 255, + 128, + 17, + 255, + 69, + 125, + 28, + 154, + 0, + 176, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 998, + 10, + 1, + 226, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 128, + 5, + 255, + 128, + 14, + 255, + 2, + 73, + 255, + 128, + 19, + 225, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 2, + 146, + 255, + 128, + 19, + 255, + 2, + 255, + 255, + 128, + 19, + 255, + 47, + 11, + 255, + 128, + 27, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 999, + 10, + 1, + 226, + 'Crystal Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 121, + 44, + 71, + 128, + 0, + 218, + 121, + 255, + 71, + 128, + 0, + 205, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 14, + 128, + 0, + 215, + 30, + 10, + 19, + 128, + 0, + 175, + 121, + 255, + 71, + 128, + 0, + 205, + 121, + 255, + 71, + 128, + 0, + 205, + 121, + 255, + 71, + 128, + 0, + 205, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 1000, + 10, + 1, + 226, + 'Limelight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 50, + 45, + 95, + 128, + 0, + 229, + 50, + 108, + 95, + 128, + 0, + 211, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 50, + 108, + 95, + 128, + 0, + 211, + 50, + 108, + 95, + 128, + 0, + 211, + 50, + 108, + 95, + 128, + 0, + 211, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 1001, + 10, + 1, + 226, + 'Carousel Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 2, + 77, + 255, + 128, + 0, + 245, + 13, + 255, + 255, + 128, + 9, + 255, + 40, + 7, + 16, + 128, + 0, + 194, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 10, + 19, + 128, + 0, + 175, + 22, + 255, + 255, + 128, + 9, + 255, + 32, + 255, + 255, + 128, + 9, + 255, + 2, + 255, + 255, + 128, + 0, + 255, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 1002, + 10, + 1, + 226, + 'Paladium Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69judtin', + 128, + 15, + 94, + 128, + 0, + 237, + 32, + 73, + 255, + 128, + 0, + 237, + 40, + 20, + 255, + 128, + 0, + 249, + 128, + 0, + 18, + 128, + 0, + 219, + 30, + 48, + 142, + 128, + 45, + 241, + 32, + 142, + 255, + 128, + 0, + 240, + 32, + 255, + 255, + 128, + 9, + 255, + 128, + 15, + 94, + 128, + 0, + 228, + 0, + 'Factory', + 'As per 69 GTO CSV' + ), + ( + 1005, + 10, + 1, + 213, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 9, + 255, + 255, + 92, + 44, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1006, + 10, + 1, + 214, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 9, + 255, + 255, + 92, + 44, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1007, + 10, + 1, + 215, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 9, + 255, + 255, + 92, + 44, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1008, + 10, + 1, + 134, + 'Jamaica Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + NULL, + 7, + 0, + 128, + 0, + 172, + 148, + 203, + NULL, + 141, + 0, + 229, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1009, + 10, + 1, + 213, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 138, + 163, + 73, + 128, + 0, + 235, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1010, + 10, + 1, + 213, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 156, + 208, + 189, + 128, + 0, + 253, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1011, + 10, + 1, + 213, + 'Citron Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 49, + 97, + 139, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1012, + 10, + 1, + 213, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 142, + 126, + 112, + 128, + 0, + 240, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1013, + 10, + 1, + 213, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 96, + 176, + 48, + 148, + 0, + 203, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1014, + 10, + 1, + 213, + 'Sassy Grass Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 90, + 235, + 255, + 128, + 16, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1015, + 10, + 1, + 213, + 'Tor-Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 255, + 133, + 15, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1016, + 10, + 1, + 213, + 'Burnt Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 13, + 210, + 146, + 128, + 0, + 248, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1017, + 10, + 1, + 213, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 27, + 45, + 120, + 101, + 16, + 254, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1018, + 10, + 1, + 213, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 82, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1019, + 10, + 1, + 213, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 19, + 163, + 75, + 128, + 0, + 220, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1020, + 10, + 1, + 213, + 'In-Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 222, + 255, + 74, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1021, + 10, + 1, + 213, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 1, + 215, + 48, + 128, + 7, + 255, + 1, + 215, + 48, + 128, + 0, + 245, + 1, + 215, + 48, + 128, + 0, + 233, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 128, + 3, + 255, + 97, + 45, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1022, + 10, + 1, + 213, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 33, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1023, + 10, + 1, + 213, + 'Citron Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 28, + 172, + 255, + 116, + 27, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1024, + 10, + 1, + 213, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70hemtin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 7, + 7, + 0, + 128, + 0, + 178, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1025, + 10, + 1, + 214, + 'Jamaica Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 148, + 203, + 101, + 141, + 0, + 229, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1026, + 10, + 1, + 214, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 138, + 163, + 73, + 128, + 0, + 235, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1027, + 10, + 1, + 214, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 156, + 208, + 189, + 128, + 0, + 253, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1028, + 10, + 1, + 214, + 'Citron Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 49, + 97, + 139, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1029, + 10, + 1, + 214, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 142, + 126, + 112, + 128, + 0, + 240, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1030, + 10, + 1, + 214, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 96, + 176, + 48, + 148, + 0, + 203, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1031, + 10, + 1, + 214, + 'Sassy Grass Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 90, + 235, + 255, + 128, + 16, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1032, + 10, + 1, + 214, + 'Tor-Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 255, + 133, + 15, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1033, + 10, + 1, + 214, + 'Burnt Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 13, + 210, + 146, + 128, + 0, + 248, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1034, + 10, + 1, + 214, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 27, + 45, + 120, + 101, + 16, + 254, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1035, + 10, + 1, + 214, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 82, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1036, + 10, + 1, + 214, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 19, + 163, + 75, + 128, + 0, + 220, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1037, + 10, + 1, + 214, + 'In-Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 222, + 255, + 74, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1038, + 10, + 1, + 214, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 1, + 215, + 48, + 128, + 7, + 255, + 1, + 215, + 48, + 128, + 0, + 245, + 1, + 215, + 48, + 128, + 0, + 233, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 128, + 3, + 255, + 97, + 45, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1039, + 10, + 1, + 214, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 33, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1040, + 10, + 1, + 214, + 'Citron Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 28, + 172, + 255, + 116, + 27, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1041, + 10, + 1, + 214, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70h44tin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 7, + 7, + 0, + 128, + 0, + 178, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1042, + 10, + 1, + 215, + 'Jamaica Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 148, + 203, + 101, + 141, + 0, + 229, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1043, + 10, + 1, + 215, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 138, + 163, + 73, + 128, + 0, + 235, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1044, + 10, + 1, + 215, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 156, + 208, + 189, + 128, + 0, + 253, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1045, + 10, + 1, + 215, + 'Citron Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 49, + 97, + 139, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1046, + 10, + 1, + 215, + 'Ice Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 142, + 126, + 112, + 128, + 0, + 240, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1047, + 10, + 1, + 215, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 96, + 176, + 48, + 148, + 0, + 203, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1048, + 10, + 1, + 215, + 'Sassy Grass Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 90, + 235, + 255, + 128, + 16, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1049, + 10, + 1, + 215, + 'Tor-Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 255, + 133, + 15, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1050, + 10, + 1, + 215, + 'Burnt Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 13, + 210, + 146, + 128, + 0, + 248, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1051, + 10, + 1, + 215, + 'Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 27, + 45, + 120, + 101, + 16, + 254, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1052, + 10, + 1, + 215, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 1, + 255, + 82, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1053, + 10, + 1, + 215, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 97, + 48, + 128, + 6, + 255, + 20, + 97, + 48, + 128, + 0, + 249, + 20, + 97, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 19, + 163, + 75, + 128, + 0, + 220, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1054, + 10, + 1, + 215, + 'In-Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 222, + 255, + 74, + 128, + 0, + 231, + 0, + 'Factory', + 'As per 70 Cuda CSV. Does not match reference as a factory stock color.' + ), + ( + 1055, + 10, + 1, + 215, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 1, + 215, + 48, + 128, + 7, + 255, + 1, + 215, + 48, + 128, + 0, + 245, + 1, + 215, + 48, + 128, + 0, + 233, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 128, + 3, + 255, + 97, + 45, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1056, + 10, + 1, + 215, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 33, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1057, + 10, + 1, + 215, + 'Citron Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 28, + 172, + 255, + 116, + 27, + 255, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1058, + 10, + 1, + 215, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70aartin', + 7, + 7, + 0, + 128, + 0, + 224, + 20, + 7, + 48, + 128, + 0, + 255, + 20, + 7, + 58, + 128, + 0, + 244, + 20, + 7, + 48, + 128, + 0, + 241, + 20, + 7, + 16, + 128, + 0, + 188, + 9, + 9, + 9, + 92, + 1, + 219, + 7, + 7, + 0, + 128, + 0, + 172, + 7, + 7, + 0, + 128, + 0, + 178, + 0, + 'Factory', + 'As per 70 Cuda CSV.' + ), + ( + 1059, + 10, + 1, + 227, + 'Admiralty Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '73fortin', + 150, + 53, + 54, + 152, + 0, + 210, + 20, + 7, + 14, + 128, + 0, + 227, + 150, + 255, + 54, + 152, + 0, + 172, + 20, + 7, + 9, + 118, + 3, + 241, + 20, + 7, + 14, + 128, + 0, + 158, + 131, + 20, + 168, + 128, + 0, + 237, + 20, + 7, + 14, + 128, + 0, + 158, + 150, + 255, + 54, + 152, + 0, + 172, + 0, + 'system', + 'As per 70 Firebird CSV' + ), + ( + 1060, + 10, + 1, + 216, + 'Lime Light', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 50, + 41, + 135, + 128, + 0, + 240, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 45, + 147, + 135, + 135, + 0, + 232, + 20, + 7, + 6, + 128, + 0, + 165, + 45, + 147, + 135, + 135, + 0, + 232, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1061, + 10, + 1, + 216, + 'Bahama Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 28, + 60, + 208, + 128, + 0, + 249, + 122, + 5, + 184, + 128, + 0, + 246, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 26, + 233, + 208, + 128, + 0, + 239, + 20, + 7, + 6, + 128, + 0, + 165, + 26, + 233, + 208, + 128, + 0, + 239, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1062, + 10, + 1, + 216, + 'Rallye Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 0, + 97, + 255, + 128, + 0, + 244, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 0, + 255, + 255, + 128, + 0, + 245, + 20, + 7, + 6, + 128, + 0, + 165, + 0, + 255, + 255, + 128, + 0, + 245, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1063, + 10, + 1, + 216, + 'In Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 197, + 50, + 87, + 128, + 0, + 236, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 186, + 177, + 87, + 156, + 0, + 203, + 20, + 7, + 6, + 128, + 0, + 165, + 186, + 177, + 87, + 156, + 0, + 203, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1064, + 10, + 1, + 216, + 'Avocado', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 80, + 35, + 24, + 128, + 0, + 218, + 70, + 192, + 24, + 103, + 0, + 186, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 70, + 192, + 24, + 103, + 0, + 186, + 70, + 192, + 24, + 103, + 0, + 186, + 70, + 192, + 24, + 103, + 0, + 186, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1065, + 10, + 1, + 216, + 'True Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 147, + 48, + 109, + 143, + 0, + 222, + 142, + 255, + 109, + 143, + 0, + 212, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 142, + 255, + 109, + 143, + 0, + 212, + 142, + 255, + 109, + 143, + 0, + 212, + 142, + 255, + 109, + 143, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1066, + 10, + 1, + 216, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 40, + 19, + 255, + 88, + 36, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 40, + 19, + 255, + 88, + 36, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 40, + 19, + 255, + 88, + 36, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1067, + 10, + 1, + 216, + 'Coral Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 131, + 62, + 124, + 146, + 0, + 229, + 131, + 214, + 57, + 143, + 0, + 192, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 131, + 214, + 57, + 143, + 0, + 192, + 131, + 214, + 57, + 143, + 0, + 192, + 131, + 214, + 57, + 143, + 0, + 192, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1068, + 10, + 1, + 216, + 'Sandpebble Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 27, + 35, + 108, + 128, + 0, + 246, + 24, + 118, + 176, + 133, + 0, + 240, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 24, + 118, + 176, + 133, + 0, + 240, + 24, + 118, + 176, + 133, + 0, + 240, + 24, + 118, + 176, + 133, + 0, + 240, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1069, + 10, + 1, + 216, + 'Aztec Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 27, + 82, + 160, + 128, + 0, + 254, + 23, + 215, + 160, + 128, + 0, + 252, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 23, + 215, + 160, + 128, + 0, + 252, + 23, + 215, + 160, + 128, + 0, + 252, + 23, + 215, + 160, + 128, + 0, + 252, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1070, + 10, + 1, + 216, + 'Winchester Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 136, + 24, + 202, + 116, + 9, + 255, + 136, + 24, + 202, + 116, + 5, + 229, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 136, + 24, + 202, + 116, + 5, + 229, + 20, + 7, + 6, + 128, + 0, + 165, + 136, + 24, + 202, + 116, + 5, + 229, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1071, + 10, + 1, + 216, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 14, + 69, + 255, + 97, + 19, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 18, + 255, + 255, + 94, + 28, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 18, + 255, + 255, + 94, + 28, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1072, + 10, + 1, + 216, + 'Burnished Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 254, + 48, + 79, + 128, + 0, + 233, + 254, + 252, + 79, + 148, + 0, + 212, + 45, + 37, + 246, + 128, + 9, + 255, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 254, + 252, + 79, + 148, + 0, + 212, + 254, + 252, + 79, + 148, + 0, + 212, + 254, + 252, + 79, + 148, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1073, + 10, + 1, + 216, + 'Lemon Twist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 33, + 131, + 255, + 118, + 19, + 255, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 33, + 255, + 255, + 118, + 26, + 255, + 20, + 7, + 6, + 128, + 0, + 165, + 33, + 255, + 255, + 118, + 26, + 255, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1074, + 10, + 1, + 216, + 'Black Velvet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 37, + 10, + 1, + 73, + 1, + 239, + 122, + 5, + 184, + 128, + 0, + 246, + 20, + 7, + 30, + 116, + 0, + 244, + 20, + 7, + 30, + 117, + 0, + 240, + 20, + 7, + 23, + 128, + 0, + 242, + 37, + 10, + 1, + 69, + 1, + 194, + 37, + 10, + 1, + 69, + 1, + 194, + 37, + 10, + 1, + 69, + 1, + 194, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1075, + 10, + 1, + 216, + 'Autumn Bronze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '71wedtin', + 14, + 82, + 79, + 144, + 0, + 220, + 14, + 252, + 79, + 144, + 0, + 212, + 22, + 134, + 45, + 128, + 0, + 241, + 22, + 134, + 100, + 128, + 0, + 255, + 20, + 7, + 23, + 128, + 0, + 242, + 14, + 252, + 79, + 144, + 0, + 212, + 14, + 252, + 79, + 144, + 0, + 212, + 14, + 252, + 79, + 144, + 0, + 212, + 0, + 'Factory', + 'As per 71 Duster CSV.' + ), + ( + 1076, + 10, + 1, + 224, + 'Crimson', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 2, + 150, + 255, + 128, + 0, + 236, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 2, + 255, + 255, + 128, + 0, + 228, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1077, + 10, + 1, + 224, + 'Platinum', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 134, + 10, + 126, + 128, + 6, + 245, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 134, + 10, + 158, + 128, + 1, + 232, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1078, + 10, + 1, + 224, + 'Trophy Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 170, + 128, + 192, + 128, + 0, + 214, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 147, + 255, + 79, + 128, + 0, + 184, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1079, + 10, + 1, + 224, + 'Ebony Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 6, + 10, + 9, + 128, + 0, + 197, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 6, + 10, + 9, + 128, + 0, + 161, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1080, + 10, + 1, + 224, + 'Topaz', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 37, + 65, + 145, + 128, + 0, + 243, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 31, + 143, + 178, + 128, + 0, + 224, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1081, + 10, + 1, + 224, + 'Cameo White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 128, + 10, + 255, + 128, + 18, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 128, + 10, + 255, + 128, + 43, + 255, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1082, + 10, + 1, + 224, + 'Powder Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 135, + 61, + 190, + 128, + 0, + 242, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 28, + 26, + 164, + 128, + 10, + 255, + 30, + 10, + 1, + 128, + 0, + 194, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 135, + 99, + 190, + 128, + 0, + 237, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1083, + 10, + 1, + 224, + 'Chestnut Bronze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 5, + 91, + 82, + 128, + 0, + 218, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 5, + 231, + 82, + 128, + 0, + 193, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1084, + 10, + 1, + 224, + 'Saffron', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 33, + 96, + 255, + 128, + 16, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 28, + 165, + 255, + 128, + 33, + 255, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1085, + 10, + 1, + 224, + 'Flamingo Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 246, + 33, + 80, + 128, + 7, + 242, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 11, + 10, + 26, + 128, + 0, + 205, + 30, + 10, + 1, + 128, + 0, + 194, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 246, + 43, + 80, + 128, + 7, + 232, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1086, + 10, + 1, + 224, + 'Meadow Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 77, + 44, + 109, + 128, + 1, + 242, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 65, + 75, + 109, + 128, + 1, + 220, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1087, + 10, + 1, + 224, + 'Palomino Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69w30tin', + 32, + 56, + 118, + 128, + 0, + 245, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 28, + 116, + 164, + 128, + 1, + 224, + 30, + 10, + 1, + 128, + 0, + 194, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 32, + 92, + 118, + 128, + 0, + 233, + 0, + 'Factory', + 'As per 69 Olds 442 CSV.' + ), + ( + 1088, + 10, + 1, + 157, + 'Lime Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 66, + 78, + 48, + 128, + 0, + 231, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 66, + 143, + 48, + 128, + 0, + 211, + 1, + 0, + 2, + 128, + 0, + 182, + 66, + 143, + 48, + 128, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1089, + 10, + 1, + 157, + 'Blue Fire', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 147, + 79, + 101, + 128, + 0, + 239, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 147, + 255, + 101, + 128, + 0, + 223, + 1, + 0, + 2, + 128, + 0, + 182, + 147, + 255, + 101, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1090, + 10, + 1, + 157, + 'Scorch Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 5, + 124, + 165, + 128, + 0, + 245, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 5, + 255, + 165, + 128, + 0, + 225, + 1, + 0, + 2, + 128, + 0, + 182, + 5, + 255, + 165, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1091, + 10, + 1, + 157, + 'Violet', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 189, + 88, + 52, + 128, + 0, + 239, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 184, + 255, + 52, + 128, + 0, + 219, + 1, + 0, + 2, + 128, + 0, + 182, + 184, + 255, + 52, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1092, + 10, + 1, + 157, + 'Frosted Teal', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 134, + 73, + 62, + 128, + 0, + 227, + 134, + 255, + 62, + 128, + 0, + 242, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 134, + 2, + 219, + 128, + 23, + 255, + 134, + 255, + 62, + 128, + 0, + 207, + 134, + 255, + 62, + 128, + 0, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1093, + 10, + 1, + 157, + 'Vitamin C', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 20, + 137, + 181, + 82, + 36, + 253, + 20, + 255, + 231, + 52, + 49, + 253, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 20, + 255, + 231, + 52, + 49, + 253, + 1, + 0, + 2, + 128, + 0, + 182, + 20, + 255, + 231, + 52, + 49, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1094, + 10, + 1, + 157, + 'Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 66, + 47, + 33, + 128, + 0, + 236, + 66, + 143, + 33, + 128, + 0, + 192, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 48, + 80, + 164, + 128, + 1, + 239, + 66, + 143, + 33, + 128, + 0, + 192, + 66, + 143, + 33, + 128, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1095, + 10, + 1, + 157, + 'Limelight Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 83, + 108, + 202, + 128, + 0, + 250, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 73, + 205, + 202, + 128, + 6, + 239, + 1, + 0, + 2, + 128, + 0, + 182, + 73, + 205, + 202, + 128, + 6, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1096, + 10, + 1, + 157, + 'Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 9, + 7, + 1, + 128, + 0, + 232, + 0, + 255, + 248, + 128, + 24, + 253, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 0, + 255, + 248, + 128, + 24, + 253, + 9, + 7, + 1, + 128, + 0, + 188, + 9, + 7, + 1, + 128, + 0, + 188, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1097, + 10, + 1, + 157, + 'Sahara Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 27, + 88, + 96, + 128, + 0, + 249, + 27, + 161, + 96, + 128, + 0, + 254, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 1, + 0, + 2, + 128, + 0, + 182, + 27, + 161, + 96, + 128, + 0, + 231, + 27, + 161, + 96, + 128, + 0, + 231, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1098, + 10, + 1, + 157, + 'Burnt Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 13, + 83, + 122, + 128, + 0, + 237, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 107, + 62, + 128, + 0, + 241, + 30, + 107, + 62, + 128, + 0, + 254, + 30, + 10, + 10, + 128, + 0, + 206, + 13, + 176, + 122, + 128, + 0, + 229, + 1, + 0, + 2, + 128, + 0, + 182, + 13, + 176, + 122, + 128, + 0, + 229, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1099, + 10, + 1, + 157, + 'Walnut', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 20, + 66, + 58, + 128, + 0, + 236, + 20, + 137, + 58, + 128, + 0, + 239, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 48, + 80, + 164, + 128, + 1, + 239, + 20, + 137, + 58, + 128, + 0, + 211, + 20, + 137, + 58, + 128, + 0, + 211, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1100, + 10, + 1, + 157, + 'Rally Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 0, + 139, + 248, + 128, + 24, + 253, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 0, + 255, + 248, + 97, + 13, + 253, + 1, + 0, + 2, + 128, + 0, + 182, + 0, + 255, + 248, + 97, + 13, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1101, + 10, + 1, + 157, + 'Alpine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 30, + 47, + 255, + 87, + 45, + 255, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 30, + 47, + 255, + 87, + 45, + 255, + 1, + 0, + 2, + 128, + 0, + 182, + 30, + 47, + 255, + 87, + 45, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1102, + 10, + 1, + 157, + 'Sunfire Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 38, + 141, + 255, + 128, + 9, + 255, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 255, + 128, + 10, + 255, + 30, + 15, + 255, + 128, + 27, + 255, + 30, + 10, + 203, + 128, + 33, + 255, + 32, + 219, + 255, + 88, + 44, + 255, + 1, + 0, + 2, + 128, + 0, + 182, + 32, + 219, + 255, + 88, + 44, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1103, + 10, + 1, + 157, + 'Yellow Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '69gtxtin', + 32, + 87, + 210, + 128, + 35, + 227, + 20, + 255, + 255, + 128, + 15, + 255, + 30, + 15, + 23, + 128, + 0, + 242, + 30, + 15, + 33, + 128, + 0, + 249, + 30, + 10, + 10, + 128, + 0, + 206, + 32, + 189, + 210, + 128, + 35, + 249, + 1, + 0, + 2, + 128, + 0, + 182, + 32, + 189, + 210, + 128, + 35, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1104, + 10, + 1, + 217, + 'Azure Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 125, + 47, + 90, + 128, + 0, + 202, + 128, + 0, + 255, + 128, + 0, + 186, + 125, + 47, + 90, + 128, + 0, + 202, + 40, + 20, + 10, + 128, + 0, + 224, + 125, + 18, + 90, + 128, + 0, + 248, + 40, + 24, + 255, + 128, + 32, + 255, + 128, + 128, + 90, + 129, + 0, + 211, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1105, + 10, + 1, + 217, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 5, + 255, + 128, + 0, + 199, + 128, + 0, + 255, + 128, + 0, + 186, + 20, + 5, + 255, + 128, + 0, + 199, + 40, + 20, + 10, + 128, + 0, + 224, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 159, + 20, + 5, + 1, + 128, + 0, + 159, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1106, + 10, + 1, + 217, + 'Lagoon Aqua', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 127, + 254, + 53, + 128, + 1, + 195, + 128, + 0, + 255, + 128, + 0, + 186, + 127, + 254, + 53, + 128, + 1, + 195, + 40, + 20, + 10, + 128, + 0, + 224, + 127, + 116, + 53, + 128, + 1, + 228, + 127, + 202, + 53, + 128, + 1, + 178, + 127, + 202, + 53, + 128, + 1, + 178, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1107, + 10, + 1, + 217, + 'Meadow Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 40, + 15, + 255, + 128, + 0, + 255, + 73, + 60, + 143, + 128, + 0, + 212, + 24, + 71, + 202, + 152, + 3, + 214, + 73, + 60, + 143, + 128, + 0, + 212, + 40, + 20, + 10, + 128, + 0, + 224, + 108, + 24, + 143, + 128, + 0, + 233, + 40, + 24, + 255, + 128, + 32, + 255, + 73, + 60, + 143, + 128, + 0, + 212, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1108, + 10, + 1, + 217, + 'Desert Beige', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 24, + 71, + 202, + 121, + 3, + 255, + 24, + 71, + 202, + 152, + 3, + 214, + 24, + 71, + 202, + 121, + 3, + 255, + 40, + 20, + 10, + 128, + 0, + 224, + 24, + 24, + 202, + 121, + 9, + 255, + 24, + 71, + 202, + 121, + 3, + 255, + 24, + 71, + 202, + 121, + 3, + 255, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1109, + 10, + 1, + 217, + 'Daytona Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 147, + 255, + 47, + 128, + 0, + 208, + 147, + 212, + 47, + 128, + 0, + 178, + 147, + 255, + 47, + 128, + 0, + 208, + 40, + 20, + 10, + 128, + 0, + 224, + 147, + 75, + 47, + 128, + 0, + 211, + 147, + 255, + 47, + 128, + 0, + 180, + 147, + 255, + 47, + 128, + 0, + 180, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1110, + 10, + 1, + 217, + 'Bahama Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 30, + 79, + 30, + 128, + 0, + 241, + 30, + 79, + 30, + 128, + 0, + 241, + 24, + 71, + 202, + 152, + 3, + 214, + 30, + 79, + 30, + 128, + 0, + 212, + 40, + 20, + 10, + 128, + 0, + 224, + 94, + 54, + 47, + 128, + 0, + 220, + 107, + 185, + 47, + 114, + 0, + 175, + 107, + 185, + 47, + 114, + 0, + 175, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1111, + 10, + 1, + 217, + 'Ermine White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 8, + 255, + 128, + 33, + 233, + 1, + 249, + 154, + 128, + 0, + 224, + 128, + 8, + 255, + 128, + 33, + 255, + 40, + 20, + 255, + 128, + 0, + 229, + 128, + 8, + 255, + 128, + 7, + 255, + 128, + 8, + 255, + 128, + 33, + 255, + 128, + 8, + 255, + 128, + 33, + 255, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1112, + 10, + 1, + 217, + 'Almond Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 40, + 15, + 255, + 128, + 0, + 255, + 13, + 48, + 255, + 105, + 0, + 232, + 40, + 15, + 255, + 128, + 0, + 255, + 13, + 48, + 255, + 105, + 0, + 232, + 40, + 20, + 10, + 128, + 0, + 224, + 13, + 26, + 255, + 105, + 7, + 254, + 40, + 24, + 255, + 128, + 32, + 255, + 13, + 48, + 255, + 105, + 0, + 232, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1113, + 10, + 1, + 217, + 'Palomar Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 13, + 254, + 75, + 118, + 0, + 223, + 24, + 71, + 202, + 152, + 3, + 214, + 13, + 254, + 75, + 118, + 0, + 208, + 40, + 20, + 255, + 128, + 0, + 229, + 13, + 44, + 75, + 118, + 0, + 220, + 13, + 254, + 75, + 118, + 0, + 185, + 13, + 254, + 75, + 118, + 0, + 185, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1114, + 10, + 1, + 217, + 'Goldwood Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 32, + 122, + 255, + 128, + 20, + 255, + 24, + 71, + 202, + 152, + 3, + 231, + 32, + 122, + 255, + 128, + 20, + 255, + 24, + 71, + 202, + 152, + 3, + 231, + 37, + 44, + 255, + 128, + 6, + 240, + 24, + 71, + 202, + 152, + 3, + 231, + 32, + 122, + 255, + 128, + 20, + 255, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1115, + 10, + 1, + 217, + 'Silver Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 139, + 65, + 138, + 114, + 6, + 231, + 128, + 0, + 255, + 128, + 0, + 255, + 139, + 65, + 138, + 114, + 6, + 220, + 40, + 20, + 255, + 128, + 73, + 255, + 139, + 36, + 138, + 114, + 6, + 249, + 40, + 24, + 255, + 128, + 32, + 255, + 139, + 65, + 138, + 114, + 6, + 212, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1116, + 10, + 1, + 217, + 'Saddle Tan', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 97, + 143, + 128, + 0, + 233, + 24, + 71, + 202, + 152, + 3, + 231, + 20, + 97, + 143, + 128, + 0, + 218, + 40, + 20, + 255, + 128, + 0, + 229, + 20, + 49, + 143, + 128, + 0, + 240, + 20, + 97, + 143, + 128, + 0, + 218, + 20, + 97, + 143, + 128, + 0, + 218, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1117, + 10, + 1, + 217, + 'Satin Silver', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '64ssitin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 5, + 255, + 128, + 0, + 229, + 1, + 2, + 154, + 128, + 0, + 173, + 20, + 5, + 255, + 128, + 0, + 214, + 40, + 20, + 255, + 128, + 0, + 229, + 20, + 5, + 255, + 128, + 0, + 240, + 20, + 5, + 255, + 128, + 0, + 206, + 117, + 5, + 159, + 84, + 0, + 248, + 0, + 'system', + 'As per 64 Impala CSV.' + ), + ( + 1118, + 10, + 1, + 221, + 'Classic White / Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 128, + 5, + 255, + 128, + 27, + 255, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 41, + 101, + 128, + 0, + 254, + 15, + 255, + 101, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 18, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1119, + 10, + 1, + 221, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 128, + 52, + 58, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 128, + 255, + 58, + 152, + 0, + 203, + 128, + 255, + 58, + 152, + 0, + 203, + 128, + 255, + 58, + 152, + 0, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1120, + 10, + 1, + 221, + 'Champagne Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 33, + 60, + 126, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 27, + 138, + 126, + 128, + 0, + 223, + 27, + 138, + 126, + 128, + 0, + 223, + 27, + 138, + 126, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1121, + 10, + 1, + 221, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 122, + 10, + 160, + 128, + 11, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 122, + 10, + 160, + 128, + 0, + 227, + 1, + 1, + 1, + 128, + 1, + 147, + 122, + 10, + 160, + 142, + 0, + 220, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1122, + 10, + 1, + 221, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 104, + 18, + 147, + 128, + 0, + 253, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 104, + 101, + 147, + 128, + 0, + 219, + 104, + 101, + 147, + 128, + 0, + 219, + 104, + 101, + 147, + 128, + 0, + 219, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1123, + 10, + 1, + 221, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 64, + 14, + 53, + 128, + 0, + 232, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 97, + 130, + 53, + 128, + 0, + 190, + 97, + 130, + 53, + 128, + 0, + 190, + 97, + 130, + 53, + 128, + 0, + 190, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1124, + 10, + 1, + 221, + 'Cranberry Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 6, + 56, + 91, + 128, + 0, + 245, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 248, + 254, + 91, + 176, + 0, + 180, + 1, + 1, + 1, + 128, + 1, + 147, + 248, + 254, + 91, + 176, + 0, + 192, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1125, + 10, + 1, + 221, + 'Astro Blue / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 142, + 57, + 255, + 128, + 18, + 255, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 250, + 20, + 7, + 18, + 128, + 0, + 165, + 142, + 101, + 255, + 128, + 2, + 254, + 142, + 3, + 255, + 128, + 36, + 255, + 142, + 175, + 88, + 184, + 2, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1126, + 10, + 1, + 221, + 'Laguna Gray / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 242, + 18, + 83, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 242, + 28, + 83, + 171, + 0, + 180, + 1, + 1, + 1, + 128, + 1, + 147, + 242, + 28, + 83, + 171, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1127, + 10, + 1, + 221, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 170, + 73, + 255, + 128, + 22, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 155, + 254, + 70, + 146, + 11, + 184, + 155, + 254, + 70, + 146, + 11, + 184, + 155, + 254, + 70, + 146, + 11, + 184, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1128, + 10, + 1, + 221, + 'Shadow Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 128, + 6, + 94, + 128, + 6, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 26, + 41, + 53, + 128, + 0, + 199, + 26, + 41, + 53, + 128, + 0, + 199, + 26, + 41, + 53, + 128, + 0, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1129, + 10, + 1, + 221, + 'Gold Beige / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 31, + 13, + 112, + 128, + 0, + 249, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 31, + 148, + 112, + 109, + 11, + 228, + 1, + 1, + 1, + 128, + 1, + 147, + 31, + 148, + 112, + 109, + 11, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1130, + 10, + 1, + 221, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 245, + 255, + 66, + 128, + 0, + 198, + 245, + 255, + 66, + 128, + 0, + 198, + 245, + 255, + 66, + 128, + 0, + 198, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1131, + 10, + 1, + 221, + 'Autumn Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70csstin', + 23, + 39, + 62, + 128, + 0, + 240, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 23, + 126, + 62, + 128, + 0, + 194, + 23, + 126, + 62, + 128, + 0, + 194, + 23, + 126, + 62, + 128, + 0, + 194, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1132, + 10, + 1, + 221, + 'Plum / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 215, + 255, + 53, + 128, + 0, + 188, + 1, + 1, + 1, + 128, + 1, + 147, + 215, + 255, + 53, + 128, + 0, + 198, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1133, + 10, + 1, + 221, + 'Yellow / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 18, + 86, + 255, + 117, + 20, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 31, + 255, + 255, + 117, + 26, + 229, + 1, + 1, + 1, + 128, + 1, + 147, + 31, + 255, + 255, + 117, + 26, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1134, + 10, + 1, + 221, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70csstin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 165, + 1, + 236, + 255, + 128, + 0, + 219, + 1, + 1, + 1, + 128, + 1, + 147, + 1, + 255, + 255, + 139, + 0, + 249, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1135, + 10, + 1, + 223, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 48, + 83, + 139, + 128, + 0, + 223, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 48, + 28, + 139, + 128, + 0, + 240, + 20, + 7, + 18, + 128, + 0, + 161, + 48, + 83, + 139, + 128, + 0, + 223, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1136, + 10, + 1, + 223, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 255, + 255, + 128, + 0, + 241, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 0, + 86, + 255, + 128, + 0, + 252, + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 255, + 255, + 128, + 0, + 241, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1137, + 10, + 1, + 223, + 'Astro Blue / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 145, + 210, + 142, + 128, + 0, + 216, + 145, + 210, + 142, + 128, + 0, + 216, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 150, + 79, + 142, + 128, + 0, + 241, + 145, + 210, + 142, + 128, + 0, + 216, + 145, + 210, + 142, + 128, + 0, + 216, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1138, + 10, + 1, + 223, + 'Shadow Grey', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 24, + 66, + 86, + 128, + 0, + 207, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 24, + 40, + 75, + 128, + 0, + 231, + 20, + 7, + 18, + 128, + 0, + 161, + 24, + 66, + 86, + 128, + 0, + 207, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1139, + 10, + 1, + 223, + 'Gold / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 22, + 107, + 142, + 128, + 0, + 225, + 22, + 107, + 142, + 128, + 0, + 225, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 28, + 47, + 142, + 128, + 0, + 245, + 22, + 107, + 142, + 128, + 0, + 225, + 22, + 107, + 142, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1140, + 10, + 1, + 223, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 101, + 178, + 33, + 128, + 0, + 193, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 64, + 84, + 33, + 128, + 36, + 206, + 20, + 7, + 18, + 128, + 0, + 161, + 101, + 178, + 33, + 128, + 0, + 193, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1141, + 10, + 1, + 223, + 'Classic White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 58, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 40, + 7, + 255, + 128, + 27, + 255, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 40, + 7, + 255, + 128, + 27, + 225, + 20, + 7, + 18, + 128, + 0, + 161, + 40, + 7, + 255, + 128, + 27, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1142, + 10, + 1, + 223, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 130, + 182, + 97, + 128, + 0, + 222, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 130, + 73, + 97, + 128, + 0, + 235, + 20, + 7, + 18, + 128, + 0, + 161, + 130, + 182, + 97, + 128, + 0, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1143, + 10, + 1, + 223, + 'Black Cherry / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 1, + 255, + 80, + 128, + 2, + 203, + 1, + 255, + 80, + 128, + 2, + 203, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 1, + 66, + 80, + 128, + 2, + 241, + 1, + 255, + 80, + 128, + 2, + 203, + 1, + 255, + 80, + 128, + 2, + 203, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1144, + 10, + 1, + 223, + 'Autumn Gold / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 26, + 134, + 134, + 137, + 0, + 199, + 26, + 134, + 134, + 137, + 0, + 199, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 26, + 74, + 134, + 128, + 0, + 245, + 26, + 134, + 134, + 137, + 0, + 199, + 26, + 134, + 134, + 137, + 0, + 199, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1145, + 10, + 1, + 223, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 129, + 1, + 189, + 128, + 1, + 222, + 129, + 1, + 189, + 128, + 1, + 222, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 129, + 1, + 189, + 128, + 1, + 231, + 129, + 1, + 189, + 128, + 1, + 222, + 129, + 1, + 189, + 128, + 1, + 222, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1146, + 10, + 1, + 223, + 'Desert Sand', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssntin', + 128, + 0, + 255, + 128, + 0, + 255, + 20, + 7, + 18, + 128, + 0, + 208, + 22, + 147, + 147, + 128, + 0, + 244, + 20, + 7, + 31, + 128, + 0, + 246, + 40, + 10, + 255, + 128, + 77, + 255, + 22, + 53, + 147, + 128, + 0, + 250, + 20, + 7, + 18, + 128, + 0, + 161, + 22, + 147, + 147, + 128, + 0, + 244, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1147, + 10, + 1, + 223, + 'Black / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 20, + 5, + 1, + 128, + 0, + 184, + 20, + 5, + 1, + 128, + 0, + 184, + 0, + 255, + 255, + 128, + 0, + 241, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 20, + 5, + 66, + 128, + 0, + 245, + 20, + 5, + 1, + 128, + 0, + 184, + 20, + 5, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1148, + 10, + 1, + 223, + 'Yellow / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssntin', + 29, + 255, + 255, + 128, + 34, + 255, + 29, + 255, + 255, + 128, + 34, + 255, + 20, + 7, + 18, + 128, + 0, + 161, + 20, + 7, + 31, + 128, + 0, + 246, + 20, + 7, + 9, + 128, + 0, + 244, + 37, + 64, + 255, + 128, + 16, + 239, + 29, + 255, + 255, + 128, + 34, + 255, + 29, + 255, + 255, + 128, + 34, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1149, + 10, + 1, + 222, + 'Laguna Gray / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 242, + 18, + 83, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 242, + 28, + 83, + 128, + 0, + 214, + 1, + 1, + 1, + 128, + 1, + 168, + 242, + 28, + 83, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1150, + 10, + 1, + 222, + 'Classic White / Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 128, + 5, + 255, + 128, + 27, + 255, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 1, + 255, + 71, + 128, + 0, + 249, + 20, + 7, + 18, + 128, + 0, + 248, + 1, + 41, + 101, + 128, + 0, + 254, + 1, + 255, + 101, + 128, + 0, + 236, + 128, + 5, + 255, + 128, + 39, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1151, + 10, + 1, + 222, + 'Misty Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 128, + 52, + 58, + 128, + 0, + 250, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 128, + 57, + 58, + 128, + 0, + 248, + 128, + 0, + 255, + 128, + 35, + 255, + 128, + 255, + 58, + 128, + 0, + 227, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1152, + 10, + 1, + 222, + 'Champagne Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 33, + 60, + 126, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 27, + 138, + 126, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1153, + 10, + 1, + 222, + 'Cortez Silver / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 122, + 10, + 160, + 128, + 11, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 122, + 10, + 160, + 128, + 0, + 227, + 1, + 1, + 1, + 128, + 1, + 168, + 122, + 10, + 160, + 128, + 0, + 248, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1154, + 10, + 1, + 222, + 'Green Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 104, + 18, + 147, + 128, + 0, + 253, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 104, + 101, + 147, + 128, + 0, + 239, + 104, + 101, + 147, + 128, + 0, + 239, + 104, + 101, + 147, + 128, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1155, + 10, + 1, + 222, + 'Forest Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 64, + 14, + 53, + 128, + 0, + 232, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 97, + 130, + 53, + 128, + 0, + 210, + 97, + 130, + 53, + 128, + 0, + 210, + 97, + 130, + 53, + 128, + 0, + 210, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1156, + 10, + 1, + 222, + 'Astro Blue / White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 142, + 57, + 255, + 128, + 18, + 255, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 245, + 142, + 152, + 86, + 128, + 1, + 250, + 20, + 7, + 18, + 128, + 0, + 248, + 142, + 101, + 255, + 128, + 2, + 254, + 142, + 3, + 255, + 128, + 36, + 255, + 142, + 175, + 88, + 128, + 2, + 228, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1157, + 10, + 1, + 222, + 'Monza Red / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 1, + 47, + 255, + 128, + 0, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 1, + 141, + 255, + 128, + 0, + 214, + 1, + 1, + 1, + 128, + 1, + 168, + 1, + 255, + 255, + 139, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1158, + 10, + 1, + 222, + 'Fathom Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 170, + 73, + 255, + 128, + 22, + 255, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 155, + 254, + 70, + 146, + 11, + 206, + 155, + 254, + 70, + 146, + 11, + 206, + 155, + 254, + 70, + 146, + 11, + 206, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1159, + 10, + 1, + 222, + 'Shadow Gray', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 128, + 6, + 94, + 128, + 6, + 254, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 26, + 41, + 53, + 128, + 0, + 224, + 26, + 41, + 53, + 128, + 0, + 224, + 26, + 41, + 53, + 128, + 0, + 224, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1160, + 10, + 1, + 222, + 'Gold Beige / Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70ssetin', + 31, + 13, + 112, + 128, + 0, + 249, + 128, + 0, + 20, + 128, + 0, + 249, + 128, + 0, + 23, + 128, + 0, + 248, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 31, + 176, + 112, + 109, + 18, + 206, + 1, + 1, + 1, + 128, + 1, + 168, + 31, + 176, + 112, + 109, + 18, + 253, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1161, + 10, + 1, + 222, + 'Black Cherry', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 229, + 43, + 66, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 128, + 0, + 23, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 245, + 255, + 66, + 128, + 0, + 225, + 245, + 255, + 66, + 128, + 0, + 225, + 245, + 255, + 66, + 128, + 0, + 225, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1162, + 10, + 1, + 222, + 'Autumn Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70ssetin', + 23, + 39, + 62, + 128, + 0, + 240, + 36, + 66, + 57, + 128, + 0, + 252, + 36, + 66, + 57, + 128, + 0, + 248, + 36, + 66, + 57, + 128, + 0, + 252, + 20, + 7, + 18, + 128, + 0, + 248, + 23, + 126, + 62, + 128, + 0, + 215, + NULL, + 126, + 62, + 128, + 0, + 215, + 23, + 126, + NULL, + 128, + 0, + 215, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1163, + 10, + 1, + 142, + 'Candyapple Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1164, + 10, + 1, + 142, + 'Raven Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 254, + 207, + 78, + 128, + 0, + 244, + 254, + 207, + 78, + 128, + 0, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1165, + 10, + 1, + 142, + 'Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 1, + 99, + 138, + 128, + 0, + 248, + 20, + 1, + 6, + 128, + 1, + 177, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 1, + 254, + 138, + 128, + 0, + 218, + 20, + 1, + 6, + 128, + 1, + 177, + 1, + 254, + 138, + 128, + 0, + 228, + 0, + 'Factory', + 'This color is not factory by CSV. Left over from old CSV file.' + ), + ( + 1166, + 10, + 1, + 142, + 'Grabber Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb4tin', + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1167, + 10, + 1, + 142, + 'Grabber Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb4tin', + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 152, + 189, + 199, + 128, + 16, + 250, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1168, + 10, + 1, + 142, + 'Grabber Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb4tin', + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1169, + 10, + 1, + 142, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1170, + 10, + 1, + 142, + 'Medium Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1171, + 10, + 1, + 142, + 'Calypso Coral', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 11, + 232, + 242, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1172, + 10, + 1, + 142, + 'Bright Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 154, + 176, + 105, + 121, + 16, + 224, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1173, + 10, + 1, + 142, + 'Dark Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 31, + 92, + 73, + 128, + 0, + 236, + 31, + 92, + 73, + 128, + 0, + 236, + 20, + 10, + 1, + 128, + 0, + 178, + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 85, + 43, + 51, + 128, + 0, + 192, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1174, + 10, + 1, + 142, + 'Bright Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb4tin', + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 38, + 64, + 253, + 128, + 48, + 244, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1175, + 10, + 1, + 142, + 'Bright Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1176, + 10, + 1, + 142, + 'Pastel Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mb4tin', + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 147, + 64, + 255, + 128, + 32, + 240, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1177, + 10, + 1, + 142, + 'Light Ivy Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb4tin', + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 60, + 232, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Boss 429 CSV.' + ), + ( + 1178, + 10, + 1, + 210, + 'Candyapple Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mb3tin', + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 6, + 194, + 143, + 128, + 6, + 240, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1179, + 10, + 1, + 210, + 'Raven Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 254, + 207, + 78, + 128, + 0, + 244, + 254, + 207, + 78, + 128, + 0, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 20, + 10, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1180, + 10, + 1, + 210, + 'Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 1, + 99, + 138, + 128, + 0, + 248, + 20, + 1, + 6, + 128, + 1, + 177, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 1, + 254, + 138, + 128, + 0, + 218, + 20, + 1, + 6, + 128, + 1, + 177, + 1, + 254, + 138, + 128, + 0, + 228, + 0, + 'Factory', + 'This is not a factory color by CSV. Left over from old CSV file.' + ), + ( + 1181, + 10, + 1, + 210, + 'Grabber Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70statin', + 116, + 255, + 151, + 128, + 6, + 255, + 116, + 255, + 255, + 128, + 6, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 116, + 255, + 151, + 128, + 6, + 255, + 116, + 255, + 151, + 128, + 6, + 255, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1182, + 10, + 1, + 210, + 'Grabber Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70statin', + 152, + 189, + 199, + 128, + 16, + 250, + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 152, + 189, + 199, + 128, + 16, + 250, + 152, + 189, + 199, + 128, + 16, + 250, + 152, + 189, + 199, + 128, + 16, + 250, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1183, + 10, + 1, + 210, + 'Grabber Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70statin', + 19, + 255, + 255, + 128, + 78, + 225, + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 19, + 255, + 255, + 128, + 78, + 225, + 19, + 255, + 255, + 128, + 78, + 225, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1184, + 10, + 1, + 210, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 43, + 18, + 255, + 128, + 32, + 255, + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 43, + 18, + 255, + 128, + 32, + 255, + 43, + 18, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1185, + 10, + 1, + 210, + 'Medium Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 35, + 64, + 158, + 128, + 16, + 244, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 35, + 64, + 158, + 128, + 16, + 244, + 35, + 64, + 158, + 128, + 16, + 244, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1186, + 10, + 1, + 210, + 'Calypso Coral', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 11, + 232, + 242, + 128, + 24, + 255, + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 11, + 232, + 242, + 128, + 24, + 255, + 11, + 232, + 242, + 128, + 24, + 255, + 11, + 232, + 242, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1187, + 10, + 1, + 210, + 'Bright Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 154, + 176, + 105, + 121, + 16, + 224, + 154, + 176, + 105, + 121, + 16, + 224, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 154, + 176, + 105, + 121, + 16, + 224, + 154, + 176, + 105, + 121, + 16, + 224, + 154, + 176, + 105, + 121, + 16, + 224, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1188, + 10, + 1, + 210, + 'Dark Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 85, + 43, + 51, + 128, + 0, + 192, + 85, + 43, + 51, + 128, + 0, + 192, + 31, + 92, + 73, + 128, + 0, + 236, + 31, + 92, + 73, + 128, + 0, + 236, + 20, + 10, + 1, + 128, + 0, + 178, + 85, + 43, + 51, + 128, + 0, + 192, + 85, + 43, + 51, + 128, + 0, + 192, + 85, + 43, + 51, + 128, + 0, + 192, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1189, + 10, + 1, + 210, + 'Bright Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70statin', + 38, + 64, + 253, + 128, + 48, + 244, + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 38, + 64, + 253, + 128, + 48, + 244, + 38, + 64, + 253, + 128, + 48, + 244, + 38, + 64, + 253, + 128, + 48, + 244, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1190, + 10, + 1, + 210, + 'Bright Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 43, + 133, + 255, + 128, + 48, + 255, + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 43, + 133, + 255, + 128, + 48, + 255, + 43, + 133, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1191, + 10, + 1, + 210, + 'Pastel Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70statin', + 147, + 64, + 255, + 128, + 32, + 240, + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 147, + 64, + 255, + 128, + 32, + 240, + 147, + 64, + 255, + 128, + 32, + 240, + 147, + 64, + 255, + 128, + 32, + 240, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1192, + 10, + 1, + 210, + 'Light Ivy Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70statin', + 45, + 60, + 232, + 128, + 24, + 255, + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 45, + 60, + 232, + 128, + 24, + 255, + 45, + 60, + 232, + 128, + 24, + 255, + 45, + 60, + 232, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Mustang CSV.' + ), + ( + 1193, + 10, + 1, + 212, + 'Raven Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 20, + 10, + 1, + 128, + 0, + 177, + 1, + 253, + 163, + 128, + 24, + 242, + 254, + 207, + 78, + 128, + 0, + 244, + 254, + 207, + 78, + 128, + 0, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 20, + 10, + 1, + 128, + 0, + 177, + 1, + 253, + 163, + 128, + 24, + 242, + 20, + 10, + 1, + 128, + 0, + 177, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1194, + 10, + 1, + 212, + 'Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 1, + 99, + 138, + 128, + 0, + 248, + 20, + 1, + 6, + 128, + 1, + 177, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 1, + 254, + 138, + 128, + 0, + 218, + 20, + 1, + 6, + 128, + 1, + 177, + 1, + 254, + 138, + 128, + 0, + 228, + 0, + 'Factory', + 'This is not a factory color according to the CSV. Left over from old CSV.' + ), + ( + 1195, + 10, + 1, + 212, + 'Grabber Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 116, + 255, + 151, + 128, + 6, + 255, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1196, + 10, + 1, + 212, + 'Grabber Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 152, + 189, + 199, + 128, + 16, + 250, + 128, + 0, + 0, + 128, + 0, + 128, + 152, + 189, + 199, + 128, + 16, + 250, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1197, + 10, + 1, + 212, + 'Grabber Orange', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 128, + 0, + 0, + 128, + 0, + 128, + 19, + 255, + 255, + 128, + 78, + 225, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1198, + 10, + 1, + 212, + 'Wimbledon White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 18, + 255, + 128, + 32, + 255, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1199, + 10, + 1, + 212, + 'Medium Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 35, + 64, + 158, + 128, + 16, + 244, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1200, + 10, + 1, + 212, + 'Calypso Coral', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 11, + 232, + 242, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 11, + 232, + 242, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1201, + 10, + 1, + 212, + 'Bright Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 154, + 176, + 105, + 121, + 16, + 224, + 43, + 0, + 255, + 128, + 32, + 255, + 154, + 176, + 105, + 121, + 16, + 224, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1202, + 10, + 1, + 212, + 'Dark Ivy Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 31, + 92, + 73, + 128, + 0, + 236, + 31, + 92, + 73, + 128, + 0, + 236, + 20, + 10, + 1, + 128, + 0, + 178, + 85, + 43, + 51, + 128, + 0, + 192, + 35, + 64, + 158, + 128, + 16, + 244, + 85, + 43, + 51, + 128, + 0, + 192, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1203, + 10, + 1, + 212, + 'Bright Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 38, + 64, + 253, + 128, + 48, + 244, + 128, + 0, + 0, + 128, + 0, + 128, + 38, + 64, + 253, + 128, + 48, + 244, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1204, + 10, + 1, + 212, + 'Bright Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 43, + 133, + 255, + 128, + 48, + 255, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1205, + 10, + 1, + 212, + 'Pastel Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '70mactin', + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 147, + 64, + 255, + 128, + 32, + 240, + 128, + 0, + 0, + 128, + 0, + 128, + 147, + 64, + 255, + 128, + 32, + 240, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1206, + 10, + 1, + 212, + 'Light Ivy Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 250, + '70mactin', + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 128, + 0, + 124, + 128, + 61, + 176, + 128, + 0, + 124, + 128, + 61, + 176, + 20, + 10, + 1, + 128, + 0, + 178, + 45, + 60, + 232, + 128, + 24, + 255, + 128, + 0, + 0, + 128, + 0, + 128, + 45, + 60, + 232, + 128, + 24, + 255, + 0, + 'Factory', + 'As per 70 Mach 1 CSV.' + ), + ( + 1207, + 10, + 1, + 220, + 'Bolero Red', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 255, + 255, + 128, + 0, + 250, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 52, + 255, + 128, + 0, + 249, + 0, + 255, + 255, + 128, + 0, + 250, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1208, + 10, + 1, + 220, + 'Deepwater Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 148, + 255, + 54, + 152, + 0, + 202, + 148, + 255, + 54, + 152, + 0, + 202, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 170, + 33, + 54, + 128, + 0, + 231, + 148, + 255, + 54, + 152, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1209, + 10, + 1, + 220, + 'Capri Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 20, + 5, + 1, + 128, + 0, + 168, + 43, + 48, + 255, + 128, + 11, + 255, + 43, + 48, + 255, + 128, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1210, + 10, + 1, + 220, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 20, + 5, + 1, + 128, + 0, + 168, + 20, + 5, + 1, + 128, + 0, + 168, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 0, + 255, + 255, + 128, + 0, + 250, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1211, + 10, + 1, + 220, + 'Tahoe Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 142, + 58, + 138, + 0, + 201, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 2, + 128, + 0, + 214, + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 71, + 58, + 138, + 0, + 241, + 131, + 142, + 58, + 138, + 0, + 201, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1212, + 10, + 1, + 220, + 'Silverglaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 41, + 24, + 163, + 128, + 1, + 248, + 41, + 24, + 163, + 128, + 1, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1213, + 10, + 1, + 220, + 'Marina Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 142, + 181, + 171, + 128, + 0, + 233, + 142, + 181, + 171, + 128, + 0, + 233, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 255, + 128, + 60, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 121, + 40, + 171, + 128, + 0, + 249, + 142, + 181, + 171, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1214, + 10, + 1, + 220, + 'Butternut Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 32, + 175, + 255, + 128, + 20, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 35, + 82, + 255, + 128, + 7, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1215, + 10, + 1, + 220, + 'Verde Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 95, + 147, + 37, + 128, + 0, + 180, + 95, + 147, + 37, + 128, + 0, + 180, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 95, + 147, + 37, + 128, + 0, + 180, + 66, + 39, + 91, + 128, + 0, + 241, + 95, + 147, + 37, + 128, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1216, + 10, + 1, + 220, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 69, + 60, + 167, + 108, + 1, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 69, + 60, + 167, + 108, + 11, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1217, + 10, + 1, + 220, + 'Emerald Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 134, + 90, + 139, + 144, + 0, + 212, + 134, + 90, + 139, + 144, + 0, + 212, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 126, + 56, + 137, + 143, + 0, + 224, + 134, + 90, + 139, + 144, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1218, + 10, + 1, + 220, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 3, + 250, + 64, + 128, + 0, + 205, + 3, + 250, + 64, + 128, + 0, + 205, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 248, + 45, + 64, + 128, + 0, + 228, + 3, + 250, + 64, + 128, + 0, + 205, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1219, + 10, + 1, + 220, + 'Antique Pewter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 32, + 24, + 83, + 137, + 1, + 236, + 32, + 24, + 83, + 137, + 1, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1220, + 10, + 1, + 220, + 'Plum Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 231, + 253, + 44, + 128, + 0, + 181, + 231, + 253, + 44, + 128, + 0, + 181, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 231, + 49, + 44, + 128, + 0, + 253, + 231, + 253, + 44, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1221, + 10, + 1, + 220, + 'Sierra Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 26, + 28, + 147, + 138, + 0, + 249, + 26, + 58, + 147, + 138, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1222, + 10, + 1, + 220, + 'Nantucket Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 184, + 43, + 169, + 128, + 0, + 255, + 184, + 43, + 169, + 128, + 0, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 184, + 43, + 169, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 253, + 184, + 43, + 169, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1223, + 10, + 1, + 220, + 'Granada Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67z28tin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 36, + 33, + 168, + 138, + 0, + 249, + 36, + 104, + 168, + 138, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1224, + 10, + 1, + 219, + 'Deepwater Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 148, + 255, + 54, + 152, + 0, + 202, + 148, + 255, + 54, + 152, + 0, + 202, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 170, + 33, + 54, + 128, + 0, + 231, + 148, + 255, + 54, + 152, + 0, + 202, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1225, + 10, + 1, + 219, + 'Capri Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 20, + 5, + 1, + 128, + 0, + 168, + 43, + 48, + 255, + 128, + 11, + 255, + 43, + 48, + 255, + 128, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1226, + 10, + 1, + 219, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 20, + 5, + 1, + 128, + 0, + 168, + 20, + 5, + 1, + 128, + 0, + 168, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 0, + 255, + 255, + 128, + 0, + 250, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1227, + 10, + 1, + 219, + 'Tahoe Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 142, + 58, + 138, + 0, + 201, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 2, + 128, + 0, + 214, + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 71, + 58, + 138, + 0, + 241, + 131, + 142, + 58, + 138, + 0, + 201, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1228, + 10, + 1, + 219, + 'Silverglaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 41, + 24, + 163, + 128, + 1, + 248, + 41, + 24, + 163, + 128, + 1, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1229, + 10, + 1, + 219, + 'Marina Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 142, + 181, + 171, + 128, + 0, + 233, + 142, + 181, + 171, + 128, + 0, + 233, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 255, + 128, + 60, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 121, + 40, + 171, + 128, + 0, + 249, + 142, + 181, + 171, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1230, + 10, + 1, + 219, + 'Butternut Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 32, + 175, + 255, + 128, + 20, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 35, + 82, + 255, + 128, + 7, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1231, + 10, + 1, + 219, + 'Verde Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 95, + 147, + 37, + 128, + 0, + 180, + 95, + 147, + 37, + 128, + 0, + 180, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 95, + 147, + 37, + 128, + 0, + 180, + 66, + 39, + 91, + 128, + 0, + 241, + 95, + 147, + 37, + 128, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1232, + 10, + 1, + 219, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 69, + 60, + 167, + 108, + 1, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 69, + 60, + 167, + 108, + 11, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1233, + 10, + 1, + 219, + 'Emerald Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 134, + 90, + 139, + 144, + 0, + 212, + 134, + 90, + 139, + 144, + 0, + 212, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 126, + 56, + 137, + 143, + 0, + 224, + 134, + 90, + 139, + 144, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1234, + 10, + 1, + 219, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 3, + 250, + 64, + 128, + 0, + 205, + 3, + 250, + 64, + 128, + 0, + 205, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 248, + 45, + 64, + 128, + 0, + 228, + 3, + 250, + 64, + 128, + 0, + 205, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1235, + 10, + 1, + 219, + 'Antique Pewter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 32, + 24, + 83, + 137, + 1, + 236, + 32, + 24, + 83, + 137, + 1, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1236, + 10, + 1, + 219, + 'Plum Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 231, + 253, + 44, + 128, + 0, + 181, + 231, + 253, + 44, + 128, + 0, + 181, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 231, + 49, + 44, + 128, + 0, + 253, + 231, + 253, + 44, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1237, + 10, + 1, + 219, + 'Sierra Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 26, + 28, + 147, + 138, + 0, + 249, + 26, + 58, + 147, + 138, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1238, + 10, + 1, + 219, + 'Nantucket Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 184, + 43, + 169, + 128, + 0, + 255, + 184, + 43, + 169, + 128, + 0, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 184, + 43, + 169, + 128, + 0, + 255, + 233, + 0, + 255, + 128, + 0, + 253, + 184, + 43, + 169, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1239, + 10, + 1, + 219, + 'Granada Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67rsctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 36, + 33, + 168, + 138, + 0, + 249, + 36, + 104, + 168, + 138, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1240, + 10, + 1, + 140, + 'Capri Cream', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 2, + 184, + 73, + 128, + 0, + 239, + 2, + 184, + 73, + 128, + 0, + 239, + 30, + 15, + 255, + 128, + 60, + 255, + 20, + 5, + 1, + 128, + 0, + 168, + 43, + 48, + 255, + 128, + 11, + 255, + 43, + 48, + 255, + 128, + 23, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1241, + 10, + 1, + 140, + 'Tuxedo Black', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 20, + 5, + 1, + 128, + 0, + 168, + 20, + 5, + 1, + 128, + 0, + 168, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 0, + 255, + 255, + 128, + 0, + 250, + 20, + 5, + 1, + 128, + 0, + 208, + 20, + 5, + 1, + 128, + 0, + 168, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1242, + 10, + 1, + 140, + 'Tahoe Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 142, + 58, + 138, + 0, + 201, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 2, + 128, + 0, + 214, + 131, + 142, + 58, + 138, + 0, + 201, + 131, + 71, + 58, + 138, + 0, + 241, + 131, + 142, + 58, + 138, + 0, + 201, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1243, + 10, + 1, + 140, + 'Silverglaze', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 41, + 24, + 163, + 128, + 1, + 248, + 41, + 24, + 163, + 128, + 1, + 235, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1244, + 10, + 1, + 140, + 'Marina Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 142, + 181, + 171, + 128, + 0, + 233, + 142, + 181, + 171, + 128, + 0, + 233, + 32, + 26, + 207, + 128, + 20, + 248, + 32, + 26, + 207, + 128, + 20, + 248, + 30, + 15, + 255, + 128, + 60, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 121, + 40, + 171, + 128, + 0, + 249, + 142, + 181, + 171, + 128, + 0, + 233, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1245, + 10, + 1, + 140, + 'Butternut Yellow', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 32, + 175, + 255, + 128, + 20, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 35, + 82, + 255, + 128, + 7, + 255, + 32, + 175, + 255, + 128, + 20, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1246, + 10, + 1, + 140, + 'Provincial White', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 16, + 255, + 255, + 128, + 22, + 255, + 128, + 5, + 255, + 128, + 14, + 255, + 128, + 5, + 255, + 128, + 30, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1247, + 10, + 1, + 140, + 'Verde Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 95, + 147, + 37, + 128, + 0, + 180, + 95, + 147, + 37, + 128, + 0, + 180, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 95, + 147, + 37, + 128, + 0, + 180, + 66, + 39, + 91, + 128, + 0, + 241, + 95, + 147, + 37, + 128, + 0, + 180, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1248, + 10, + 1, + 140, + 'Mountain Green', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 69, + 60, + 167, + 108, + 1, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 69, + 60, + 167, + 108, + 11, + 255, + 69, + 60, + 167, + 108, + 1, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1249, + 10, + 1, + 140, + 'Emerald Turquoise', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 134, + 90, + 139, + 144, + 0, + 212, + 134, + 90, + 139, + 144, + 0, + 212, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 126, + 56, + 137, + 143, + 0, + 224, + 134, + 90, + 139, + 144, + 0, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1250, + 10, + 1, + 140, + 'Madeira Maroon', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 3, + 250, + 64, + 128, + 0, + 205, + 3, + 250, + 64, + 128, + 0, + 205, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 248, + 45, + 64, + 128, + 0, + 228, + 3, + 250, + 64, + 128, + 0, + 205, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1251, + 10, + 1, + 140, + 'Antique Pewter', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 32, + 24, + 83, + 137, + 1, + 236, + 32, + 24, + 83, + 137, + 1, + 212, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1252, + 10, + 1, + 140, + 'Plum Mist', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 231, + 253, + 44, + 128, + 0, + 181, + 231, + 253, + 44, + 128, + 0, + 181, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 231, + 49, + 44, + 128, + 0, + 253, + 231, + 253, + 44, + 128, + 0, + 181, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1253, + 10, + 1, + 140, + 'Sierra Fawn', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 22, + 104, + 94, + 128, + 0, + 245, + 22, + 104, + 94, + 128, + 0, + 245, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + 26, + 28, + 147, + 138, + 0, + 249, + 26, + 58, + 147, + 138, + 0, + 245, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1254, + 10, + 1, + 140, + 'Nantucket Blue', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 184, + 43, + 169, + 128, + 0, + 255, + 184, + 43, + 169, + 128, + 0, + 255, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 184, + 43, + 169, + 128, + 0, + 255, + 128, + 0, + 255, + 128, + 0, + 253, + 184, + 43, + 169, + 128, + 0, + 255, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1255, + 10, + 1, + 140, + 'Granada Gold', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 200, + '67ssctin', + 30, + 15, + 2, + 128, + 0, + 173, + 131, + 16, + 158, + 128, + 10, + 254, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 10, + 5, + 128, + 0, + 232, + 30, + 15, + 2, + 128, + 0, + 214, + 20, + 5, + 1, + 128, + 0, + 168, + NULL, + 33, + 168, + 138, + 0, + 249, + 36, + 104, + NULL, + 138, + 0, + 239, + 0, + 'Factory', + 'This is a factory stock color.' + ), + ( + 1256, + 10, + 1, + 113, + 'Lady Liberty', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10, + '57chemem', + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 176, + 194, + 71, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ), + ( + 1257, + 10, + 1, + 104, + 'All-American', + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + 10, + '57faimem', + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 154, + 99, + 84, + 128, + 0, + 255, + 0, + 'McCormack', + NULL + ); \ No newline at end of file diff --git a/migrations/0037-createNextPartNumberSeq.sql b/migrations/0037-createNextPartNumberSeq.sql new file mode 100644 index 000000000..b622e831d --- /dev/null +++ b/migrations/0037-createNextPartNumberSeq.sql @@ -0,0 +1,3 @@ +CREATE SEQUENCE part_partid_seq START +WITH + 1 INCREMENT BY 1 NO MINVALUE MAXVALUE 4294967295 CACHE 1 OWNED BY part.part_id; \ No newline at end of file diff --git a/migrations/0038-createWarehouse.sql b/migrations/0038-createWarehouse.sql new file mode 100644 index 000000000..e49e34c2f --- /dev/null +++ b/migrations/0038-createWarehouse.sql @@ -0,0 +1,14 @@ +CREATE TABLE + if not exists warehouse ( + branded_part_id int NOT NULL, + skin_id int NOT NULL, + player_id int NOT NULL, + qty_avail int NULL, + CONSTRAINT sys_pk_12148 PRIMARY KEY (branded_part_id, skin_id, player_id) + ); + +CREATE INDEX sys_idx_warehouse_brandedpartwarehouse_12775 ON warehouse (branded_part_id); + +CREATE INDEX sys_idx_warehouse_playerwarehouse_12776 ON warehouse (player_id); + +CREATE INDEX sys_idx_warehouse_skinwarehouse_12777 ON warehouse (skin_id); \ No newline at end of file diff --git a/migrations/0039-createLogin.sql b/migrations/0039-createLogin.sql new file mode 100644 index 000000000..165b4b80e --- /dev/null +++ b/migrations/0039-createLogin.sql @@ -0,0 +1,9 @@ +create table if not exists login ( + customer_id integer not null unique, + login_name varchar(32) not null, + password varchar(32) not null, + login_level smallint default 0 not null, + constraint login_login_pk primary key (login_name) +); + +create unique index if not exists login_name_idx on login (login_name); \ No newline at end of file diff --git a/migrations/0040-createProfile.sql b/migrations/0040-createProfile.sql new file mode 100644 index 000000000..48cf70cd4 --- /dev/null +++ b/migrations/0040-createProfile.sql @@ -0,0 +1,26 @@ +create table + if not exists profile ( + customer_id integer not null, + profile_name varchar(32) not null, + server_id integer default 0 not null, + create_stamp integer default extract(epoch from now())::integer not null, + last_login_stamp integer default extract(epoch from now())::integer not null, + number_games integer default 1 not null, + profile_id integer not null, + is_online boolean default false not null, + game_purchase_stamp integer default extract(epoch from now())::integer not null, + game_serial_number varchar(32) not null, + time_online integer not null, + time_in_game integer not null, + game_blob varchar(512) not null, + personal_blob varchar(256) not null, + picture_blob varchar(1) not null, + dnd boolean default false not null, + game_start_stamp integer default extract(epoch from now())::integer not null, + current_key varchar(400) not null, + profile_level smallint default 0 not null, + shard_id integer not null, + constraint profile_profile_pk primary key (profile_id) + ); + +create unique index if not exists profile_id_idx on profile (profile_id); \ No newline at end of file diff --git a/migrations/0041-createKey.sql b/migrations/0041-createKey.sql new file mode 100644 index 000000000..4b5603d8a --- /dev/null +++ b/migrations/0041-createKey.sql @@ -0,0 +1,7 @@ +create table if not exists key ( + profile_id integer not null, + session_key varchar(100) not null, + constraint key_profile_id_fk foreign key (profile_id) references profile (profile_id) +); + + diff --git a/package-lock.json b/package-lock.json index d95c9b938..6ce27680e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,19 @@ "name": "mcos", "version": "1.0.0", "license": "AGPL-3.0", + "workspaces": [ + "apps/main", + "packages/cli", + "packages/connection", + "packages/database", + "packages/gateway", + "packages/mcots", + "packages/nps", + "packages/patch", + "packages/shard", + "packages/shared", + "packages/shared-packets" + ], "dependencies": { "@adminjs/sequelize": "^4.1.1", "@fastify/sensible": "^5.5.0", @@ -48,732 +61,1009 @@ "vitest": "^1.1.0" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "apps/main": { + "name": "rusty-motors-server", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "@sentry/profiling-node": "^8.0.0", + "rusty-motors-gateway": "^1.0.0", + "rusty-motors-shared": "^1.0.0", + "tsx": "^4.10.2", + "typescript": "^5.4.5" } }, - "node_modules/@adminjs/design-system": { - "version": "4.0.2", + "apps/main/node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@hypnosphi/create-react-context": "^0.3.1", - "@tiptap/core": "2.0.1", - "@tiptap/extension-bubble-menu": "2.0.1", - "@tiptap/extension-character-count": "2.0.1", - "@tiptap/extension-code": "2.0.1", - "@tiptap/extension-document": "2.0.1", - "@tiptap/extension-floating-menu": "2.0.1", - "@tiptap/extension-heading": "2.0.1", - "@tiptap/extension-image": "2.0.1", - "@tiptap/extension-link": "2.0.1", - "@tiptap/extension-table": "2.0.1", - "@tiptap/extension-table-cell": "2.0.1", - "@tiptap/extension-table-header": "2.0.1", - "@tiptap/extension-table-row": "2.0.1", - "@tiptap/extension-text": "2.0.1", - "@tiptap/extension-text-align": "2.0.1", - "@tiptap/extension-typography": "2.0.1", - "@tiptap/pm": "2.0.1", - "@tiptap/react": "2.0.1", - "@tiptap/starter-kit": "2.0.1", - "date-fns": "^2.29.3", - "flat": "^5.0.2", - "jw-paginate": "^1.0.4", - "lodash": "^4.17.21", - "polished": "^4.2.2", - "react-currency-input-field": "^3.6.10", - "react-datepicker": "^4.10.0", - "react-feather": "^2.0.10", - "react-phone-input-2": "^2.15.1", - "react-select": "^5.7.2", - "react-text-mask": "^5.5.0", - "styled-components": "5.3.9", - "styled-system": "^5.1.5", - "text-mask-addons": "^3.8.0" - }, - "peerDependencies": { - "react": "^18.1.0", - "react-dom": "^18.1.0" + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@adminjs/sequelize": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@adminjs/sequelize/-/sequelize-4.1.1.tgz", - "integrity": "sha512-HKOuuFn79tvW6xKP+v7FvKc6V7vERlmdEu9oAAR3gz6SE3T+V7Uz8N+trwngFhOpTWVcuws2FchFvKG3Xrm9iw==", - "dependencies": { - "escape-regexp": "0.0.1" - }, - "peerDependencies": { - "adminjs": "^7.0.0", - "sequelize": ">=6" + "apps/main/node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "apps/main/node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", + "apps/main/node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", + "apps/main/node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/core": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=18" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "apps/main/node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, + "apps/main/node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", + "apps/main/node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "apps/main/node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=18" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=18" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", + "apps/main/node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "apps/main/node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, + "apps/main/node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", + "apps/main/node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", + "apps/main/node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=18" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", + "apps/main/node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", + "apps/main/node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", + "apps/main/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=14.18" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", + "apps/main/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", + "apps/main/node_modules/@sentry/profiling-node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.26.0.tgz", + "integrity": "sha512-yGHFoqSKe5j9fDK9n5ntJxDyZnedwjCm6fAXwIlsLJOUBqn5g7l8V1XgBPlCJLZzOG0fbvGvSo4WyBfDoSD8vQ==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@sentry/core": "8.26.0", + "@sentry/node": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "detect-libc": "^2.0.2", + "node-abi": "^3.61.0" + }, + "bin": { + "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", + "apps/main/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", + "apps/main/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.22.5" + "@sentry/types": "8.26.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "apps/main/node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6.9.0" + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "apps/main/node_modules/tsx": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz", + "integrity": "sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==", + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", + "node_modules/@adminjs/design-system": { + "version": "4.0.2", "license": "MIT", + "dependencies": { + "@hypnosphi/create-react-context": "^0.3.1", + "@tiptap/core": "2.0.1", + "@tiptap/extension-bubble-menu": "2.0.1", + "@tiptap/extension-character-count": "2.0.1", + "@tiptap/extension-code": "2.0.1", + "@tiptap/extension-document": "2.0.1", + "@tiptap/extension-floating-menu": "2.0.1", + "@tiptap/extension-heading": "2.0.1", + "@tiptap/extension-image": "2.0.1", + "@tiptap/extension-link": "2.0.1", + "@tiptap/extension-table": "2.0.1", + "@tiptap/extension-table-cell": "2.0.1", + "@tiptap/extension-table-header": "2.0.1", + "@tiptap/extension-table-row": "2.0.1", + "@tiptap/extension-text": "2.0.1", + "@tiptap/extension-text-align": "2.0.1", + "@tiptap/extension-typography": "2.0.1", + "@tiptap/pm": "2.0.1", + "@tiptap/react": "2.0.1", + "@tiptap/starter-kit": "2.0.1", + "date-fns": "^2.29.3", + "flat": "^5.0.2", + "jw-paginate": "^1.0.4", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "react-currency-input-field": "^3.6.10", + "react-datepicker": "^4.10.0", + "react-feather": "^2.0.10", + "react-phone-input-2": "^2.15.1", + "react-select": "^5.7.2", + "react-text-mask": "^5.5.0", + "styled-components": "5.3.9", + "styled-system": "^5.1.5", + "text-mask-addons": "^3.8.0" + }, + "peerDependencies": { + "react": "^18.1.0", + "react-dom": "^18.1.0" + } + }, + "node_modules/@adminjs/sequelize": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@adminjs/sequelize/-/sequelize-4.1.1.tgz", + "integrity": "sha512-HKOuuFn79tvW6xKP+v7FvKc6V7vERlmdEu9oAAR3gz6SE3T+V7Uz8N+trwngFhOpTWVcuws2FchFvKG3Xrm9iw==", + "dependencies": { + "escape-regexp": "0.0.1" + }, + "peerDependencies": { + "adminjs": "^7.0.0", + "sequelize": ">=6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=6.9.0" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", + "node_modules/@babel/code-frame": { + "version": "7.22.13", "license": "MIT", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { "version": "7.22.15", "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.15", "@babel/template": "^7.22.15", "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/types": "^7.22.15", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "license": "MIT", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "node_modules/@babel/helper-compilation-targets": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "license": "MIT", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { + "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/types": "^7.22.15" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-jsx": { + "node_modules/@babel/helper-optimise-call-expression": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", + "node_modules/@babel/helpers": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", + "node_modules/@babel/highlight": { + "version": "7.22.13", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, "engines": { "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -782,33 +1072,27 @@ "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-async-generator-functions": { + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, "engines": { "node": ">=6.9.0" }, @@ -816,38 +1100,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -856,48 +1133,31 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { + "node_modules/@babel/plugin-syntax-import-assertions": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -906,8 +1166,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -919,21 +1179,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { + "node_modules/@babel/plugin-syntax-jsx": { "version": "7.22.5", "license": "MIT", "dependencies": { @@ -946,82 +1212,71 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1030,11 +1285,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1043,12 +1298,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1057,24 +1311,24 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { + "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1084,13 +1338,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { + "node_modules/@babel/plugin-transform-async-generator-functions": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1099,14 +1354,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-module-imports": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1115,11 +1369,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { + "node_modules/@babel/plugin-transform-block-scoped-functions": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1129,24 +1382,24 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { + "node_modules/@babel/plugin-transform-class-properties": { "version": "7.22.5", "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1156,26 +1409,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "node_modules/@babel/plugin-transform-class-static-block": { "version": "7.22.11", "license": "MIT", "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", "license": "MIT", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" @@ -1184,15 +1445,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1201,12 +1459,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1215,12 +1472,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1229,13 +1486,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1244,11 +1499,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1257,11 +1513,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-methods": { + "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1271,14 +1527,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-private-property-in-object": { + "node_modules/@babel/plugin-transform-export-namespace-from": { "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1287,8 +1541,8 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -1300,10 +1554,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-display-name": { + "node_modules/@babel/plugin-transform-function-name": { "version": "7.22.5", "license": "MIT", "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1313,15 +1569,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1330,11 +1583,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx-development": { + "node_modules/@babel/plugin-transform-literals": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1343,12 +1596,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1357,12 +1610,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1371,10 +1623,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { + "node_modules/@babel/plugin-transform-modules-amd": { "version": "7.22.5", "license": "MIT", "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1384,16 +1637,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime": { + "node_modules/@babel/plugin-transform-modules-commonjs": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "semver": "^6.3.1" + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1402,17 +1652,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-shorthand-properties": { + "node_modules/@babel/plugin-transform-modules-umd": { "version": "7.22.5", "license": "MIT", "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1422,21 +1682,21 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-spread": { + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-transform-sticky-regex": { + "node_modules/@babel/plugin-transform-new-target": { "version": "7.22.5", "license": "MIT", "dependencies": { @@ -1449,11 +1709,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1462,11 +1723,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1475,14 +1737,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { + "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1491,11 +1754,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1504,12 +1768,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1518,11 +1782,25 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { @@ -1532,104 +1810,28 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "node_modules/@babel/plugin-transform-private-methods": { "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.15", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1638,35 +1840,24 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-react": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1675,15 +1866,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-typescript": { + "node_modules/@babel/plugin-transform-react-jsx": { "version": "7.22.15", "license": "MIT", "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-typescript": "^7.22.15" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1692,15 +1883,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/register": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1709,229 +1896,884 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.14.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.22.15", + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.15", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/cache": { - "version": "11.11.0", + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.15", "license": "MIT", "dependencies": { - "@emotion/memoize": "^0.8.1" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.11.1", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" + "@babel/helper-plugin-utils": "^7.22.5" }, - "peerDependencies": { - "react": ">=16.8.0" + "engines": { + "node": ">=6.9.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", "license": "MIT", "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "react": ">=16.8.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", - "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, "engines": { - "node": ">=12" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", - "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", - "cpu": [ + "node_modules/@babel/preset-env": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.15", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-typescript": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@databases/connection-pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@databases/connection-pool/-/connection-pool-1.1.0.tgz", + "integrity": "sha512-/12/SNgl0V77mJTo5SX3yGPz4c9XGQwAlCfA0vlfs/0HcaErNpYXpmhj0StET07w6TmTJTnaUgX2EPcQK9ez5A==", + "dependencies": { + "@databases/queue": "^1.0.0", + "is-promise": "^4.0.0" + } + }, + "node_modules/@databases/escape-identifier": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", + "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", + "dependencies": { + "@databases/validate-unicode": "^1.0.0" + } + }, + "node_modules/@databases/lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@databases/lock/-/lock-2.1.0.tgz", + "integrity": "sha512-ReWnFE5qeCuO2SA5h5fDh/hE/vMolA+Epe6xkAQP1FL2nhnsTCYwN2JACk/kWctR4OQoh0njBjPZ0yfIptclcA==", + "dependencies": { + "@databases/queue": "^1.0.0" + } + }, + "node_modules/@databases/pg": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@databases/pg/-/pg-5.5.0.tgz", + "integrity": "sha512-WIojK9AYIlNi5YRfc5YUOow3PQ82ClmwT9HG3nEsKLUERYieoVmHMYDQLS0ry6FjgJx+2yFs7LCw4kZpWu1TBw==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@databases/escape-identifier": "^1.0.3", + "@databases/pg-config": "^3.2.0", + "@databases/pg-connection-string": "^1.0.0", + "@databases/pg-data-type-id": "^3.0.0", + "@databases/pg-errors": "^1.0.0", + "@databases/push-to-async-iterable": "^3.0.0", + "@databases/shared": "^3.1.0", + "@databases/split-sql-query": "^1.0.4", + "@databases/sql": "^3.3.0", + "assert-never": "^1.2.1", + "pg": "^8.4.2", + "pg-cursor": "^2.4.2" + } + }, + "node_modules/@databases/pg-bulk": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-bulk/-/pg-bulk-1.2.0.tgz", + "integrity": "sha512-GdzwFIllgOtuKbro4r6QBe0+4LipaUwb8+N7+z9QP+wg3XozGLnojnMFQlBrrc70jycw4aCM1O30w4vYtVlR/Q==", + "peerDependencies": { + "@databases/pg": "*" + } + }, + "node_modules/@databases/pg-config": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-config/-/pg-config-3.2.0.tgz", + "integrity": "sha512-hoPAK/F8gLcLgEJ8mLSnNvRlKqShwx5+GglDHIIfQhKF+Zz6M6QceiOefckS4WSjA0x2HClPvpercnXp9i24ag==", + "dependencies": { + "cosmiconfig": "^8.1.0", + "funtypes": "^4.1.0" + } + }, + "node_modules/@databases/pg-config/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@databases/pg-connection-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-connection-string/-/pg-connection-string-1.0.0.tgz", + "integrity": "sha512-8czOF9jlv7PlS7BPjnL82ynpDs1t8cu+C2jvdtMr37e8daPKMS7n1KfNE9xtr2Gq4QYKjynep097eYa5yIwcLA==" + }, + "node_modules/@databases/pg-data-type-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-data-type-id/-/pg-data-type-id-3.0.0.tgz", + "integrity": "sha512-VqW1csN8pRsWJxjPsGIC9FQ8wyenfmGv0P//BaeDMAu/giM3IXKxKM8fkScUSQ00uqFK/L1iHS5g6dgodF3XzA==" + }, + "node_modules/@databases/pg-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-errors/-/pg-errors-1.0.0.tgz", + "integrity": "sha512-Yz3exbptZwOn4ZD/MSwY6z++XVyOFsMh5DERvSw3awRwJFnfdaqdeiIxxX0MVjM6KPihF0xxp8lPO7vTc5ydpw==" + }, + "node_modules/@databases/pg-schema-cli": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-cli/-/pg-schema-cli-4.4.0.tgz", + "integrity": "sha512-pwLEjFrPl8Gk+7KmSbHHW9kYnUIWN9/V8DCb9Gwee7hXRkZeEZg9thdprG/ngxIdf983MfHyA/8np78IyNyhqg==", + "dependencies": { + "@databases/pg-config": "^3.2.0", + "@databases/pg-schema-introspect": "^4.2.0", + "@databases/pg-schema-print-types": "^4.5.0", + "chalk": "^4.1.0", + "interrogator": "^2.0.0", + "is-interactive": "^1.0.0", + "parameter-reducers": "^2.0.0" + }, + "bin": { + "pg-schema": "lib/cli.js" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@databases/pg-schema-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-introspect": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-introspect/-/pg-schema-introspect-4.2.0.tgz", + "integrity": "sha512-WaN79kbMwiQCS78XlCVOPE+Q6Go2gF3FNqatGWUZHnbHn+NR8I/5/1uC7T8HTruC5UfTe3CcCNPUglVad2YoVg==", + "dependencies": { + "@databases/pg": "^5.5.0" + } + }, + "node_modules/@databases/pg-schema-print-types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-print-types/-/pg-schema-print-types-4.5.0.tgz", + "integrity": "sha512-HlCHVPuu+qm1oNgkp+v3exdvmeJxflZnDTL6D6eSr3yMSClMQ7JBzCthymazWyZ9s4qsHO6gXfNhgUgjUz6LFw==", + "dependencies": { + "@databases/pg-config": "^3.2.0", + "@databases/pg-data-type-id": "^3.0.0", + "@databases/shared-print-types": "^1.2.0", + "assert-never": "^1.2.1" + }, + "peerDependencies": { + "@databases/pg-schema-introspect": "*" + } + }, + "node_modules/@databases/pg-typed": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@databases/pg-typed/-/pg-typed-4.4.1.tgz", + "integrity": "sha512-7UU7RzVKsB3WUfDm3rMI0x0lw79oNtzGQLTG5tVrpSlUxvHBRaZWm4F6kiov3Wo/HVxtQA+d9trGHcvfGOh+dw==", + "dependencies": { + "@databases/pg-bulk": "^1.2.0" + }, + "peerDependencies": { + "@databases/pg": "*" + } + }, + "node_modules/@databases/push-to-async-iterable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@databases/push-to-async-iterable/-/push-to-async-iterable-3.0.0.tgz", + "integrity": "sha512-xwu/yNgINdMU+fn6UwFsxh+pa6UrVPafY+0qm0RK0/nKyjllfDqSbwK4gSmdmLEwPYxKwch9CAE3P8NxN1hPSg==", + "dependencies": { + "@databases/queue": "^1.0.0" + } + }, + "node_modules/@databases/queue": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@databases/queue/-/queue-1.0.1.tgz", + "integrity": "sha512-dqRU+/aQ4lhFzjPIkIhjB0+UEKMb76FoBgHOJUTcEblgatr/IhdhHliT3VVwcImXh35Mz297PAXE4yFM4eYWUQ==" + }, + "node_modules/@databases/shared": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@databases/shared/-/shared-3.1.0.tgz", + "integrity": "sha512-bO1DIYAYDiWOCqVPvBio1JqZQYh4dph2M1av2w/REeFT6WBd64mTrOFlcxKV0CUAYT0UiJsDfPqEfw0/APRzWg==", + "dependencies": { + "@databases/connection-pool": "^1.1.0", + "@databases/lock": "^2.1.0", + "@databases/queue": "^1.0.1", + "@databases/split-sql-query": "^1.0.4", + "@databases/sql": "^3.3.0" + } + }, + "node_modules/@databases/shared-print-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@databases/shared-print-types/-/shared-print-types-1.2.0.tgz", + "integrity": "sha512-/TLxh4s1nbMU6fcqZd0u7KXaBvs7/kBDW92kLhkfKqB53vvhdnszOVlrX8G07697qffvtZuF4jLZjKceQcEmDw==", + "dependencies": { + "camelcase": "^6.1.0", + "mkdirp": "^1.0.4", + "pluralize": "^8.0.0", + "uppercamelcase": "^3.0.0" + } + }, + "node_modules/@databases/shared-print-types/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@databases/split-sql-query": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@databases/split-sql-query/-/split-sql-query-1.0.4.tgz", + "integrity": "sha512-lDqDQvH34NNjLs0knaDvL6HKgPtishQlDYHfOkvbAd5VQOEhcDvvmG2zbBuFvS2HQAz5NsyLj5erGaxibkxhvQ==", + "peerDependencies": { + "@databases/sql": "*" + } + }, + "node_modules/@databases/sql": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", + "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==" + }, + "node_modules/@databases/validate-unicode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", + "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", + "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", + "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", + "cpu": [ "arm" ], "dev": true, @@ -2044,610 +2886,1090 @@ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", "cpu": [ - "arm" + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", + "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", + "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", + "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", + "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", + "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", + "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", + "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", + "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", + "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", + "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", + "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", + "cpu": [ + "x64" ], "dev": true, "optional": true, "os": [ - "linux" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", - "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", + "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-ia32": { + "node_modules/@esbuild/win32-ia32": { "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", - "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", + "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", "cpu": [ "ia32" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { + "node_modules/@esbuild/win32-x64": { "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", - "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", + "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", "cpu": [ - "loong64" + "x64" ], "dev": true, "optional": true, "os": [ - "linux" + "win32" ], "engines": { - "node": ">=12" + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/@fastify/error": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", + "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/sensible": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", + "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "fast-deep-equal": "^3.1.1", + "fastify-plugin": "^4.0.0", + "forwarded": "^0.2.0", + "http-errors": "^2.0.0", + "type-is": "^1.6.18", + "vary": "^1.1.2" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/@hello-pangea/dnd": { + "version": "16.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.22.5", + "css-box-model": "^1.2.1", + "memoize-one": "^6.0.0", + "raf-schd": "^4.0.3", + "react-redux": "^8.1.1", + "redux": "^4.2.1", + "use-memo-one": "^1.1.3" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "engines": { + "node": ">=18" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", - "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", - "cpu": [ - "mips64el" - ], + "node_modules/@isaacs/cliui": { + "version": "8.0.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", - "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", - "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", - "cpu": [ - "riscv64" - ], + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", - "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": ">=12" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", - "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", - "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", - "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6.0.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", - "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", - "cpu": [ - "x64" - ], + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.5", "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, "engines": { - "node": ">=12" + "node": ">=v12.0.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", - "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@lukeed/ms": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.1.tgz", + "integrity": "sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", - "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", - "cpu": [ - "ia32" - ], + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", - "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", - "cpu": [ - "x64" - ], + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", "dev": true, - "optional": true, - "os": [ - "win32" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 8" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "engines": { + "node": ">=14" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", "dependencies": { - "type-fest": "^0.20.2" + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" }, "engines": { - "node": ">=8" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", + "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/connect": "3.4.36" + }, "engines": { - "node": ">=10" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", + "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", + "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/@fastify/error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", - "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", + "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", "dependencies": { - "fast-json-stringify": "^5.7.0" + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@fastify/sensible": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", - "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", + "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", "dependencies": { - "@lukeed/ms": "^2.0.1", - "fast-deep-equal": "^3.1.1", - "fastify-plugin": "^4.0.0", - "forwarded": "^0.2.0", - "http-errors": "^2.0.0", - "type-is": "^1.6.18", - "vary": "^1.1.2" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@floating-ui/core": { - "version": "1.4.1", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", "dependencies": { - "@floating-ui/utils": "^0.1.1" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/@hello-pangea/dnd": { - "version": "16.3.0", - "license": "Apache-2.0", + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", + "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", "dependencies": { - "@babel/runtime": "^7.22.5", - "css-box-model": "^1.2.1", - "memoize-one": "^6.0.0", - "raf-schd": "^4.0.3", - "react-redux": "^8.1.1", - "redux": "^4.2.1", - "use-memo-one": "^1.1.3" + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", + "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.40.0.tgz", + "integrity": "sha512-niRi5ZUnkgzRhIGMOozTyoZIvJKNJyhijQI4nF4iFSb+FUx2v5fngfR+8XLmdQAO7xmsD8E5vEGdDVYVtKbZew==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, "engines": { - "node": ">=12.22" + "node": ">=14" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "dev": true, - "license": "Apache-2.0", + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", + "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" + }, "engines": { - "node": ">=6.9.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@hypnosphi/create-react-context": { - "version": "0.3.1", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", + "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" }, "peerDependencies": { - "prop-types": "^15.0.0", - "react": ">=0.14.0" + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", + "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" }, "engines": { - "node": ">=12" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", + "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", "dependencies": { - "ansi-regex": "^6.0.1" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" }, "engines": { - "node": ">=12" + "node": ">=14" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", "dependencies": { - "@sinclair/typebox": "^0.27.8" + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", "engines": { - "node": ">=6.0.0" + "node": ">=4" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "license": "MIT", + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.0.tgz", + "integrity": "sha512-H7IfGTqW2reLXqput4yzAe8YpDC0fmVNal95GHMLOrS89W+qWUKIqxolSh63hJyfmwPSFwXASzj7wpSk8Az+Dg==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" } }, - "node_modules/@jsdoc/salty": { - "version": "0.2.5", - "dev": true, - "license": "Apache-2.0", + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", "dependencies": { - "lodash": "^4.17.21" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { - "node": ">=v12.0.0" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@lukeed/ms": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.1.tgz", - "integrity": "sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==", + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", "engines": { - "node": ">= 8" + "node": ">=14" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "@opentelemetry/core": "^1.1.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" } }, "node_modules/@pkgjs/parseargs": { @@ -2686,6 +4008,16 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@prisma/instrumentation": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.17.0.tgz", + "integrity": "sha512-c1Sle4ji8aasMcYfBBHFM56We4ljfenVtRmS8aY06BllS7SoU6SmJBwG7vil+GHiR0Yrh+t9iBwt4AY0Jr4KNQ==", + "dependencies": { + "@opentelemetry/api": "^1.8", + "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", + "@opentelemetry/sdk-trace-base": "^1.22" + } + }, "node_modules/@redux-devtools/extension": { "version": "3.2.5", "license": "MIT", @@ -2942,169 +4274,192 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.8.0.tgz", - "integrity": "sha512-zdTObFRoNENrdPpnTNnhOljYIcOX7aI7+7wyrSpPFFIOf/nRdedE6IYsjaBE7tjukphh1tMTojgJ7p3lKY8x6Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.8.0.tgz", - "integrity": "sha512-aiItwP48BiGpMFS9Znjo/xCNQVwTQVcRKkFKsO81m8exrGjHkCBDvm9PHay2kpa8RPnZzzKcD1iQ9KaLY4fPQQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.8.0.tgz", - "integrity": "sha512-zhNIS+L4ZYkYQUjIQUR6Zl0RXhbbA0huvNIWjmPc2SL0cB1h5Djkcy+RZ3/Bwszfb6vgwUvcVJYD6e6Zkpsi8g==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.8.0.tgz", - "integrity": "sha512-A/FAHFRNQYrELrb/JHncRWzTTXB2ticiRFztP4ggIUAfa9Up1qfW8aG2w/mN9jNiZ+HB0t0u0jpJgFXG6BfRTA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.8.0.tgz", - "integrity": "sha512-JsidBnh3p2IJJA4/2xOF2puAYqbaczB3elZDT0qHxn362EIoIkq7hrR43Xa8RisgI6/WPfvb2umbGsuvf7E37A==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.8.0.tgz", - "integrity": "sha512-hBNCnqw3EVCkaPB0Oqd24bv8SklETptQWcJz06kb9OtiShn9jK1VuTgi7o4zPSt6rNGWQOTDEAccbk0OqJmS+g==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.8.0.tgz", - "integrity": "sha512-Fw9ChYfJPdltvi9ALJ9wzdCdxGw4wtq4t1qY028b2O7GwB5qLNSGtqMsAel1lfWTZvf4b6/+4HKp0GlSYg0ahA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", "cpu": [ "arm64" ], - "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.8.0.tgz", - "integrity": "sha512-BH5xIh7tOzS9yBi8dFrCTG8Z6iNIGWGltd3IpTSKp6+pNWWO6qy8eKoRxOtwFbMrid5NZaidLYN6rHh9aB8bEw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", "cpu": [ "riscv64" ], - "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.8.0.tgz", - "integrity": "sha512-PmvAj8k6EuWiyLbkNpd6BLv5XeYFpqWuRvRNRl80xVfpGXK/z6KYXmAgbI4ogz7uFiJxCnYcqyvZVD0dgFog7Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.8.0.tgz", - "integrity": "sha512-mdxnlW2QUzXwY+95TuxZ+CurrhgrPAMveDWI97EQlA9bfhR8tw3Pt7SUlc/eSlCNxlWktpmT//EAA8UfCHOyXg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.8.0.tgz", - "integrity": "sha512-ge7saUz38aesM4MA7Cad8CHo0Fyd1+qTaqoIo+Jtk+ipBi4ATSrHWov9/S4u5pbEQmLjgUjB7BJt+MiKG2kzmA==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.8.0.tgz", - "integrity": "sha512-p9E3PZlzurhlsN5h9g7zIP1DnqKXJe8ZUkFwAazqSvHuWfihlIISPxG9hCHCoA+dOOspL/c7ty1eeEVFTE0UTw==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.8.0.tgz", - "integrity": "sha512-kb4/auKXkYKqlUYTE8s40FcJIj5soOyRLHKd4ugR0dCq0G2EfcF54eYcfQiGkHzjidZ40daB4ulsFdtqNKZtBg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -3293,6 +4648,57 @@ "node": ">=8" } }, + "node_modules/@sentry/opentelemetry": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.26.0.tgz", + "integrity": "sha512-HBDheM/+ysfIz8R1OH4bBIxdgD7ZbQkKLJAUXkdAbBcfbpK/CTtwcplbauF5wY7Q+GYvwL/ShuDwvXRfW+gFyQ==", + "dependencies": { + "@sentry/core": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, "node_modules/@sentry/profiling-node": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-1.3.2.tgz", @@ -3334,8 +4740,7 @@ "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" }, "node_modules/@styled-system/background": { "version": "5.1.2", @@ -3886,6 +5291,14 @@ "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", "dev": true }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/debug": { "version": "4.1.8", "license": "MIT", @@ -3905,8 +5318,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "license": "MIT" + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", @@ -3916,11 +5330,6 @@ "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "dev": true, - "license": "MIT" - }, "node_modules/@types/json-schema": { "version": "7.0.12", "dev": true, @@ -3954,6 +5363,14 @@ "version": "0.7.31", "license": "MIT" }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "20.10.5", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", @@ -3979,6 +5396,24 @@ "version": "4.0.0", "license": "MIT" }, + "node_modules/@types/pg": { + "version": "8.11.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", + "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, "node_modules/@types/prop-types": { "version": "15.7.5", "license": "MIT" @@ -4013,6 +5448,11 @@ "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + }, "node_modules/@types/sinon": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz", @@ -4245,9 +5685,9 @@ "dev": true }, "node_modules/@vitest/coverage-v8": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.1.0.tgz", - "integrity": "sha512-kHQRk70vTdXAyQY2C0vKOHPyQD/R6IUzcGdO4vCuyr4alE5Yg1+Sk2jSdjlIrTTXdcNEs+ReWVM09mmSFJpzyQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -4255,30 +5695,29 @@ "debug": "^4.3.4", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^4.0.1", + "istanbul-lib-source-maps": "^5.0.4", "istanbul-reports": "^3.1.6", "magic-string": "^0.30.5", - "magicast": "^0.3.2", + "magicast": "^0.3.3", "picocolors": "^1.0.0", "std-env": "^3.5.0", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.2.0" + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "^1.0.0" + "vitest": "1.6.0" } }, "node_modules/@vitest/expect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.1.0.tgz", - "integrity": "sha512-9IE2WWkcJo2BR9eqtY5MIo3TPmS50Pnwpm66A6neb2hvk/QSLfPXBz2qdiwUOQkwyFuuXEUj5380CbwfzW4+/w==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dependencies": { - "@vitest/spy": "1.1.0", - "@vitest/utils": "1.1.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -4286,12 +5725,11 @@ } }, "node_modules/@vitest/runner": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.1.0.tgz", - "integrity": "sha512-zdNLJ00pm5z/uhbWF6aeIJCGMSyTyWImy3Fcp9piRGvueERFlQFbUwCpzVce79OLm2UHk9iwaMSOaU9jVHgNVw==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", "dependencies": { - "@vitest/utils": "1.1.0", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -4303,7 +5741,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, "dependencies": { "yocto-queue": "^1.0.0" }, @@ -4315,10 +5752,9 @@ } }, "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { "node": ">=12.20" }, @@ -4327,10 +5763,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.1.0.tgz", - "integrity": "sha512-5O/wyZg09V5qmNmAlUgCBqflvn2ylgsWJRRuPrnHEfDNT6tQpQ8O1isNGgo+VxofISHqz961SG3iVvt3SPK/QQ==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", "dependencies": { "magic-string": "^0.30.5", "pathe": "^1.1.1", @@ -4341,10 +5776,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.1.0.tgz", - "integrity": "sha512-sNOVSU/GE+7+P76qYo+VXdXhXffzWZcYIPQfmkiRxaNCSPiLANvQx5Mx6ZURJ/ndtEkUJEpvKLXqAYTKEY+lTg==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dependencies": { "tinyspy": "^2.2.0" }, @@ -4353,12 +5787,12 @@ } }, "node_modules/@vitest/utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.1.0.tgz", - "integrity": "sha512-z+s510fKmYz4Y41XhNs3vcuFTFhcij2YF7F8VQfMEYAAUfqQh0Zfg7+w9xdgFGhPf3tX3TicAe+8BDITk6ampQ==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dependencies": { "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", "loupe": "^2.3.7", "pretty-format": "^29.7.0" }, @@ -4366,6 +5800,14 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -4382,8 +5824,9 @@ "license": "MIT" }, "node_modules/acorn": { - "version": "8.10.0", - "license": "MIT", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "bin": { "acorn": "bin/acorn" }, @@ -4391,6 +5834,23 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "optional": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "dev": true, @@ -4400,9 +5860,12 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -4561,10 +6024,6 @@ "node": ">=4" } }, - "node_modules/archy": { - "version": "1.0.0", - "license": "MIT" - }, "node_modules/arg": { "version": "4.1.3", "license": "MIT" @@ -4595,11 +6054,15 @@ "node": ">=0.10.0" } }, + "node_modules/assert-never": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.3.0.tgz", + "integrity": "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==" + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, "engines": { "node": "*" } @@ -4617,12 +6080,12 @@ } }, "node_modules/avvio": { - "version": "8.2.1", - "license": "MIT", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", "dependencies": { - "archy": "^1.0.0", - "debug": "^4.0.0", - "fastq": "^1.6.1" + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" } }, "node_modules/axios": { @@ -4861,7 +6324,6 @@ "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, "engines": { "node": ">=8" } @@ -4957,10 +6419,9 @@ } }, "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -4968,7 +6429,7 @@ "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" }, "engines": { "node": ">=4" @@ -4986,11 +6447,15 @@ "node": ">=4" } }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, "dependencies": { "get-func-name": "^2.0.2" }, @@ -4998,6 +6463,11 @@ "node": "*" } }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" + }, "node_modules/classnames": { "version": "2.3.2", "license": "MIT" @@ -5079,6 +6549,14 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, "node_modules/cliui": { "version": "7.0.4", "dev": true, @@ -5193,7 +6671,6 @@ }, "node_modules/colorette": { "version": "2.0.20", - "dev": true, "license": "MIT" }, "node_modules/combined-stream": { @@ -5570,7 +7047,6 @@ }, "node_modules/cross-spawn": { "version": "7.0.3", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -5693,10 +7169,9 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", "dependencies": { "type-detect": "^4.0.0" }, @@ -5830,7 +7305,6 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -5977,6 +7451,14 @@ "iconv-lite": "^0.6.2" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "3.0.1", "license": "BSD-2-Clause", @@ -6381,14 +7863,44 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/fast-content-type-parse": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" + }, "node_modules/fast-decode-uri-component": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -6467,7 +7979,8 @@ }, "node_modules/fast-querystring": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dependencies": { "fast-decode-uri-component": "^1.0.1" } @@ -6479,25 +7992,40 @@ "node": ">=6" } }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-uri": { "version": "2.2.0", "license": "MIT" }, "node_modules/fastify": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.25.1.tgz", - "integrity": "sha512-D8d0rv61TwqoAS7lom2tvIlgVMlx88lLsiwXyWNjA7CU/LC/mx/Gp2WAlC0S/ABq19U+y/aRvYFG5xLUu2aMrg==", + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], "dependencies": { "@fastify/ajv-compiler": "^3.5.0", "@fastify/error": "^3.4.0", "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", - "avvio": "^8.2.1", + "avvio": "^8.3.0", "fast-content-type-parse": "^1.1.0", "fast-json-stringify": "^5.8.0", - "find-my-way": "^7.7.0", + "find-my-way": "^8.0.0", "light-my-request": "^5.11.0", - "pino": "^8.17.0", + "pino": "^9.0.0", "process-warning": "^3.0.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", @@ -6510,14 +8038,86 @@ "version": "4.5.1", "license": "MIT" }, + "node_modules/fastify/node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/fastify/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/fastify/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/fastify/node_modules/pino/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, "node_modules/fastify/node_modules/process-warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" }, + "node_modules/fastify/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/fastify/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/fastify/node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } + }, "node_modules/fastq": { - "version": "1.15.0", - "license": "ISC", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dependencies": { "reusify": "^1.0.4" } @@ -6571,13 +8171,13 @@ } }, "node_modules/find-my-way": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-7.7.0.tgz", - "integrity": "sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", - "safe-regex2": "^2.0.0" + "safe-regex2": "^3.1.0" }, "engines": { "node": ">=14" @@ -6748,6 +8348,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/funtypes": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/funtypes/-/funtypes-4.2.0.tgz", + "integrity": "sha512-DvOtjiKvkeuXGV0O8LQh9quUP3bSOTEQPGv537Sao8kDq2rDbg48UsSJ7wlBLPzR2Mn0pV7cyAiq5pYG1oUyCQ==" + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "license": "MIT", @@ -6779,7 +8384,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, "engines": { "node": "*" } @@ -6863,10 +8467,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -7165,6 +8769,11 @@ "node": ">= 0.4" } }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "license": "BSD-3-Clause", @@ -7343,55 +8952,358 @@ "version": "3.3.0", "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-in-the-middle": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.6.tgz", + "integrity": "sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==", + "dependencies": { + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, "engines": { - "node": ">=0.8.19" + "node": ">=8" } }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, "engines": { "node": ">=8" } }, - "node_modules/inflection": { - "version": "1.13.4", - "engines": [ - "node >= 0.4.0" - ], - "license": "MIT" - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { - "once": "^1.3.0", - "wrappy": "1" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" + "node_modules/inquirer/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/interrogator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/interrogator/-/interrogator-2.0.1.tgz", + "integrity": "sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==", + "dependencies": { + "inquirer": "^9.1.4" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -7555,6 +9467,11 @@ "node": ">=0.10.0" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "node_modules/is-reference": { "version": "1.2.1", "license": "MIT", @@ -7564,7 +9481,6 @@ }, "node_modules/is-stream": { "version": "3.0.0", - "dev": true, "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -7626,7 +9542,6 @@ }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, "license": "ISC" }, "node_modules/isobject": { @@ -7692,13 +9607,14 @@ } }, "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "istanbul-lib-coverage": "^3.0.0" }, "engines": { "node": ">=10" @@ -7734,13 +9650,20 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", - "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7876,8 +9799,7 @@ "node_modules/jsonc-parser": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" }, "node_modules/jsonparse": { "version": "1.3.1", @@ -8201,7 +10123,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, "dependencies": { "mlly": "^1.4.2", "pkg-types": "^1.0.3" @@ -8246,7 +10167,6 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, "license": "MIT" }, "node_modules/lodash.reduce": { @@ -8483,7 +10403,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, "dependencies": { "get-func-name": "^2.0.1" } @@ -8499,7 +10418,6 @@ "version": "0.30.5", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -8508,14 +10426,14 @@ } }, "node_modules/magicast": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.2.tgz", - "integrity": "sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==", + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", "dev": true, "dependencies": { - "@babel/parser": "^7.23.3", - "@babel/types": "^7.23.3", - "source-map-js": "^1.0.2" + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" } }, "node_modules/make-dir": { @@ -8755,7 +10673,6 @@ }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, "license": "MIT" }, "node_modules/merge2": { @@ -8797,7 +10714,6 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -8827,7 +10743,6 @@ }, "node_modules/minimist": { "version": "1.2.8", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8856,7 +10771,6 @@ }, "node_modules/mkdirp": { "version": "1.0.4", - "dev": true, "license": "MIT", "bin": { "mkdirp": "bin/cmd.js" @@ -8869,7 +10783,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", - "dev": true, "dependencies": { "acorn": "^8.10.0", "pathe": "^1.1.1", @@ -8885,6 +10798,11 @@ "node": ">=0.10.0" } }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, "node_modules/moment": { "version": "2.29.4", "license": "MIT", @@ -8906,11 +10824,18 @@ "version": "2.1.2", "license": "MIT" }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, "funding": [ { "type": "github", @@ -8935,9 +10860,10 @@ "license": "MIT" }, "node_modules/node-abi": { - "version": "3.52.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.52.0.tgz", - "integrity": "sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==", + "version": "3.66.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.66.0.tgz", + "integrity": "sha512-J3ygyG8cTcn5TVzpHYEBE6zHN4uVoj6wKMS946b19VYGhVpGgR5mB3OK2oBTe0l3Bpsj5/h+TAblq0K8Ec9cRQ==", + "license": "MIT", "dependencies": { "semver": "^7.3.5" }, @@ -8983,7 +10909,6 @@ }, "node_modules/npm-run-path": { "version": "5.1.0", - "dev": true, "license": "MIT", "dependencies": { "path-key": "^4.0.0" @@ -8997,7 +10922,6 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -9041,6 +10965,11 @@ "node": ">=0.10.0" } }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, "node_modules/on-exit-leak-free": { "version": "2.1.0", "license": "MIT" @@ -9054,7 +10983,6 @@ }, "node_modules/onetime": { "version": "6.0.0", - "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" @@ -9083,6 +11011,53 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/opentelemetry-instrumentation-fetch-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.3.tgz", + "integrity": "sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.46.0", + "@opentelemetry/semantic-conventions": "^1.17.0" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.6.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz", + "integrity": "sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==", + "optional": true, + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "optional": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, "node_modules/optionator": { "version": "0.9.3", "dev": true, @@ -9147,6 +11122,14 @@ "version": "2.1.1", "license": "MIT" }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "dev": true, @@ -9182,6 +11165,11 @@ "node": ">=6" } }, + "node_modules/parameter-reducers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parameter-reducers/-/parameter-reducers-2.1.0.tgz", + "integrity": "sha512-aj9V6DUnNbj4YEmVxloPLX9duhklIC+SIOVUrVdaT3WfgEownET+TYg/JsjANQUNGe46dmOCHEKiuycL36cOnw==" + }, "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", @@ -9226,7 +11214,6 @@ }, "node_modules/path-key": { "version": "3.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -9269,25 +11256,180 @@ "node_modules/pathe": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", - "dev": true + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, "engines": { "node": "*" } }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, "node_modules/pg-connection-string": { - "version": "2.6.2", - "license": "MIT" + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" }, - "node_modules/picocolors": { + "node_modules/pg-cursor": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.11.0.tgz", + "integrity": "sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==", + "peerDependencies": { + "pg": "^8" + } + }, + "node_modules/pg-hstore": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz", + "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==", + "dependencies": { + "underscore": "^1.13.1" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-bytea": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9347,10 +11489,57 @@ "split2": "^4.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", @@ -9362,6 +11551,14 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/pino-pretty/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, "node_modules/pino-std-serializers": { "version": "6.2.2", "license": "MIT" @@ -9438,13 +11635,20 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, "dependencies": { "jsonc-parser": "^3.2.0", "mlly": "^1.2.0", "pathe": "^1.1.0" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, "node_modules/polished": { "version": "4.2.2", "license": "MIT", @@ -9456,10 +11660,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", - "dev": true, + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", "funding": [ { "type": "opencollective", @@ -9476,8 +11679,8 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -9487,6 +11690,46 @@ "version": "4.2.0", "license": "MIT" }, + "node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "dev": true, @@ -9548,7 +11791,6 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -9562,7 +11804,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, "engines": { "node": ">=10" }, @@ -9792,6 +12033,15 @@ "version": "1.1.0", "license": "MIT" }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.3.0", "license": "MIT", @@ -10333,6 +12583,35 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", + "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/require-relative": { "version": "0.8.7", "dev": true, @@ -10347,8 +12626,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "license": "MIT", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10368,38 +12648,241 @@ "node": ">=4" } }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.0", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-polyfill-node": { + "version": "0.12.0", + "license": "MIT", + "dependencies": { + "@rollup/plugin-inject": "^5.0.1" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" } }, - "node_modules/restore-cursor": { - "version": "4.0.0", + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { + "node_modules/run-applescript/node_modules/mimic-fn": { "version": "2.1.0", + "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/restore-cursor/node_modules/onetime": { + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { "version": "5.1.2", + "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" @@ -10411,446 +12894,570 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ret": { - "version": "0.2.2", + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/retry-as-promised": { - "version": "7.0.4", + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rusty-motors-cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/rusty-motors-database": { + "resolved": "packages/database", + "link": true + }, + "node_modules/rusty-motors-gateway": { + "resolved": "packages/gateway", + "link": true + }, + "node_modules/rusty-motors-mcots": { + "resolved": "packages/mcots", + "link": true + }, + "node_modules/rusty-motors-nps": { + "resolved": "packages/nps", + "link": true + }, + "node_modules/rusty-motors-patch": { + "resolved": "packages/patch", + "link": true + }, + "node_modules/rusty-motors-server": { + "resolved": "apps/main", + "link": true + }, + "node_modules/rusty-motors-shard": { + "resolved": "packages/shard", + "link": true + }, + "node_modules/rusty-motors-shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/rusty-motors-shared-packets": { + "resolved": "packages/shared-packets", + "link": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT" }, - "node_modules/reusify": { - "version": "1.0.4", + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", "license": "MIT", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/rfdc": { - "version": "1.3.0", + "node_modules/safer-buffer": { + "version": "2.1.2", "license": "MIT" }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", "dependencies": { - "glob": "^10.3.7" + "loose-envify": "^1.1.0" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" }, "bin": { - "rimraf": "dist/esm/bin.mjs" + "semver": "bin/semver.js" }, "engines": { - "node": ">=14" + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">=10" } }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/sequelize": { + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], "dependencies": { - "balanced-match": "^1.0.0" + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } } }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "kind-of": "^6.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/rollup": { - "version": "3.29.0", + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" + "dependencies": { + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "node": ">=8" } }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.12.0", + "node_modules/shebang-regex": { + "version": "3.0.0", "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/short-unique-id": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", + "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "bin": { + "short-unique-id": "bin/short-unique-id", + "suid": "bin/short-unique-id" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { - "@rollup/plugin-inject": "^5.0.1" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "license": "MIT" + "node_modules/siginfo": { + "version": "2.0.0", + "license": "ISC" }, - "node_modules/run-applescript": { - "version": "5.0.0", - "dev": true, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/slash": { + "version": "5.1.0", "license": "MIT", - "dependencies": { - "execa": "^5.0.0" - }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.17.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/smob": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, + "node_modules/source-map-support": { + "version": "0.5.21", "license": "MIT", "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" } }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", + "node_modules/spdx-correct": { + "version": "3.2.0", "dev": true, - "license": "MIT", + "license": "Apache-2.0", "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", + "node_modules/spdx-exceptions": { + "version": "2.3.0", "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "license": "CC-BY-3.0" }, - "node_modules/run-parallel": { - "version": "1.2.0", + "node_modules/spdx-expression-parse": { + "version": "3.0.1", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "dev": true, + "license": "CC0-1.0" }, - "node_modules/safe-regex2": { - "version": "2.0.0", + "node_modules/split": { + "version": "1.0.1", + "dev": true, "license": "MIT", "dependencies": { - "ret": "~0.2.0" + "through": "2" + }, + "engines": { + "node": "*" } }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "license": "MIT", + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", "engines": { - "node": ">=10" + "node": ">= 10.x" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/scheduler": { - "version": "0.23.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "node_modules/sqlite": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", + "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==" }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "license": "BSD-3-Clause" + "node_modules/stackback": { + "version": "0.0.2", + "license": "MIT" }, - "node_modules/semver": { - "version": "7.5.4", + "node_modules/standard-version": { + "version": "9.5.0", + "dev": true, "license": "ISC", "dependencies": { - "lru-cache": "^6.0.0" + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" }, "bin": { - "semver": "bin/semver.js" + "standard-version": "bin/cli.js" }, "engines": { "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" + "node_modules/std-env": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", + "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==" }, - "node_modules/sequelize": { - "version": "6.35.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", - "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], + "node_modules/stdin-discarder": { + "version": "0.1.0", + "license": "MIT", "dependencies": { - "@types/debug": "^4.1.8", - "@types/validator": "^13.7.17", - "debug": "^4.3.4", - "dottie": "^2.0.6", - "inflection": "^1.13.4", - "lodash": "^4.17.21", - "moment": "^2.29.4", - "moment-timezone": "^0.5.43", - "pg-connection-string": "^2.6.1", - "retry-as-promised": "^7.0.4", - "semver": "^7.5.4", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.9.0", - "wkx": "^0.5.0" + "bl": "^5.0.0" }, "engines": { - "node": ">=10.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sequelize-pool": { - "version": "7.1.0", + "node_modules/string_decoder": { + "version": "1.3.0", "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "license": "BSD-3-Clause", "dependencies": { - "randombytes": "^2.1.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=0.6.19" } }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, "license": "MIT", "dependencies": { - "kind-of": "^6.0.2" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", "dev": true, "license": "MIT", "dependencies": { - "shebang-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "dev": true, "license": "MIT", @@ -10858,1081 +13465,1208 @@ "node": ">=8" } }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/siginfo": { - "version": "2.0.0", + "node_modules/stringify-package": { + "version": "1.0.1", "dev": true, "license": "ISC" }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/slash": { - "version": "5.1.0", + "node_modules/strip-ansi": { + "version": "6.0.1", "license": "MIT", - "engines": { - "node": ">=14.16" + "dependencies": { + "ansi-regex": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "node": ">=8" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smob": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", - "dependencies": { - "atomic-sleep": "^1.0.0" + "node": ">=8" } }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "node_modules/strip-bom": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/source-map-support": { - "version": "0.5.21", + "node_modules/strip-final-newline": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", + "node_modules/strip-indent": { + "version": "3.0.0", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, + "node_modules/strip-json-comments": { + "version": "3.1.1", "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "dev": true, - "license": "CC0-1.0" + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==" }, - "node_modules/split": { - "version": "1.0.1", - "dev": true, + "node_modules/styled-components": { + "version": "5.3.9", "license": "MIT", "dependencies": { - "through": "2" + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" }, "engines": { - "node": "*" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" } }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "license": "MIT" }, - "node_modules/sqlite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", - "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==" + "node_modules/styled-system": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@styled-system/background": "^5.1.2", + "@styled-system/border": "^5.1.5", + "@styled-system/color": "^5.1.2", + "@styled-system/core": "^5.1.2", + "@styled-system/flexbox": "^5.1.2", + "@styled-system/grid": "^5.1.2", + "@styled-system/layout": "^5.1.2", + "@styled-system/position": "^5.1.2", + "@styled-system/shadow": "^5.1.2", + "@styled-system/space": "^5.1.2", + "@styled-system/typography": "^5.1.2", + "@styled-system/variant": "^5.1.5", + "object-assign": "^4.1.1" + } }, - "node_modules/stackback": { - "version": "0.0.2", - "dev": true, + "node_modules/stylis": { + "version": "4.2.0", "license": "MIT" }, - "node_modules/standard-version": { - "version": "9.5.0", - "dev": true, - "license": "ISC", + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/statuses": { - "version": "2.0.1", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/std-env": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", - "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==", - "dev": true - }, - "node_modules/stdin-discarder": { - "version": "0.1.0", + "node_modules/synckit": { + "version": "0.8.5", + "dev": true, "license": "MIT", "dependencies": { - "bl": "^5.0.0" + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/unts" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", + "node_modules/terser": { + "version": "5.19.4", + "license": "BSD-2-Clause", "dependencies": { - "safe-buffer": "~5.2.0" + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" } }, - "node_modules/string-argv": { - "version": "0.3.2", + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, - "license": "MIT", + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, "engines": { - "node": ">=0.6.19" + "node": ">=8" } }, - "node_modules/string-width": { - "version": "5.1.2", + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=12" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", + "node_modules/text-extensions": { + "version": "1.9.0", "dev": true, "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, "engines": { - "node": ">=8" + "node": ">=0.10" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", + "node_modules/text-mask-addons": { + "version": "3.8.0", + "license": "Unlicense" + }, + "node_modules/text-table": { + "version": "0.2.0", "dev": true, "license": "MIT" }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, + "node_modules/thread-stream": { + "version": "2.4.0", "license": "MIT", - "engines": { - "node": ">=8" + "dependencies": { + "real-require": "^0.2.0" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, + "node_modules/throttle-debounce": { + "version": "3.0.1", "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "node": ">=10" } }, - "node_modules/stringify-package": { - "version": "1.0.1", + "node_modules/through": { + "version": "2.3.8", "dev": true, - "license": "ISC" + "license": "MIT" }, - "node_modules/strip-ansi": { - "version": "6.0.1", + "node_modules/through2": { + "version": "4.0.2", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, + "readable-stream": "3" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", "engines": { - "node": ">=8" + "node": ">=14.0.0" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@popperjs/core": "^2.9.0" } }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/titleize": { + "version": "3.0.0", "dev": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, "engines": { - "node": ">=8" + "node": ">=0.6.0" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, + "node_modules/to-fast-properties": { + "version": "2.0.0", "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/strip-final-newline": { - "version": "3.0.0", + "node_modules/to-regex-range": { + "version": "5.0.1", "dev": true, "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", + "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", "engines": { "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-indent": { - "version": "3.0.0", - "dev": true, + "node_modules/toidentifier": { + "version": "1.0.1", "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, "engines": { - "node": ">=8" + "node": ">=0.6" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", + "node_modules/toposort-class": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", "dev": true, "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "1.3.0", + "node_modules/ts-api-utils": { + "version": "1.0.2", "dev": true, "license": "MIT", - "dependencies": { - "acorn": "^8.10.0" + "engines": { + "node": ">=16.13.0" }, - "funding": { - "url": "https://github.com/sponsors/antfu" + "peerDependencies": { + "typescript": ">=4.2.0" } }, - "node_modules/styled-components": { - "version": "5.3.9", - "license": "MIT", + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" }, - "node_modules/styled-system": { - "version": "5.1.5", - "license": "MIT", - "dependencies": { - "@styled-system/background": "^5.1.2", - "@styled-system/border": "^5.1.5", - "@styled-system/color": "^5.1.2", - "@styled-system/core": "^5.1.2", - "@styled-system/flexbox": "^5.1.2", - "@styled-system/grid": "^5.1.2", - "@styled-system/layout": "^5.1.2", - "@styled-system/position": "^5.1.2", - "@styled-system/shadow": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@styled-system/typography": "^5.1.2", - "@styled-system/variant": "^5.1.5", - "object-assign": "^4.1.1" + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" } }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "5.5.0", + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=4" + "node": ">= 0.8.0" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/synckit": { - "version": "0.8.5", + "node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=14.16" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/terser": { - "version": "5.19.4", - "license": "BSD-2-Clause", + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, "license": "MIT" }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=8" + "node": ">=14.17" } }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", + "node_modules/typescript-eslint-language-service": { + "version": "5.0.5", "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/parser": ">= 5.0.0", + "eslint": ">= 8.0.0", + "typescript": ">= 4.0.0" } }, - "node_modules/text-extensions": { - "version": "1.9.0", + "node_modules/uc.micro": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", "dev": true, - "license": "MIT", + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, "engines": { - "node": ">=0.10" + "node": ">=0.8.0" } }, - "node_modules/text-mask-addons": { - "version": "3.8.0", - "license": "Unlicense" - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, + "node_modules/underscore": { + "version": "1.13.6", "license": "MIT" }, - "node_modules/thread-stream": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "real-require": "^0.2.0" - } + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, - "node_modules/throttle-debounce": { - "version": "3.0.1", + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=4" } }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "dev": true, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", "license": "MIT", "dependencies": { - "readable-stream": "3" + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==", - "dev": true + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/tinypool": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.1.tgz", - "integrity": "sha512-zBTCK0cCgRROxvs9c0CGK838sPkeokNGdQVUUwHAbynHFlmyJYj825f/oRs528HaIJ97lo0pLIlDUzwN+IorWg==", - "dev": true, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "node_modules/tinyspy": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.0.tgz", - "integrity": "sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==", + "node_modules/untildify": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/tippy.js": { - "version": "6.3.7", + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "@popperjs/core": "^2.9.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/titleize": { + "node_modules/uppercamelcase": { "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "resolved": "https://registry.npmjs.org/uppercamelcase/-/uppercamelcase-3.0.0.tgz", + "integrity": "sha512-zTWmRiOJACCdFGWjzye3L5cjSuVdZ/c8C0iHIwVbfORFD8IhGNAO6BOWkZ+fj+SI6/aFbdjGXE6gwPG780H4gQ==", + "dependencies": { + "camelcase": "^4.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", + "node_modules/uppercamelcase/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "engines": { "node": ">=4" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" }, - "engines": { - "node": ">=8.0" + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, - "node_modules/toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", - "engines": { - "node": ">=12" + "node_modules/use-memo-one": { + "version": "1.1.3", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/toidentifier": { - "version": "1.0.1", + "node_modules/use-sync-external-store": { + "version": "1.2.0", "license": "MIT", - "engines": { - "node": ">=0.6" + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/toposort-class": { - "version": "1.0.1", + "node_modules/util-deprecate": { + "version": "1.0.2", "license": "MIT" }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" + "node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } }, - "node_modules/trim-newlines": { + "node_modules/v8-compile-cache-lib": { "version": "3.0.1", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.11.0", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.10" } }, - "node_modules/ts-api-utils": { - "version": "1.0.2", - "dev": true, + "node_modules/vary": { + "version": "1.1.2", "license": "MIT", "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" + "node": ">= 0.8" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "node_modules/vite": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" + "esbuild": "^0.21.3", + "postcss": "^8.4.41", + "rollup": "^4.13.0" }, "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { - "@swc/core": { + "@types/node": { "optional": true }, - "@swc/wasm": { + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { "optional": true } } }, - "node_modules/tslib": { - "version": "2.6.2", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" }, "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" + "vite-node": "vite-node.mjs" }, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" + "node": "^18.0.0 || >=20.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">= 0.6" + "node": ">=12" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint-language-service": { - "version": "5.0.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/parser": ">= 5.0.0", - "eslint": ">= 8.0.0", - "typescript": ">= 4.0.0" + "node": ">=12" } }, - "node_modules/uc.micro": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", - "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "dev": true, - "license": "BSD-2-Clause", + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, + "os": [ + "android" + ], "engines": { - "node": ">=0.8.0" + "node": ">=12" } }, - "node_modules/underscore": { - "version": "1.13.6", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/untildify": { - "version": "4.0.0", - "dev": true, - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=10.12.0" + "node": ">=12" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" } }, - "node_modules/validator": { - "version": "13.11.0", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.10" + "node": ">=12" } }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">= 0.8" + "node": ">=12" } }, - "node_modules/vite": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.7.tgz", - "integrity": "sha512-B4T4rJCDPihrQo2B+h1MbeGL/k/GMAHzhQ8S0LjQ142s6/+l3hHTT095ORvsshj4QCkoWu3Xtmob5mazvakaOw==", - "dev": true, - "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.32", - "rollup": "^4.2.0" - }, - "bin": { - "vite": "bin/vite.js" - }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } + "node": ">=12" } }, - "node_modules/vite-node": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.1.0.tgz", - "integrity": "sha512-jV48DDUxGLEBdHCQvxL1mEh7+naVy+nhUUUaPAZLd3FJgXuxQiewHcfeZebbJ6onDqNGkP4r3MhQ342PRlG81Q==", - "dev": true, - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, "bin": { - "vite-node": "vite-node.mjs" + "esbuild": "bin/esbuild" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": ">=12" }, - "funding": { - "url": "https://opencollective.com/vitest" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" } }, "node_modules/vite/node_modules/rollup": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.8.0.tgz", - "integrity": "sha512-NpsklK2fach5CdI+PScmlE5R4Ao/FSWtF7LkoIrHDxPACY/xshNasPsbpG0VVHxUTbf74tJbVT4PrP8JsJ6ZDA==", - "dev": true, + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -11941,35 +14675,36 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.8.0", - "@rollup/rollup-android-arm64": "4.8.0", - "@rollup/rollup-darwin-arm64": "4.8.0", - "@rollup/rollup-darwin-x64": "4.8.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.8.0", - "@rollup/rollup-linux-arm64-gnu": "4.8.0", - "@rollup/rollup-linux-arm64-musl": "4.8.0", - "@rollup/rollup-linux-riscv64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-gnu": "4.8.0", - "@rollup/rollup-linux-x64-musl": "4.8.0", - "@rollup/rollup-win32-arm64-msvc": "4.8.0", - "@rollup/rollup-win32-ia32-msvc": "4.8.0", - "@rollup/rollup-win32-x64-msvc": "4.8.0", + "@rollup/rollup-android-arm-eabi": "4.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.0", "fsevents": "~2.3.2" } }, "node_modules/vitest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.1.0.tgz", - "integrity": "sha512-oDFiCrw7dd3Jf06HoMtSRARivvyjHJaTxikFxuqJjO76U436PqlVw1uLn7a8OSPrhSfMGVaRakKpA2lePdw79A==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.1.0", - "@vitest/runner": "1.1.0", - "@vitest/snapshot": "1.1.0", - "@vitest/spy": "1.1.0", - "@vitest/utils": "1.1.0", - "acorn-walk": "^8.3.0", - "cac": "^6.7.14", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", "execa": "^8.0.1", @@ -11978,11 +14713,11 @@ "pathe": "^1.1.1", "picocolors": "^1.0.0", "std-env": "^3.5.0", - "strip-literal": "^1.3.0", + "strip-literal": "^2.0.0", "tinybench": "^2.5.1", - "tinypool": "^0.8.1", + "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.1.0", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -11997,8 +14732,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "^1.0.0", - "@vitest/ui": "^1.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -12027,7 +14762,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -12050,7 +14784,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, "engines": { "node": ">=16" }, @@ -12062,7 +14795,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, "engines": { "node": ">=16.17.0" } @@ -12071,7 +14803,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, "engines": { "node": ">=14" }, @@ -12142,7 +14873,6 @@ }, "node_modules/which": { "version": "2.0.2", - "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -12156,7 +14886,6 @@ }, "node_modules/why-is-node-running": { "version": "2.2.2", - "dev": true, "license": "MIT", "dependencies": { "siginfo": "^2.0.0", @@ -12324,7 +15053,6 @@ }, "node_modules/xtend": { "version": "4.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">=0.4" @@ -12419,6 +15147,478 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli": { + "name": "rusty-motors-cli", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "rusty-motors-shared": "^1.0.0", + "rusty-motors-shared-packets": "^1.0.0" + }, + "devDependencies": { + "@vitest/coverage-v8": "1.6.0" + } + }, + "packages/connection": { + "name": "rusty-motors-connection", + "version": "1.0.0", + "extraneous": true, + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "vitest": "^1.6.0" + } + }, + "packages/database": { + "name": "rusty-motors-database", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@databases/pg": "^5.5.0", + "@databases/pg-schema-cli": "^4.4.0", + "@databases/pg-typed": "^4.4.1", + "@sentry/node": "^8.0.0", + "@types/pg": "^8.11.6", + "pg": "^8.11.5", + "pg-hstore": "^2.3.4", + "vitest": "^1.6.0" + } + }, + "packages/database/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/database/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/database/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/database/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway": { + "name": "rusty-motors-gateway", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2", + "vitest": "^1.6.0" + } + }, + "packages/gateway/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/gateway/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots": { + "name": "rusty-motors-mcots", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + } + }, + "packages/mcots/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/mcots/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/nps": { + "name": "rusty-motors-nps", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + } + }, + "packages/nps/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/nps/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/nps/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/nps/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/patch": { + "name": "rusty-motors-patch", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + } + }, + "packages/shard": { + "name": "rusty-motors-shard", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + } + }, + "packages/shared": { + "name": "rusty-motors-shared", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "fastify": "^4.27.0", + "pino": "^9.0.0", + "pino-pretty": "^11.0.0", + "vitest": "^1.6.0" + } + }, + "packages/shared-packets": { + "name": "rusty-motors-shared-packets", + "version": "1.0.0", + "license": "AGPL-3.0" + }, + "packages/shared/node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "packages/shared/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "packages/shared/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "packages/shared/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, + "packages/shared/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/shared/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "packages/shared/node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } } } } diff --git a/package.json b/package.json index c96d8d1f1..9fa068a09 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,13 @@ "url": "git@github.com:drazisil/mcos.git" }, "scripts": { - "prepare": "husky install", - "pretest": "eslint --fix . && prettier --write .", - "test:only": "node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage packages", - "test": "node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage packages", - "prod": "make prod_node", - "prod:stop": "docker-compose stop", - "release": "standard-version --sign", + "clean": "rm --verbose -rf **/node_modules node_modules", + "start": "tsx --openssl-legacy-provider --env-file=.env ./apps/main/server.ts", + "test": "npm run test:all", + "test:all": "npm run test --workspaces --if-present", "start:dev": "tsx --openssl-legacy-provider server.ts", - "start:docker": "npm run start:dev 2>&1 | tee -a log/mcos/trace.log" + "types:db": "npm --workspace rusty-motors-database run types:db", + "migrate": "pg-migrations apply --directory migrations " }, "files": [ "README.md", @@ -39,6 +37,19 @@ "sqlite": "^5.1.1", "ts-node": "10.9.2" }, + "workspaces": [ + "apps/main", + "packages/cli", + "packages/connection", + "packages/database", + "packages/gateway", + "packages/mcots", + "packages/nps", + "packages/patch", + "packages/shard", + "packages/shared", + "packages/shared-packets" + ], "devDependencies": { "@sentry/cli": "^2.23.1", "@tsconfig/node-lts": "^20.1.0", diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 000000000..e38ca8108 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,28 @@ +{ + "name": "rusty-motors-cli", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "devDependencies": { + "@vitest/coverage-v8": "1.6.0" + }, + "dependencies": { + "rusty-motors-shared": "^1.0.0", + "rusty-motors-shared-packets": "^1.0.0" + }, + "description": "" +} diff --git a/packages/cli/test/index.test.ts b/packages/cli/test/index.test.ts new file mode 100644 index 000000000..f01d2f75d --- /dev/null +++ b/packages/cli/test/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("example", () => { + it("should pass", () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/cli/vite.config.ts b/packages/cli/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/cli/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/database/package.json b/packages/database/package.json new file mode 100644 index 000000000..69ffaf927 --- /dev/null +++ b/packages/database/package.json @@ -0,0 +1,35 @@ +{ + "name": "rusty-motors-database", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage", + "types:db": "npx @databases/pg-schema-cli --directory src/__generated__" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@databases/pg": "^5.5.0", + "@databases/pg-schema-cli": "^4.4.0", + "@databases/pg-typed": "^4.4.1", + "@sentry/node": "^8.0.0", + "@types/pg": "^8.11.6", + "pg": "^8.11.5", + "pg-hstore": "^2.3.4", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" +} diff --git a/packages/database/vite.config.ts b/packages/database/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/database/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/gateway/package.json b/packages/gateway/package.json new file mode 100644 index 000000000..f71ce9586 --- /dev/null +++ b/packages/gateway/package.json @@ -0,0 +1,30 @@ +{ + "name": "rusty-motors-gateway", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" +} diff --git a/packages/gateway/vite.config.ts b/packages/gateway/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/gateway/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/mcots/ClientConnectionManager.ts b/packages/mcots/ClientConnectionManager.ts new file mode 100644 index 000000000..402201c26 --- /dev/null +++ b/packages/mcots/ClientConnectionManager.ts @@ -0,0 +1,49 @@ +import type { Connection } from "rusty-motors-connection"; + +export class ClientConnectionManager { + static _instance: ClientConnectionManager; + + static getInstance() { + if (!ClientConnectionManager._instance) { + ClientConnectionManager._instance = new ClientConnectionManager(); + } + return ClientConnectionManager._instance; + } + private _connections: Map = new Map(); + + public addConnection(connection: Connection) { + this._connections.set(connection.id, connection); + } + + public removeConnection(connectionId: string) { + this._connections.delete(connectionId); + } + + public getConnection(connectionId: string): Connection | undefined { + return this._connections.get(connectionId); + } + + public getConnections(): Connection[] { + return Array.from(this._connections.values()); + } + + public clearConnections() { + this._connections.clear(); + } + + static addConnection(connection: Connection) { + ClientConnectionManager.getInstance().addConnection(connection); + } + + static removeConnection(connectionId: string) { + ClientConnectionManager.getInstance().removeConnection(connectionId); + } + + static getConnection(connectionId: string): Connection | undefined { + return ClientConnectionManager.getInstance().getConnection(connectionId); + } + + static getConnections(): Connection[] { + return ClientConnectionManager.getInstance().getConnections(); + } +} diff --git a/packages/mcots/errors/ErrorNoKey.ts b/packages/mcots/errors/ErrorNoKey.ts new file mode 100644 index 000000000..7e89d13a1 --- /dev/null +++ b/packages/mcots/errors/ErrorNoKey.ts @@ -0,0 +1,5 @@ +export class ErrorNoKey extends Error { + constructor(msg?: string) { + super(msg || "No key provided"); + } +} diff --git a/packages/mcots/index.ts b/packages/mcots/index.ts new file mode 100644 index 000000000..72fc21311 --- /dev/null +++ b/packages/mcots/index.ts @@ -0,0 +1,18 @@ +export { ClientConnectionManager } from './ClientConnectionManager.js'; +export { ErrorNoKey } from './errors/ErrorNoKey.js'; +export { + getServerMessageProcessor, + populateServerMessageProcessors, +} from './messageProcessors/index.js'; +export type { ServerSocketCallback } from './messageProcessors/index.js'; +export { + ClientConnectionMessage, + ClientTrackingMessage, + LoginMessage, + LoginCompleteMessage, + SetOptionsMessage, + StackCarInfo, + StockCar, +} from './payloads/index.js'; + +// Path: packages/mcots/index.ts diff --git a/packages/mcots/messageProcessors/index.ts b/packages/mcots/messageProcessors/index.ts new file mode 100644 index 000000000..494ae24d9 --- /dev/null +++ b/packages/mcots/messageProcessors/index.ts @@ -0,0 +1,39 @@ +import type { ServerMessage } from "rusty-motors-shared-packets"; +import { processClientConnect } from "./processClientConnect.js"; +import { processClientTracking } from "./processClientTracking.js"; +import { processServerLogin } from "./processServerLogin.js"; +import { processSetOptions } from "./processSetOptions.js"; +import { processStockCarInfo } from "./processStockCarInfo.js"; + +export type ServerSocketCallback = (messages: ServerMessage[]) => void; + +export type ServerMessageProcessor = ( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, +) => Promise; + +const serverMessageProcessors = new Map([]); + +export function addServerMessageProcessor( + messageId: number, + processor: ServerMessageProcessor, +) { + serverMessageProcessors.set(messageId, processor); +} + +export function populateServerMessageProcessors() { + addServerMessageProcessor(105, processServerLogin); + addServerMessageProcessor(109, processSetOptions); + addServerMessageProcessor(141, processStockCarInfo); + addServerMessageProcessor(440, processClientTracking); + addServerMessageProcessor(438, processClientConnect); +}; + +export function getServerMessageProcessor(messageId: number) { + return serverMessageProcessors.get(messageId); +} + +export function getServerMessageProcessors() { + return serverMessageProcessors; +} diff --git a/packages/mcots/messageProcessors/processClientConnect.ts b/packages/mcots/messageProcessors/processClientConnect.ts new file mode 100644 index 000000000..8f33004ff --- /dev/null +++ b/packages/mcots/messageProcessors/processClientConnect.ts @@ -0,0 +1,86 @@ +import { createDataEncryptionPair } from 'rusty-motors-connection'; +import type { ServerSocketCallback } from 'rusty-motors-mcots'; +import { + ClientConnectionManager, + ClientConnectionMessage, + ErrorNoKey, +} from 'rusty-motors-mcots'; +import { UserStatusManager } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; +import { ServerMessage } from 'rusty-motors-shared-packets'; +import { sendSuccess } from './sendSuccess.js'; + +const log = getServerLogger(); + +export async function processClientConnect( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback +): Promise { + log.setName('processClientConnect'); + try { + log.debug(`Processing client connect request: ${message.toString()}`); + + const request = new ClientConnectionMessage( + message.getDataBuffer().length + ).deserialize(message.getDataBuffer()); + + log.debug(`Received client connect request: ${request.toString()}`); + + const userStatus = UserStatusManager.getUserStatus( + request.getCustomerId() + ); + + if (!userStatus) { + log.error( + `User status not found for customer ID: ${request.getCustomerId()}` + ); + return; + } + + log.debug(`User status found: ${userStatus.toString()}`); + + // Get the connection record + const connection = ClientConnectionManager.getConnection(connectionId); + + if (!connection) { + log.error( + `Connection not found for connection ID: ${connectionId}` + ); + return; + } + + log.debug(`Connection found: ${connection.toString()}`); + + const sessionKey = userStatus.getSessionKey(); + + if (!sessionKey) { + log.error( + `Session key not found for customer ID: ${request.getCustomerId()}` + ); + return; + } + + const cipherPair = createDataEncryptionPair(sessionKey.getKey()); + + connection.setCipherPair(cipherPair); + + sendSuccess(message, socketCallback); + + log.resetName(); + return Promise.resolve(); + } catch (error) { + if (error instanceof ErrorNoKey) { + log.error( + `Error processing client connect request: ${error.message}` + ); + } else { + log.error( + `Error processing client connect request: ${error as string}` + ); + throw error; + } + } +} + +// Path: packages/mcots/messageProcessors/processClientConnect.ts diff --git a/packages/mcots/messageProcessors/processClientTracking.ts b/packages/mcots/messageProcessors/processClientTracking.ts new file mode 100644 index 000000000..94c748511 --- /dev/null +++ b/packages/mcots/messageProcessors/processClientTracking.ts @@ -0,0 +1,27 @@ +import type { ServerSocketCallback } from "./index.js"; +import type { ServerMessage } from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; +import { ClientTrackingMessage } from "rusty-motors-mcots"; + +const log = getServerLogger(); + +export async function processClientTracking( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, +) { + log.setName("processClientTracking"); + + log.debug(`Processing client tracking message`); + + const trackingMessage = new ClientTrackingMessage(0).deserialize(message.serialize()); + + log.debug(`Type: ${trackingMessage.getType()}, Tracking Text: ${trackingMessage.getTrackingText()}`); + + // Do something with the tracking data + + log.resetName(); + void socketCallback([]); + + return Promise.resolve(); +} diff --git a/packages/mcots/messageProcessors/processServerLogin.ts b/packages/mcots/messageProcessors/processServerLogin.ts new file mode 100644 index 000000000..a643726a3 --- /dev/null +++ b/packages/mcots/messageProcessors/processServerLogin.ts @@ -0,0 +1,35 @@ +import { LoginCompleteMessage, LoginMessage } from 'rusty-motors-mcots'; +import { getServerLogger } from 'rusty-motors-shared'; +import { ServerMessage } from 'rusty-motors-shared-packets'; +import type { ServerSocketCallback } from './index.js'; + +const log = getServerLogger(); + +export async function processServerLogin( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback +): Promise { + log.setName('processServerLogin'); + // Read the inbound packet + const loginMessage = new LoginMessage(message.getDataBuffer().length); + loginMessage.deserialize(message.getDataBuffer()); + log.debug(`Received LoginMessage: ${loginMessage.toString()}`); + + // Create new response packet + const response = new LoginCompleteMessage(); + response.setMessageId(213); + response.setServerTime(Math.floor(Date.now() / 1000)); + response.setFirstTime(true); + + log.debug(`Sending LoginCompleteMessage: ${response.toString()}`); + + // Send response packet + const responsePacket = new ServerMessage(response.getMessageId()); + responsePacket.setData(response); + responsePacket.populateHeader(message.getSequence()); + + socketCallback([responsePacket]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/mcots/messageProcessors/processSetOptions.ts b/packages/mcots/messageProcessors/processSetOptions.ts new file mode 100644 index 000000000..e3f37d0ef --- /dev/null +++ b/packages/mcots/messageProcessors/processSetOptions.ts @@ -0,0 +1,27 @@ +import { SetOptionsMessage } from 'rusty-motors-mcots'; +import { getServerLogger } from 'rusty-motors-shared'; +import { ServerMessage } from 'rusty-motors-shared-packets'; +import type { ServerSocketCallback } from './index.js'; +import { sendSuccess } from './sendSuccess.js'; + +const log = getServerLogger(); + +export async function processSetOptions( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback +) { + log.setName('processSetOptions'); + log.info(`Processing SetOptionsMessage`); + const setOptionsMessage = new SetOptionsMessage().deserialize( + message.getDataBuffer() + ); + log.info(`SetOptionsMessage: ${setOptionsMessage.toString()}`); + + // TODO: Implement the logic for processing the SetOptionsMessage + + sendSuccess(message, socketCallback); + + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/mcots/messageProcessors/processStockCarInfo.ts b/packages/mcots/messageProcessors/processStockCarInfo.ts new file mode 100644 index 000000000..288f80774 --- /dev/null +++ b/packages/mcots/messageProcessors/processStockCarInfo.ts @@ -0,0 +1,107 @@ +import { + getWarehouseInventory, + type WarehouseInventory, +} from 'rusty-motors-database'; +import { StackCarInfo, StockCar } from 'rusty-motors-mcots'; +import { getServerLogger } from 'rusty-motors-shared'; +import { + ServerGenericRequest, + ServerMessage, +} from 'rusty-motors-shared-packets'; +import type { ServerSocketCallback } from './index.js'; + +const log = getServerLogger(); + +// 1300 544f4d43 01 00000000 8d00 [08000000 00000000] + +export async function processStockCarInfo( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback +): Promise { + log.setName('processStockCarInfo'); + try { + log.debug(`Processing stock car info message`); + + const request = new ServerGenericRequest().deserialize( + message.data.serialize() + ); + + log.debug(`Received stock car info request: ${request.toString()}`); + + const lotOwnerId = request.getData().readUInt32LE(); + const brandId = request.getData2().readUInt32LE(); + + log.debug(`Lot owner ID: ${lotOwnerId} Brand ID: ${brandId}`); + + const inventoryCars: WarehouseInventory = await getWarehouseInventory( + lotOwnerId, + brandId + ); + + log.debug( + `Sending car info for lot owner ${lotOwnerId} and brand ${brandId}` + ); + + const responsePacket = new StackCarInfo(); + + responsePacket.setMessageId(141); + responsePacket.setStarterCash(100); + responsePacket.setDealerId(lotOwnerId); + responsePacket.setBrandId(brandId); + + const response = new ServerMessage(141); + + if ( + inventoryCars.inventory.length > StackCarInfo.MAX_CARS_PER_MESSAGE + ) { + log.error( + `Too many cars in inventory: ${inventoryCars.inventory.length}` + ); + return; + } + + log.debug(`Sending ${inventoryCars.inventory.length} cars`); + + while (inventoryCars.inventory.length > 0) { + const car = inventoryCars.inventory.shift(); + + if (typeof car === 'undefined') { + log.error(`Car not found`); + break; + } + + const stockCar = new StockCar(); + + stockCar.setBrandedPartId(car.brandedPartId); + stockCar.setIsDealOfTheDay(car.isDealOfTheDay === 1); + + let carCost = car.retailPrice || 0; + + if (car.isDealOfTheDay === 1) { + const discount = carCost * inventoryCars.dealOfTheDayDiscount; + carCost -= discount; + } + + stockCar.setRetailPrice(carCost); + + responsePacket.addCar(stockCar); + } + + log.debug( + `Sending ${responsePacket.getNumberOfCars()} cars...complete` + ); + + responsePacket.setMoreCars(false); + + response.setData(responsePacket); + response.populateHeader(message.header.getSequence()); + log.resetName(); + return socketCallback([response]); + } catch (error) { + log.error(`Error processing stock car info: ${error as string}`); + throw error; + } +} + +// Path: packages/mcots/messageProcessors/processStockCarInfo.ts diff --git a/packages/mcots/messageProcessors/sendSuccess.ts b/packages/mcots/messageProcessors/sendSuccess.ts new file mode 100644 index 000000000..0614d6108 --- /dev/null +++ b/packages/mcots/messageProcessors/sendSuccess.ts @@ -0,0 +1,17 @@ +import { + ServerGenericResponse, + ServerMessage +} from "rusty-motors-shared-packets"; +import type { ServerSocketCallback } from "./index.js"; + +export function sendSuccess(message: ServerMessage, socketCallback: ServerSocketCallback) { + const pReply = new ServerGenericResponse(); + pReply.setMessageId(101); + pReply.setMsgReply(438); + + const response = new ServerMessage(101); + response.setData(pReply); + response.populateHeader(message.getSequence()); + + socketCallback([response]); +} diff --git a/packages/mcots/package.json b/packages/mcots/package.json new file mode 100644 index 000000000..848ab63bf --- /dev/null +++ b/packages/mcots/package.json @@ -0,0 +1,25 @@ +{ + "name": "rusty-motors-mcots", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + }, + "description": "" +} diff --git a/packages/mcots/payloads/ClientConnectMessage.ts b/packages/mcots/payloads/ClientConnectMessage.ts new file mode 100644 index 000000000..ada18c329 --- /dev/null +++ b/packages/mcots/payloads/ClientConnectMessage.ts @@ -0,0 +1,72 @@ +import { ServerMessagePayload } from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +export class ClientConnectionMessage extends ServerMessagePayload { + private _customerId: number = 0; // 4 bytes + private _personaId: number = 0; // 4 bytes + private _customerName: string = ""; // 13 bytes + private _personaName: string = ""; // 13 bytes + private _clientVersion: number = 0; // 4 bytes + + constructor(size: number) { + super(); + + this._data = Buffer.alloc(size); + } + + override getByteSize(): number { + return 2 + 4 + 4 + 13 + 13 + 4; // 40 bytes + } + + override deserialize(data: Buffer): ClientConnectionMessage { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + + this._customerId = data.readUInt32LE(2); + + this._personaId = data.readUInt32LE(6); + + this._customerName = data.toString("utf8", 10, 23); + + this._personaName = data.toString("utf8", 23, 36); + + this._clientVersion = data.readUInt32LE(36); + + return this; + } catch (error) { + log.error( + `Error deserializing ClientTrackingMessage: ${error as string}`, + ); + throw error; + } + } + + getCustomerId() { + return this._customerId; + } + + getPersonaId() { + return this._personaId; + } + + getCustomerName() { + return this._customerName; + } + + getPersonaName() { + return this._personaName; + } + + getClientVersion() { + return this._clientVersion; + } + + toString(): string { + return `ClientConnectionMessage {customerId: ${this._customerId}, personaId: ${this._personaId}, customerName: ${this._customerName}, personaName: ${this._personaName}, clientVersion: ${this._clientVersion}}`; + } + +} diff --git a/packages/mcots/payloads/ClientTrackingMessage.ts b/packages/mcots/payloads/ClientTrackingMessage.ts new file mode 100644 index 000000000..f07593dbc --- /dev/null +++ b/packages/mcots/payloads/ClientTrackingMessage.ts @@ -0,0 +1,44 @@ +import { ServerMessagePayload } from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +export class ClientTrackingMessage extends ServerMessagePayload { + private _type: number = 0; // 2 bytes + private _trackingText: string = ""; // 256 bytes + + constructor(size: number) { + super(); + + this._data = Buffer.alloc(size); + } + + override getByteSize(): number { + return 0; + } + + override deserialize(data: Buffer): ClientTrackingMessage { + try { + this.messageId = data.readUInt16LE(0); + + this._type = data.readUInt16LE(2); + + this._trackingText = data.toString("utf8", 4, 260); + + return this; + } catch (error) { + log.error( + `Error deserializing ClientTrackingMessage: ${error as string}`, + ); + throw error; + } + } + + getType() { + return this._type; + } + + getTrackingText() { + return this._trackingText; + } +} diff --git a/packages/mcots/payloads/LoginCompleteMessage.ts b/packages/mcots/payloads/LoginCompleteMessage.ts new file mode 100644 index 000000000..53438b045 --- /dev/null +++ b/packages/mcots/payloads/LoginCompleteMessage.ts @@ -0,0 +1,231 @@ +import { ServerMessagePayload } from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +export class LoginCompleteMessage extends ServerMessagePayload { + private _serverTime: number = 0; // 4 bytes + private _firstTime: boolean = false; // 1 byte + private _paycheckWaiting: boolean = false; // 1 byte + private _clubInvitesWaiting: boolean = false; // 1 byte + private tallyInProgress: boolean = false; // 1 byte + private _secondsUntilShutdown: number = 0; // 2 bytes + + private _shardGNP: number = 0; // 4 bytes + private _shardCarsSold: number = 0; // 4 bytes + private _shardAverageSalaries: number = 0; // 4 bytes + private _shardAverageCarsOwned: number = 0; // 4 bytes + private _shardAverageLevel: number = 0; // 4 bytes + + private _cookie: number = 0; // 4 bytes + + private _nextTallyDate: number = 0; // 4 bytes + private _nextPaycheckDate: number = 0; // 4 bytes + + constructor() { + super(); + + this._data = Buffer.alloc(this.getByteSize()); + } + + override getByteSize(): number { + return 2 + 4 + 1 + 1 + 1 + 1 + 1 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4; + } + + override deserialize(data: Buffer): LoginCompleteMessage { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + + this._serverTime = data.readUInt32LE(2); + + this._firstTime = data.readUInt8(6) === 1; + + this._paycheckWaiting = data.readUInt8(7) === 1; + + this._clubInvitesWaiting = data.readUInt8(8) === 1; + + this.tallyInProgress = data.readUInt8(9) === 1; + + this._secondsUntilShutdown = data.readUInt16LE(10); + + this._shardGNP = data.readUInt32LE(12); + + this._shardCarsSold = data.readUInt32LE(16); + + this._shardAverageSalaries = data.readUInt32LE(20); + + this._shardAverageCarsOwned = data.readUInt32LE(24); + + this._shardAverageLevel = data.readUInt32LE(28); + + this._cookie = data.readUInt32LE(32); + + this._nextTallyDate = data.readUInt32LE(36); + + this._nextPaycheckDate = data.readUInt32LE(40); + + return this; + } catch (error) { + log.error( + `Error deserializing LoginCompleteMessage: ${error as string}`, + ); + throw error; + } + } + + getServerTime() { + return this._serverTime; + } + + isFirstTime() { + return this._firstTime; + } + + isPaycheckWaiting() { + return this._paycheckWaiting; + } + + isClubInvitesWaiting() { + return this._clubInvitesWaiting; + } + + isTallyInProgress() { + return this.tallyInProgress; + } + + getSecondsUntilShutdown() { + return this._secondsUntilShutdown; + } + + getShardGNP() { + return this._shardGNP; + } + + getShardCarsSold() { + return this._shardCarsSold; + } + + getShardAverageSalaries() { + return this._shardAverageSalaries; + } + + getShardAverageCarsOwned() { + return this._shardAverageCarsOwned; + } + + getShardAverageLevel() { + return this._shardAverageLevel; + } + + getCookie() { + return this._cookie; + } + + getNextTallyDate() { + return this._nextTallyDate; + } + + getNextPaycheckDate() { + return this._nextPaycheckDate; + } + + override serialize(): Buffer { + this._data.writeUInt16LE(this.messageId, 0); + + this._data.writeUInt32LE(this._serverTime, 2); + + this._data.writeUInt8(this._firstTime ? 1 : 0, 6); + + this._data.writeUInt8(this._paycheckWaiting ? 1 : 0, 7); + + this._data.writeUInt8(this._clubInvitesWaiting ? 1 : 0, 8); + + this._data.writeUInt8(this.tallyInProgress ? 1 : 0, 9); + + this._data.writeUInt16LE(this._secondsUntilShutdown, 10); + + this._data.writeUInt32LE(this._shardGNP, 12); + + this._data.writeUInt32LE(this._shardCarsSold, 16); + + this._data.writeUInt32LE(this._shardAverageSalaries, 20); + + this._data.writeUInt32LE(this._shardAverageCarsOwned, 24); + + this._data.writeUInt32LE(this._shardAverageLevel, 28); + + this._data.writeUInt32LE(this._cookie, 32); + + this._data.writeUInt32LE(this._nextTallyDate, 36); + + this._data.writeUInt32LE(this._nextPaycheckDate, 40); + + return this._data; + } + + toString(): string { + return `LoginCompleteMessage {serverTime: ${this._serverTime}, firstTime: ${this._firstTime}, paycheckWaiting: ${this._paycheckWaiting}, clubInvitesWaiting: ${this._clubInvitesWaiting}, tallyInProgress: ${this.tallyInProgress}, secondsUntilShutdown: ${this._secondsUntilShutdown}, shardGNP: ${this._shardGNP}, shardCarsSold: ${this._shardCarsSold}, shardAverageSalaries: ${this._shardAverageSalaries}, shardAverageCarsOwned: ${this._shardAverageCarsOwned}, shardAverageLevel: ${this._shardAverageLevel}, cookie: ${this._cookie}, nextTallyDate: ${this._nextTallyDate}, nextPaycheckDate: ${this._nextPaycheckDate}}`; + } + + setServerTime(serverTime: number) { + this._serverTime = serverTime; + } + + setFirstTime(firstTime: boolean) { + this._firstTime = firstTime; + } + + setPaycheckWaiting(paycheckWaiting: boolean) { + this._paycheckWaiting = paycheckWaiting; + } + + setClubInvitesWaiting(clubInvitesWaiting: boolean) { + this._clubInvitesWaiting = clubInvitesWaiting; + } + + setTallyInProgress(tallyInProgress: boolean) { + this.tallyInProgress = tallyInProgress; + } + + setSecondsUntilShutdown(secondsUntilShutdown: number) { + this._secondsUntilShutdown = secondsUntilShutdown; + } + + setShardGNP(shardGNP: number) { + this._shardGNP = shardGNP; + } + + setShardCarsSold(shardCarsSold: number) { + this._shardCarsSold = shardCarsSold; + } + + setShardAverageSalaries(shardAverageSalaries: number) { + this._shardAverageSalaries = shardAverageSalaries; + } + + setShardAverageCarsOwned(shardAverageCarsOwned: number) { + this._shardAverageCarsOwned = shardAverageCarsOwned; + } + + setShardAverageLevel(shardAverageLevel: number) { + this._shardAverageLevel = shardAverageLevel; + } + + setCookie(cookie: number) { + this._cookie = cookie; + } + + setNextTallyDate(nextTallyDate: number) { + this._nextTallyDate = nextTallyDate; + } + + setNextPaycheckDate(nextPaycheckDate: number) { + this._nextPaycheckDate = nextPaycheckDate; + } + + size(): number { + return this.getByteSize(); + } +}; diff --git a/packages/mcots/payloads/LoginMessage.ts b/packages/mcots/payloads/LoginMessage.ts new file mode 100644 index 000000000..c46a5ff80 --- /dev/null +++ b/packages/mcots/payloads/LoginMessage.ts @@ -0,0 +1,86 @@ +import { ServerMessagePayload } from "rusty-motors-shared-packets" +import { getServerLogger } from "rusty-motors-shared" + +const log = getServerLogger(); + +export class LoginMessage extends ServerMessagePayload { + private _customerId: number = 0; // 4 bytes + private _personaId: number = 0; // 4 bytes + private _lotOwnerId: number = 0; // 4 bytes + private _brandedPartId: number = 0; // 4 bytes + private _skinId: number = 0; // 4 bytes + private _personaName: string = ""; // 13 bytes + private _mcVersion: string = ""; // 4 bytes + + constructor(size: number) { + super(); + + this._data = Buffer.alloc(size); + } + + override getByteSize(): number { + return 2 + 4 + 4 + 4 + 4 + 4 + 13 + 4; + } + + override deserialize(data: Buffer): LoginMessage { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + + this._customerId = data.readUInt32LE(2); + + this._personaId = data.readUInt32LE(6); + + this._lotOwnerId = data.readUInt32LE(10); + + this._brandedPartId = data.readUInt32LE(14); + + this._skinId = data.readUInt32LE(18); + + this._personaName = data.toString("utf8", 22, 35); + + this._mcVersion = data.toString("utf8", 35, 39); + + return this; + } catch (error) { + log.error( + `Error deserializing LoginMessage: ${error as string}`, + ); + throw error; + } + } + + getCustomerId() { + return this._customerId; + } + + getPersonaId() { + return this._personaId; + } + + getLotOwnerId() { + return this._lotOwnerId; + } + + + getBrandedPartId() { + return this._brandedPartId; + } + + getSkinId() { + return this._skinId; + } + + getPersonaName() { + return this._personaName; + } + + getClientVersion() { + return this._mcVersion; + } + + override toString(): string { + return `LoginMessage: ${this.getPersonaName()}, customerId: ${this.getCustomerId()}, personaId: ${this.getPersonaId()}, lotOwnerId: ${this.getLotOwnerId()}, brandedPartId: ${this.getBrandedPartId()}, skinId: ${this.getSkinId()}, mcVersion: ${this.getClientVersion()}`; + } +}; diff --git a/packages/mcots/payloads/SetOptionsMessage.ts b/packages/mcots/payloads/SetOptionsMessage.ts new file mode 100644 index 000000000..3275f80fa --- /dev/null +++ b/packages/mcots/payloads/SetOptionsMessage.ts @@ -0,0 +1,78 @@ +import { ServerMessagePayload } from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +export class SetOptionsMessage extends ServerMessagePayload { + private _lpCode: number = 0; // 2 bytes + private _lpText: string = ""; // 8 bytes + private _carInfoSettings: number = 0; // 4 bytes + private _carNumbers = { + carNumber1: "", // 3 bytes + carNumber2: "", // 3 bytes + carNumber3: "", // 3 bytes + carNumber4: "", // 3 bytes + carNumber5: "", // 3 bytes + carNumber6: "", // 3 bytes + }; + + constructor() { + super(); + + this._data = Buffer.alloc(this.getByteSize()); + } + + override getByteSize(): number { + return 2 + 8 + 4 + 3 * 6; + } + + override deserialize(data: Buffer): SetOptionsMessage { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + + this._lpCode = data.readUInt16LE(2); + + this._lpText = data.toString("utf8", 4, 12); + + this._carInfoSettings = data.readUInt32LE(12); + + this._carNumbers.carNumber1 = data.toString("utf8", 16, 19); + this._carNumbers.carNumber2 = data.toString("utf8", 19, 22); + this._carNumbers.carNumber3 = data.toString("utf8", 22, 25); + this._carNumbers.carNumber4 = data.toString("utf8", 25, 28); + this._carNumbers.carNumber5 = data.toString("utf8", 28, 31); + this._carNumbers.carNumber6 = data.toString("utf8", 31, 34); + + return this; + } catch (error) { + log.error( + `Error deserializing SetOptionsMessage: ${error as string}`, + ); + throw error; + } + } + + getLpCode() { + return this._lpCode; + } + + getLpText() { + return this._lpText; + } + + getCarInfoSettings() { + return this._carInfoSettings; + } + + getCarNumbers() { + return this._carNumbers; + } + + toString() { + return `SetOptionsMessage: lpCode=${this._lpCode}, lpText=${this._lpText}, carInfoSettings=${this._carInfoSettings}, carNumbers=${JSON.stringify(this._carNumbers)}`; + } + + +} diff --git a/packages/mcots/payloads/StockCar.ts b/packages/mcots/payloads/StockCar.ts new file mode 100644 index 000000000..85af3f1d2 --- /dev/null +++ b/packages/mcots/payloads/StockCar.ts @@ -0,0 +1,122 @@ +import { + Serializable, + ServerMessagePayload, +} from "rusty-motors-shared-packets"; +import { getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +export class StockCar extends Serializable { + private brandedPartId: number = 0; // 4 bytes + private retailPrice: number = 0; // 4 bytes + private isDealOfTheDay: number = 0; // 2 bytes + + override getByteSize(): number { + return 10; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt32LE(this.brandedPartId, 0); + buffer.writeUInt32LE(this.retailPrice, 4); + buffer.writeUInt16LE(this.isDealOfTheDay, 8); + + return buffer; + } catch (error) { + log.error(`Error serializing StockCar: ${error as string}`); + throw error; + } + } + + setBrandedPartId(brandedPartId: number) { + this.brandedPartId = brandedPartId; + } + + setRetailPrice(retailPrice: number) { + this.retailPrice = retailPrice; + } + + setIsDealOfTheDay(isDealOfTheDay: boolean) { + this.isDealOfTheDay = isDealOfTheDay ? 1 : 0; + } + + toString(): string { + return `StockCar: ${this.brandedPartId}, ${this.retailPrice}, ${this.isDealOfTheDay}`; + } +} + +export class StackCarInfo extends ServerMessagePayload { + static MAX_CARS_PER_MESSAGE = 100; + private _cars: StockCar[] = []; + // msgNo: 2 bytes + private _starterCash: number = 0; // 4 bytes + private _dealerId: number = 0; // 4 bytes + private _brandId: number = 0; // 4 bytes + private _numberOfCars: number = 0; // 2 bytes + private _moreCars: number = 0; // 2 bytes + + override getByteSize(): number { + return ( + 2 + + 4 + + 4 + + 4 + + 2 + + 1 + + this._cars.length * StockCar.prototype.getByteSize() + ); + } + + setStarterCash(starterCash: number) { + this._starterCash = starterCash; + } + + setDealerId(dealerId: number) { + this._dealerId = dealerId; + } + + setBrandId(brandId: number) { + this._brandId = brandId; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.getMessageId(), 0); + buffer.writeUInt32LE(this._starterCash, 2); + buffer.writeUInt32LE(this._dealerId, 6); + buffer.writeUInt32LE(this._brandId, 10); + buffer.writeUInt16LE(this.getNumberOfCars(), 14); + buffer.writeInt8(this._moreCars, 16); + + let offset = 17; + for (const car of this._cars) { + car.serialize().copy(buffer, offset); + offset += car.getByteSize(); + } + + return buffer; + } catch (error) { + log.error(`Error serializing StackCarInfo: ${error as string}`); + throw error; + } + } + + addCar(car: StockCar) { + this._cars.push(car); + this._numberOfCars = this._cars.length; + } + + getNumberOfCars(): number { + return this._numberOfCars; + } + + setMoreCars(moreCars: boolean) { + this._moreCars = moreCars ? 1 : 0; + } + + toString(): string { + return `StackCarInfo: ${this._cars.length} cars, ${this._starterCash} starter cash, ${this._dealerId} dealerId, ${this._brandId} brandId`; + } +} diff --git a/packages/mcots/payloads/index.ts b/packages/mcots/payloads/index.ts new file mode 100644 index 000000000..e49a30f67 --- /dev/null +++ b/packages/mcots/payloads/index.ts @@ -0,0 +1,8 @@ +export { ClientConnectionMessage } from './ClientConnectMessage.js'; +export { ClientTrackingMessage } from './ClientTrackingMessage.js'; +export { LoginMessage } from './LoginMessage.js'; +export { LoginCompleteMessage } from './LoginCompleteMessage.js'; +export { SetOptionsMessage } from './SetOptionsMessage.js'; +export { StackCarInfo, StockCar } from './StockCar.js'; + +// Path: packages/mcots/payloads/index.ts diff --git a/packages/mcots/test/index.test.ts b/packages/mcots/test/index.test.ts new file mode 100644 index 000000000..f01d2f75d --- /dev/null +++ b/packages/mcots/test/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("example", () => { + it("should pass", () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/mcots/types.ts b/packages/mcots/types.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/mcots/vite.config.ts b/packages/mcots/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/mcots/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts new file mode 100644 index 000000000..caf5b719c --- /dev/null +++ b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts @@ -0,0 +1,40 @@ +import { + GameMessage, + MiniRiffInfo, + MiniRiffList, + getAsHex, +} from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +// Command id: 0x30c +export async function getLobMiniRiffList( + commandId: number, + data: Buffer +): Promise { + log.setName('nps:getLobMiniRiffList'); + log.info(`Processing getLobMiniRiffList command: ${getAsHex(data)}`); + + const riffList = new MiniRiffList(); + + riffList.addRiff(new MiniRiffInfo('CTRL', 0, 1)); + riffList.addRiff(new MiniRiffInfo('MC141', 141, 0)); + riffList.addRiff(new MiniRiffInfo('MCCHAT', 191, 0)); + + log.info(`getLobMiniRiffList: ${riffList.toString()}`); + + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x404); + responseMessage.setData(riffList); + + log.info('Dumping responseMessage: '); + + log.info( + `responseMessage: ${ + responseMessage.serialize().length + } bytes - ${getAsHex(responseMessage.serialize())}` + ); + + return responseMessage.serialize(); +} diff --git a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts new file mode 100644 index 000000000..ad09e529d --- /dev/null +++ b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts @@ -0,0 +1,28 @@ +import { + GameMessage, + MiniUserInfo, + MiniUserList, + getAsHex, +} from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +// Command id: 0x128 +export async function getLobMiniUserList( + commandId: number, + data: Buffer +): Promise { + log.setName('nps:getLobMiniUserList'); + log.info(`Processing getLobMiniUserList command: ${getAsHex(data)}`); + + const miniUserList = new MiniUserList(0); + + miniUserList.addChannelUser(new MiniUserInfo(1000, 'Molly')); + + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x229); + responseMessage.setData(miniUserList); + + return Promise.resolve(responseMessage.serialize()); +} diff --git a/packages/nps/gameMessageProcessors/index.ts b/packages/nps/gameMessageProcessors/index.ts new file mode 100644 index 000000000..26f0a350b --- /dev/null +++ b/packages/nps/gameMessageProcessors/index.ts @@ -0,0 +1,88 @@ +import { processGameLogin } from "./processGameLogin.js"; +import { processGetProfileMaps } from "./processGetProfileMaps.js"; +import { processCheckProfileName } from "./processCheckProfileName.js"; +import { processCheckPlateText } from "./processCheckPlateText.js"; +import { processCreateProfile } from "./processCreateProfile.js"; +import { processDeleteProfile } from "./processDeleteProfile.js"; +import { processGetProfileInfo } from "./processGetProfileInfo.js"; +import { processSelectPersona } from "./processSelectPersona.js"; +import { processUserLogin } from "./processUserLogin.js"; +import { processFirstBuddy } from "./processGetFirstBuddy.js"; +import { processEncryptedGameCommand } from "./processEncryptedGameCommand.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +import { processPing } from "./processPing.js"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; +import { processGameLogout } from "./processGameLogout.js"; + +export type GameSocketCallback = (messages: Buffer[]) => void; + +export type MessageProcessor = ( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +) => Promise; + +export class MessageProcessorError extends Error { + constructor(id: number, message: string) { + super(`MessageProcessorError: ${id}: ${message}`); + } +} + +export const gameMessageProcessors = new Map([]); + +export function populateGameMessageProcessors( + processors: Map, +): void { + processors.set(256, processUserLogin); // 0x100 + processors.set(535, processPing); // 0x217 + processors.set(1281, processGameLogin); // 0x501 + processors.set(1283, processSelectPersona); // 0x503 + processors.set(1287, processCreateProfile); // 0x507 + processors.set(1291, processFirstBuddy); // 0x50b + processors.set(1295, processGameLogout); // 0x50f + processors.set(1298, processDeleteProfile); // 0x512 + processors.set(1305, processGetProfileInfo); // 0x519 + processors.set(1330, processGetProfileMaps); // 0x532 + processors.set(1331, processCheckProfileName); // 0x533 + processors.set(1332, processCheckPlateText); // 0x534 + processors.set(4353, processEncryptedGameCommand); // 0x1101 +} + +export function getGameMessageProcessor(messageId: number) { + if (gameMessageProcessors.has(messageId) === true) { + return gameMessageProcessors.get(messageId) as MessageProcessor; + } + + return undefined; +} + +export class PortMapError extends Error { + port: number; + constructor(port: number, message: string) { + super(message); + this.name = "PortMapError"; + this.port = port; + } + + override toString(): string { + return `${this.name}: ${this.message}`; + } +} + +export const portToMessageTypes = new Map([]); + +export function populatePortToMessageTypes(portMap: Map): void { + portMap.set(7003, "Game"); + portMap.set(8226, "Game"); + portMap.set(8228, "Game"); + portMap.set(43300, "Server"); +} + +export function getPortMessageType(port: number): string { + if (portToMessageTypes.has(port) === true) { + // @ts-expect-error - Since has() is true, the return value is NOT undefined + return portToMessageTypes.get(port); + } + throw new PortMapError(port, "No message type found"); +} diff --git a/packages/nps/gameMessageProcessors/lobbyCommands.ts b/packages/nps/gameMessageProcessors/lobbyCommands.ts new file mode 100644 index 000000000..821c0a28e --- /dev/null +++ b/packages/nps/gameMessageProcessors/lobbyCommands.ts @@ -0,0 +1,15 @@ +// 030c0004cdcdcdcd + +import { getLobMiniRiffList } from "./getLobMiniRiffList.js"; +import { getLobMiniUserList } from "./getLobMiniUserList.js"; + +// 0128000800000000 + +export type lobbyCommandProcessor = ( + commandId: number, + data: Buffer, +) => Promise; + +export const lobbyCommandMap = new Map(); +lobbyCommandMap.set(0x30c, getLobMiniRiffList); +lobbyCommandMap.set(0x128, getLobMiniUserList); diff --git a/packages/nps/gameMessageProcessors/processCheckPlateText.ts b/packages/nps/gameMessageProcessors/processCheckPlateText.ts new file mode 100644 index 000000000..b58167697 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processCheckPlateText.ts @@ -0,0 +1,33 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "./index.js"; +import { getLenString } from "../src/utils/pureGet.js"; +import { getServerLogger } from "rusty-motors-shared"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; +import { sendNPSAck } from "../src/utils/sendNPSAck.js"; + +const log = getServerLogger(); + +export async function processCheckPlateText( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + log.setName("nps:processCheckPlateText"); + + const plateType = message.getDataAsBuffer().readUInt32BE(0); + + const requestedPlateText = getLenString( + message.getDataAsBuffer(), + 4, + false, + ); + + log.info( + `Requested plate text: ${requestedPlateText} for plate type ${plateType}`, + ); + + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processCheckProfileName.ts b/packages/nps/gameMessageProcessors/processCheckProfileName.ts new file mode 100644 index 000000000..67bf2f4a7 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processCheckProfileName.ts @@ -0,0 +1,33 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "./index.js"; +import { getLenString } from "../src/utils/pureGet.js"; + +import { getServerLogger } from "rusty-motors-shared"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; + +const log = getServerLogger(); + +export async function processCheckProfileName( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + log.setName("nps:processCheckProfileName"); + const customerId = message.serialize().readUInt32BE(8); + + const requestedPersonaName = getLenString(message.serialize(), 12, false); + + log.info( + `Requested persona name: ${requestedPersonaName} for customer ${customerId}`, + ); + + const response = new GameMessage(0); + response.header.setId(0x601); + + const responseBytes = response.serialize(); + + socketCallback([responseBytes]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processCreateProfile.ts b/packages/nps/gameMessageProcessors/processCreateProfile.ts new file mode 100644 index 000000000..fe359a311 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processCreateProfile.ts @@ -0,0 +1,45 @@ +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "./index.js"; +import { GameProfile } from "../messageStructs/GameProfile.js"; +import { getServerLogger } from "rusty-motors-shared"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; +import { addGameProfile } from "../services/profile.js"; + +const log = getServerLogger(); + +export async function processCreateProfile( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + log.setName("nps:processCreateProfile"); + // Log the request + log.info(`ProcessCreateProfile request: ${message.toString()}`); + + const createProfileMessage = GameProfile.fromBytes( + message.getDataAsBuffer(), + ); + + // Log the request + log.info( + `ProcessCreateProfile request: ${createProfileMessage.toString()}`, + ); + + // Add the profile + addGameProfile(createProfileMessage); + + + // TODO: Send the response + const response = new GameMessage(257); + response.header.setId(0x601); + + response.setData(message.getData()); + + // Log the response + log.info(`ProcessCreateProfile response: ${response.toString()}`); + + socketCallback([response.serialize()]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processDeleteProfile.ts b/packages/nps/gameMessageProcessors/processDeleteProfile.ts new file mode 100644 index 000000000..0be750070 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processDeleteProfile.ts @@ -0,0 +1,109 @@ +import fs from "node:fs"; +import crypto from "node:crypto"; +import type { GameSocketCallback } from "./index.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +import { SessionKey } from "../messageStructs/SessionKey.js"; +import { getLenString } from "../src/utils/pureGet.js"; + +import { getServerLogger } from "rusty-motors-shared"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; + +const log = getServerLogger(); + +export function loadPrivateKey(path: string): string { + const privateKey = fs.readFileSync(path); + + return privateKey.toString("utf8"); +} + +export function decryptSessionKey( + encryptedSessionKey: string, + privateKey: string, +): string { + const sessionKeyStructure = crypto.privateDecrypt( + privateKey, + Buffer.from(encryptedSessionKey, "hex"), + ); + + return sessionKeyStructure.toString("hex"); +} + +export function unpackUserLoginMessage(message: GameMessage): { + sessionKey: string; + gameId: string; + contextToken: string; +} { + // Get the context token + const ticket = getLenString(message.getDataAsBuffer(), 0, false); + + let dataOffset = ticket.length + 2; + + // The next data structure is a container with an empty id, a length, and a data structure + + // Skip the empty id + dataOffset += 2; + + // Get the next data length + const nextDataLength = message.getDataAsBuffer().readUInt16BE(dataOffset); + + // This value is the encrypted session key hex, stored as a string + const encryptedSessionKey = message + .getDataAsBuffer() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) + .toString("utf8"); + + // Load the private key + const privateKey = loadPrivateKey("./data/private_key.pem"); + + // Decrypt the session key + const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); + + // Unpack the session key + const sessionKeyStructure = SessionKey.fromBytes( + Buffer.from(sessionKey, "hex"), + ); + + // Update the data offset + dataOffset += 2 + nextDataLength; + + // Get the next data length + const nextDataLength2 = message.getDataAsBuffer().readUInt16BE(dataOffset); + + // This value is the game id (used by server to identify the game) + const gameId = message + .getDataAsBuffer() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) + .toString("utf8"); + + // Update the data offset + dataOffset += 2 + nextDataLength2; + + // Return the session key, game id, and context token + return { + sessionKey: sessionKeyStructure.getKey(), + gameId, + contextToken: ticket, + }; +} + +export async function processDeleteProfile( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + log.setName("nps:processDeleteProfile"); + // Log the message + log.info(`Delete profile request: ${message.toString()}`); + + // TODO: Delete the profile + + // Create a new message - Login ACK + const loginACK = new GameMessage(0); + loginACK.header.setId(0x60c); + + // Send the ack + socketCallback([loginACK.serialize()]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts new file mode 100644 index 000000000..d64c05a70 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts @@ -0,0 +1,113 @@ +import { + GameMessage, + SerializableData, +} from "../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "./index.js"; +import { getAsHex } from "../src/utils/pureGet.js"; +import { + type EncryptionSession, + getEncryptionSession, newEncryptionSession, + setEncryptionSession +} from "../src/EncryptionSession.js"; +import { lobbyCommandMap } from "./lobbyCommands.js"; + +import { getServerLogger } from "rusty-motors-shared"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; + +const log = getServerLogger(); + +export async function processEncryptedGameCommand( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + log.setName("nps:processEncryptedGameCommand"); + log.info(`Attempting to decrypt message: ${message.toString()}`); + + // Get the encryption session + let encryptionSession: EncryptionSession | undefined = + getEncryptionSession(connectionId); + + // If the encryption session doesn't exist, attempt to create it + if (typeof encryptionSession === "undefined") { + try { + // Create the encryption session + const newSession = newEncryptionSession({ + connectionId, + customerId: userStatus.getCustomerId(), + sessionKey: userStatus.getSessionKey().getKey().substring(0, 16), + }); + setEncryptionSession(newSession); + encryptionSession = newSession; + } catch (error) { + log.error(`Error creating encryption session: ${error as string}`); + throw new Error("Error creating encryption session"); + } + + // Log the encryption session + log.info(`Created encryption session for ${userStatus.getCustomerId()}`); + } + + // Attempt to decrypt the message + const decryptedbytes = encryptionSession.gameDecipher.update( + message.getDataAsBuffer(), + ); + + // Log the decrypted bytes + log.info(`Decrypted bytes: ${getAsHex(decryptedbytes)}`); + + // Set the decrypted bytes as a new message + const decryptedMessage = new GameMessage(0); + decryptedMessage.deserialize(decryptedbytes); + + // Log the decrypted message id + log.info(`Decrypted message ID: ${decryptedMessage.header.getId()}`); + + // Do we have a valid message processor? + const processor = lobbyCommandMap.get(decryptedMessage.header.getId()); + + if (typeof processor === "undefined") { + const err = `No processor found for message ID: ${decryptedMessage.header.getId()}`; + log.fatal(err); + throw Error(err); + } + + // Process the message + const response = await processor( + decryptedMessage.header.getId(), + decryptedMessage.getDataAsBuffer(), + ); + + // Log the response + log.info(`Response: ${response.length} bytes, ${getAsHex(response)}`); + + // Encrypt the response + const encryptedResponse = encryptionSession.gameCipher.update(response); + setEncryptionSession(encryptionSession); + + // Log the encrypted response + log.info( + `Encrypted response: ${encryptedResponse.length} bytes, ${getAsHex( + encryptedResponse, + )}`, + ); + + const responsePacket = new GameMessage(0); + responsePacket.header.setId(0x1101); + + const responseData = new SerializableData(encryptedResponse.length); + responseData.deserialize(encryptedResponse); + + responsePacket.setData(responseData); + log.info( + `Response packet: ${responsePacket.header.getLength()} bytes, ${getAsHex( + responsePacket.serialize(), + )}`, + ); + const responseBytes = responsePacket.serialize(); + + socketCallback([responseBytes]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processGameLogin.ts b/packages/nps/gameMessageProcessors/processGameLogin.ts new file mode 100644 index 000000000..dd3c8ff05 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processGameLogin.ts @@ -0,0 +1,210 @@ +import type { ISerializable } from "../types.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +import fs from "node:fs"; +import crypto from "node:crypto"; +import * as Sentry from "@sentry/node"; +import { getToken } from "../services/token.js"; +import type { GameSocketCallback } from "./index.js"; +import { SessionKey } from "../messageStructs/SessionKey.js"; +import { getAsHex, getLenString } from "../src/utils/pureGet.js"; +import { UserStatus } from "../messageStructs/UserStatus.js"; +import { getServerConfiguration, getServerLogger } from "rusty-motors-shared"; +import { UserStatusManager } from "../src/UserStatusManager.js"; + +const log = getServerLogger(); + +export function loadPrivateKey(path: string): string { + const privateKey = fs.readFileSync(path); + + return privateKey.toString("utf8"); +} + +export function decryptSessionKey( + encryptedSessionKey: string, + privateKey: string, +): string { + const sessionKeyStructure = crypto.privateDecrypt( + privateKey, + Buffer.from(encryptedSessionKey, "hex"), + ); + + return sessionKeyStructure.toString("hex"); +} + +export function unpackUserLoginMessage(message: ISerializable): { + sessionKey: string; + gameId: string; + contextToken: string; +} { + log.setName("nps:unpackUserLoginMessage"); + log.info(`Unpacking user login message: ${getAsHex(message.serialize())}`); + + // Get the context token + const ticket = getLenString(message.serialize(), 0, false); + + let dataOffset = ticket.length + 2; + + // The next data structure is a container with an empty id, a length, and a data structure + + // Skip the empty id + dataOffset += 2; + + // Get the next data length + const nextDataLength = message.serialize().readUInt16BE(dataOffset); + + // This value is the encrypted session key hex, stored as a string + const encryptedSessionKey = message + .serialize() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) + .toString("utf8"); + + // Load the private key + const privateKey = loadPrivateKey( + getServerConfiguration({}).privateKeyFile, + ); + + // Decrypt the session key + const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); + + log.info(`Decrypted session key: ${getAsHex(Buffer.from(sessionKey, "hex"))}`); + + // Unpack the session key + const sessionKeyStructure = SessionKey.fromBytes( + Buffer.from(sessionKey, "hex"), + ); + + log.info(`Session key structure: ${sessionKeyStructure.toString()}`); + + // Update the data offset + dataOffset += 2 + nextDataLength; + + // Get the next data length + const nextDataLength2 = message.serialize().readUInt16BE(dataOffset); + + // This value is the game id (used by server to identify the game) + const gameId = message + .serialize() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) + .toString("utf8"); + + // Update the data offset + dataOffset += 2 + nextDataLength2; + + log.resetName(); + + // Return the session key, game id, and context token + return { + sessionKey: sessionKeyStructure.getKey(), + gameId, + contextToken: ticket, + }; +} + +/** + * This is the initial connection to the Login server + */ +export async function processGameLogin( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + Sentry.startSpan( + { + name: "processLogin", + op: "processLogin", + }, + () => { + log.setName("nps:processLogin"); + + log.info(`Login: ${message.toString()}`); + + // Unpack the message + try { + const { sessionKey, contextToken } = + unpackUserLoginMessage(message.getData()); + + // Log the context token + log.info(`Context token: ${contextToken}`); + + // Log the session key + log.info(`Session key: ${sessionKey}`); + + // Look up the customer id + const user = getToken(contextToken); + + // If the user is not found, return an error + if (user === undefined) { + log.error(`User not found for context token: ${contextToken}`); + + // Create a new message - Not found + const response = new GameMessage(0); + response.header.setId(0x602); + + // Send the message - twice + Sentry.startSpan( + { + name: "socketCallback", + op: "socketCallback", + }, + () => { + socketCallback([response.serialize()]); + }, + ); + Sentry.startSpan( + { + name: "socketCallback", + op: "socketCallback", + }, + () => { + socketCallback([response.serialize()]); + }, + ); + + return; + } + + // Log the user + log.info(`User: ${user.customerId}`); + + // Create a new message - Login ACK + const loginACK = new GameMessage(0); + loginACK.header.setId(0x601); + + // Send the ack + socketCallback([loginACK.serialize()]); + + // Create a new UserStatus message + const userStatus = UserStatus.new(); + userStatus.setCustomerId(user.customerId); + userStatus.setPersonaId(0); + userStatus.ban.set({ + initiator: "Molly", + startComment: "Because I said so", + }); + userStatus.setSessionKey(SessionKey.fromKeyString(sessionKey)); + + UserStatusManager.addUserStatus(userStatus); + + // Create a new message - UserStatus + const userStatusMessage = new GameMessage(257); + userStatusMessage.header.setId(0x601); + + userStatusMessage.setData(userStatus); + + // Log the message + log.info(`UserStatus: ${userStatusMessage.toString()}`); + + // Send the message + socketCallback([userStatusMessage.serialize()]); + socketCallback([userStatusMessage.serialize()]); + + return; + } catch (e) { + console.error(e); + } + }, + ); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processGameLogout.ts b/packages/nps/gameMessageProcessors/processGameLogout.ts new file mode 100644 index 000000000..954b807bb --- /dev/null +++ b/packages/nps/gameMessageProcessors/processGameLogout.ts @@ -0,0 +1,15 @@ +import type { GameMessage } from "../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "./index.js"; +import { sendNPSAck } from "../src/utils/sendNPSAck.js"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; + +export async function processGameLogout( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, +): Promise { + + sendNPSAck(socketCallback); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts new file mode 100644 index 000000000..64325db04 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts @@ -0,0 +1,44 @@ +import { + GameMessage, + ProfileList, + SerializableData, + getDWord, + getGameProfilesForCustomerId, +} from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import type { UserStatus } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processFirstBuddy( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processFirstBuddy'); + const profileId = getDWord(message.getDataAsBuffer(), 0, false); + + log.info(`GetFirstBuddy profile: ${profileId}`); + + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(profileId); + + // Create a new NPSList of profiles + const list = new ProfileList(); + + const outMessage = new GameMessage(257); + outMessage.header.setId(0x614); + outMessage.setData(new SerializableData(4)); + + // Log the message + log.info(`GetFirstBuddy: ${outMessage.toString()}`); + + log.info('==========================================='); + + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processGetProfileInfo.ts b/packages/nps/gameMessageProcessors/processGetProfileInfo.ts new file mode 100644 index 000000000..ea648243d --- /dev/null +++ b/packages/nps/gameMessageProcessors/processGetProfileInfo.ts @@ -0,0 +1,66 @@ +import { + GameMessage, + ProfileList, + getAsHex, + getDWord, + getGameProfilesForCustomerId, +} from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import type { UserStatus } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processGetProfileInfo( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processGetProfileInfo'); + const customerId = getDWord(message.serialize(), 0, false); + + log.info(`GetProfileInfo: ${customerId}`); + + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(customerId); + + // Create a new NPSList of profiles + const list = new ProfileList(); + + const outMessage = new GameMessage(0); + + // Add each profile to the list + if (profiles) { + outMessage.header.setId(0x607); + for (const profile of profiles) { + // Log the profile + log.info(`GetProfileInfo: ${profile.toString()}`); // TODO: Remove this line + + list.addProfile(profile); + } + } else { + outMessage.header.setId(0x602); + } + + // Send the list back to the client + try { + // Log the message data + log.info(`GetProfileInfo: ${getAsHex(list.serialize())}`); + + outMessage.setData(list); + + // Log the message + log.info(`GetProfileInfo: ${outMessage.toString()}`); + + log.info('==========================================='); + + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); + } catch (error) { + log.error(`Error sending profile info: ${error as string}`); + throw new Error('Error sending profile info'); + } +} diff --git a/packages/nps/gameMessageProcessors/processGetProfileMaps.ts b/packages/nps/gameMessageProcessors/processGetProfileMaps.ts new file mode 100644 index 000000000..a97737efd --- /dev/null +++ b/packages/nps/gameMessageProcessors/processGetProfileMaps.ts @@ -0,0 +1,71 @@ +import { + GameMessage, + ProfileList, + getAsHex, + getDWord, + getGameProfilesForCustomerId, +} from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import type { UserStatus } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processGetProfileMaps( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processGetProfileMaps'); + // This message is a version 257, but it's version is set to 0 + // This is a bug in the client, so we need to generate a new message + // with the correct version + const requestMessage = GameMessage.fromGameMessage(257, message); + + log.info(`GetProfileMaps (257): ${requestMessage.toString()}`); + + const customerId = getDWord(requestMessage.getDataAsBuffer(), 0, false); + + log.info(`GetProfileMaps: ${customerId}`); + + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(customerId); + + // Create a new NPSList of profiles + const list = new ProfileList(); + + // Add each profile to the list + if (profiles) { + for (const profile of profiles) { + // Log the profile + log.info(`GetProfileMaps: ${profile.toString()}`); + + list.addProfile(profile); + } + } + + // Send the list back to the client + try { + const outMessage = new GameMessage(257); + outMessage.header.setId(0x607); + + // Log the message data + log.info(`GetProfileMaps: ${getAsHex(outMessage.serialize())}`); + + outMessage.setData(list); + + // Log the message + log.info(`GetProfileMaps: ${outMessage.toString()}`); + + log.info('==========================================='); + + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); + } catch (error) { + log.error(`Error sending profile info: ${error as string}`); + throw new Error('Error sending profile info'); + } +} diff --git a/packages/nps/gameMessageProcessors/processPing.ts b/packages/nps/gameMessageProcessors/processPing.ts new file mode 100644 index 000000000..886be08b2 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processPing.ts @@ -0,0 +1,22 @@ +import { GameMessage } from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import type { UserStatus } from 'rusty-motors-nps'; +import { sendNPSAck } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processPing( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processPing'); + log.info(`Ping: ${message.toString()}`); + + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processSelectPersona.ts b/packages/nps/gameMessageProcessors/processSelectPersona.ts new file mode 100644 index 000000000..d99c703a1 --- /dev/null +++ b/packages/nps/gameMessageProcessors/processSelectPersona.ts @@ -0,0 +1,50 @@ +import { GameMessage, getDWord } from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import { UserStatus, UserStatusManager, sendNPSAck } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processSelectPersona( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processSelectPersona'); + + log.info(`SelectPersona: ${message.toString()}`); + + const customerId = getDWord(message.getDataAsBuffer(), 0, false); + + const personaId = getDWord(message.getDataAsBuffer(), 4, false); + + const shardId = getDWord(message.getDataAsBuffer(), 8, false); + + // Log the values + log.info(`Customer ID: ${customerId}`); + log.info(`Persona ID: ${personaId}`); + log.info(`Shard ID: ${shardId}`); + + // Lookup the session + const existingStatus = UserStatusManager.getUserStatus(customerId); + + if (!existingStatus) { + log.error(`UserStatus not found for customer ID ${customerId}`); + throw new Error(`UserStatus not found for customer ID ${customerId}`); + } + + log.info( + `Setting persona ID to ${personaId} for ${existingStatus.getCustomerId()}` + ); + + // Update the user status + existingStatus.setPersonaId(personaId); + + log.info(`GameLogin: ${message.toString()}`); + + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/gameMessageProcessors/processUserLogin.ts b/packages/nps/gameMessageProcessors/processUserLogin.ts new file mode 100644 index 000000000..45f9e2a0c --- /dev/null +++ b/packages/nps/gameMessageProcessors/processUserLogin.ts @@ -0,0 +1,72 @@ +import { + GameMessage, + UserInfo, + getDWord, + getLenString, +} from 'rusty-motors-nps'; +import type { GameSocketCallback } from './index.js'; + +import type { UserStatus } from 'rusty-motors-nps'; +import { UserStatusManager, getCustomerId } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export async function processUserLogin( + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback +): Promise { + log.setName('nps:processUserLogin'); + + log.info(`UserLogin: ${message.toString()}`); + + // This message is a BareMessageV0 + + const personaId = getDWord(message.getDataAsBuffer(), 0, false); + + const profileName = getLenString(message.getDataAsBuffer(), 4, false); + + // Lookup customerID from personaID + const customerID = getCustomerId(personaId); + + if (customerID === -1) { + log.error(`CustomerID not found for personaID: ${personaId}`); + throw new Error(`CustomerID not found for personaID: ${personaId}`); + } + + log.info(`LobbyLogin: ${personaId} ${profileName} ${customerID}`); + + const existingStatus = UserStatusManager.getUserStatus(customerID); + + if (typeof existingStatus === 'undefined') { + log.error(`UserStatus not found for customerID: ${customerID}`); + throw new Error(`UserStatus not found for customerID: ${customerID}`); + } + + // Update the user status + existingStatus.setPersonaId(personaId); + + userStatus = existingStatus; + + log.info(`LobbyLogin: ${message.toString()}`); + + const response = new UserInfo(personaId, profileName); + + log.info(`Sending response: ${response.toString()}`); + + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x120); + + responseMessage.setData(response); + + log.info(`Response message: ${responseMessage.toString()}`); + + const responseBytes = responseMessage.serialize(); + + socketCallback([responseBytes]); + + log.resetName(); + return Promise.resolve(); +} diff --git a/packages/nps/index.ts b/packages/nps/index.ts new file mode 100644 index 000000000..4f1c09ad4 --- /dev/null +++ b/packages/nps/index.ts @@ -0,0 +1,53 @@ +export { + MessageProcessorError, + PortMapError, + gameMessageProcessors, + getGameMessageProcessor, + getPortMessageType, + populateGameMessageProcessors, + populatePortToMessageTypes, + portToMessageTypes, + type GameSocketCallback, +} from './gameMessageProcessors/index.js'; +export { processGameLogin } from './gameMessageProcessors/processGameLogin.js'; +export { GameMessage, SerializableData } from './messageStructs/GameMessage.js'; +export { MiniRiffInfo, MiniRiffList } from './messageStructs/MiniRiffList.js'; +export { MiniUserInfo, MiniUserList } from './messageStructs/MiniUserList.js'; +export { ProfileList } from './messageStructs/ProfileList.js'; +export { UserInfo } from './messageStructs/UserInfo.js'; +export { UserStatus } from './messageStructs/UserStatus.js'; +export { + getUser, + populateGameUsers as populateGameUsers, +} from './services/account.js'; +export { + gameProfiles, + getCustomerId, + getGameProfilesForCustomerId, +} from './services/profile.js'; +export { generateToken } from './services/token.js'; +export { UserStatusManager } from './src/UserStatusManager.js'; +export { isOnlyOneSet } from './src/utils/pureCompare.js'; +export { + getAsHex, + getDWord, + getLenBlob, + getLenString, + getNBytes, + getShortBool, + getWord, +} from './src/utils/pureGet.js'; +export { + put16, + put16BE, + put16LE, + put32, + put32BE, + put32LE, + put8, + putLenBlob, + putLenString, + putShortBool, +} from './src/utils/purePut.js'; +export { sendNPSAck } from './src/utils/sendNPSAck.js'; +export * from './types.js'; diff --git a/packages/nps/messageStructs/GameMessage.ts b/packages/nps/messageStructs/GameMessage.ts new file mode 100644 index 000000000..a844cbee1 --- /dev/null +++ b/packages/nps/messageStructs/GameMessage.ts @@ -0,0 +1,205 @@ +import type { ISerializable, IMessageHeader, IMessage } from "rusty-motors-nps"; + +export class MessageHeader implements IMessageHeader { + private version: 0 | 257; + private id: number; + private length: number; + + constructor(version: 0 | 257, id: number, length: number) { + if (version !== 0 && version !== 257) { + throw new Error(`Invalid version ${parseInt(version)}`); + } + this.version = version; + this.id = id; + this.length = length !== 0 ? length : this.getByteSize(); + } + getDataOffset(): number { + return this.getVersion() === 0 ? 4 : 12; + } + getByteSize(): number { + return this.getVersion() === 0 ? 4 : 12; + } + + getVersion(): number { + return this.version; + } + getId(): number { + return this.id; + } + getLength(): number { + return this.length; + } + setVersion(version: 0 | 257): void { + if (version !== 0 && version !== 257) { + throw new Error(`Invalid version ${parseInt(version)}`); + } + this.version = version; + } + setId(id: number): void { + this.id = id; + } + setLength(length: number): void { + this.length = length; + } + + private serializeV0(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + + return buffer; + } + + private serializeV1(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(0, 6); + buffer.writeUInt32BE(this.length, 8); + + return buffer; + } + + serialize(): Buffer { + return this.version === 0 ? this.serializeV0() : this.serializeV1(); + } + + private deserializeV0(data: Buffer): void { + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + } + + private deserializeV1(data: Buffer): void { + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + // Skip version + // Skip padding + this.length = data.readUInt32BE(8); + } + + deserialize(data: Buffer): void { + if (data.length < 4) { + throw new Error( + `Data is too short. Expected at least 4 bytes, got ${data.length} bytes`, + ); + } + + if (this.version === 0) { + this.deserializeV0(data); + } else { + this.deserializeV1(data); + } + } +} + +export class SerializableData implements ISerializable { + private data: Buffer; + constructor(requestedSize: number) { + this.data = Buffer.alloc(requestedSize); + } + + serialize(): Buffer { + return this.data; + } + + deserialize(data: Buffer): void { + if (data.length > this.data.length) { + throw new Error( + `Data is too long. Expected at most ${this.data.length} bytes, got ${data.length} bytes`, + ); + } + this.data = data; + } + + getByteSize(): number { + return this.data.length; + } + + toString(): string { + return `EmptyData(length=${this.data.length}, data=${this.data.toString( + "hex", + )})`; + } +} + +export class GameMessage implements IMessage { + header: MessageHeader; + data: ISerializable; + + constructor(version: 0 | 257) { + this.header = new MessageHeader(version, 0, 0); + this.data = new SerializableData(0); + } + + getId() { + return this.header.getId(); + } + + getDataAsBuffer(): Buffer { + return this.data.serialize(); + } + + /** The message length is the length of the message data, not including the id */ + getByteSize(): number { + return this.header.getLength(); + } + getData(): ISerializable { + return this.data; + } + setData(data: ISerializable): void { + this.data = data; + this.header.setLength(data.getByteSize() + this.header.getByteSize()); + } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + const headerData = this.header.serialize(); + headerData.copy(buffer, 0); + const messageData = this.data.serialize(); + messageData.copy(buffer, this.header.getDataOffset()); + return buffer; + } + deserialize(data: Buffer): GameMessage { + if (data.length < this.header.getDataOffset()) { + throw new Error( + `Data is too short. Expected at least ${this.header.getDataOffset()} bytes, got ${ + data.length + } bytes`, + ); + } + this.header.deserialize(data); + const messageData = data.subarray(this.header.getDataOffset()); + + // Update the message data to the required size + this.data = new SerializableData(this.header.getLength()); + + this.data.deserialize(messageData.subarray(0, this.header.getLength())); + return this; + } + + toString(): string { + return `Id: ${this.header.getId()} + Length: ${this.header.getLength()} + Data: ${this.data.toString()}`; + } + + static identifyVersion(data: Buffer): 0 | 257 { + if (data.length < 6) { + return 0; + } + + const version = data.readUInt16BE(4); + if (version !== 257) { + return 0; + } + + return 257; + } + + static fromGameMessage(version: 0 | 257, source: GameMessage): GameMessage { + const message = new GameMessage(version); + message.deserialize(source.serialize()); + return message; + } + +} diff --git a/packages/nps/messageStructs/GameProfile.ts b/packages/nps/messageStructs/GameProfile.ts new file mode 100644 index 000000000..81ee60abb --- /dev/null +++ b/packages/nps/messageStructs/GameProfile.ts @@ -0,0 +1,198 @@ +import type { ISerializable } from "rusty-motors-nps"; +import { putLenString } from "rusty-motors-nps"; +import { + getAsHex, + getLenBlob, + getLenString, + getShortBool, +} from "rusty-motors-nps"; + +export class GameProfile implements ISerializable { + customerId: number; // 4 bytes + profileName: string; // 32 bytes - max length + serverId: number; // 4 bytes + createStamp: number; // 4 bytes + lastLoginStamp: number; // 4 bytes + numberGames: number; // 4 bytes + profileId: number; // 4 bytes + isOnline: boolean; // 2 bytes + gamePurchaseStamp: number; // 4 bytes + gameSerialNumber: string; // 32 bytes - max length + timeOnline: number; // 4 bytes + timeInGame: number; // 4 bytes + gameBlob: Buffer; // 512 bytes - max length + personalBlob: Buffer; // 256 bytes - max length + pictureBlob: Buffer; // 1 byte + dnd: boolean; // 2 bytes + gameStartStamp: number; // 4 bytes + currentKey: string; // 400 bytes - max length + profileLevel: number; // 2 bytes + shardId: number; // 4 bytes + + constructor() { + this.customerId = 0; + this.profileName = ""; + this.serverId = 0; + this.createStamp = 0; + this.lastLoginStamp = 0; + this.numberGames = 0; + this.profileId = 0; + this.isOnline = false; + this.gamePurchaseStamp = 0; + this.gameSerialNumber = ""; + this.timeOnline = 0; + this.timeInGame = 0; + this.gameBlob = Buffer.alloc(0); + this.personalBlob = Buffer.alloc(0); + this.pictureBlob = Buffer.alloc(0); + this.dnd = false; + this.gameStartStamp = 0; + this.currentKey = ""; + this.profileLevel = 0; + this.shardId = 0; + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(data: Buffer): GameProfile { + return GameProfile.fromBytes(data); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + + static new(): GameProfile { + return new GameProfile(); + } + + static fromBytes(data: Buffer): GameProfile { + const message = new GameProfile(); + let offset = 0; + message.customerId = data.readUInt32BE(offset); + offset += 4; + message.profileName = getLenString(data, offset, false); + offset += message.profileName.length + 2; + message.serverId = data.readUInt32BE(offset); + offset += 4; + message.createStamp = data.readUInt32BE(offset); + offset += 4; + message.lastLoginStamp = data.readUInt32BE(offset); + offset += 4; + message.numberGames = data.readUInt32BE(offset); + offset += 4; + message.profileId = data.readUInt32BE(offset); + offset += 4; + message.isOnline = getShortBool(data, offset); + offset += 2; + message.gamePurchaseStamp = data.readUInt32BE(offset); + offset += 4; + message.gameSerialNumber = getLenString(data, offset, false); + offset += message.gameSerialNumber.length + 2; + message.timeOnline = data.readUInt32BE(offset); + offset += 4; + message.timeInGame = data.readUInt32BE(offset); + offset += 4; + message.gameBlob = getLenBlob(data, offset, false); + offset += message.gameBlob.length + 2; + message.personalBlob = getLenBlob(data, offset, false); + offset += message.personalBlob.length + 2; + message.pictureBlob = data.subarray(offset, offset + 1); + offset += message.pictureBlob.length; + message.dnd = getShortBool(data, offset); + offset += 2; + message.gameStartStamp = data.readUInt32BE(offset); + offset += 4; + message.currentKey = getLenString(data, offset, false); + offset += message.currentKey.length + 2; + message.profileLevel = data.readUInt16BE(offset); + offset += 2; + message.shardId = data.readUInt32BE(offset); + + return message; + } + + toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); + offset += 4; // offset is now 4 + buffer.writeUInt16BE(3341, offset); + offset += 2; // offset is now 6 + buffer.writeUInt32BE(this.profileId, offset); + offset += 4; // offset is now 10 + buffer.writeUInt32BE(this.shardId, offset); + offset += 4; // offset is now 14 + offset += 2; // offset is now 16 + putLenString(buffer, offset, this.profileName, false); + + // buffer.writeUInt32BE(this.serverId, offset); + // offset += this.profileName.length + 2; + // buffer.writeUInt32BE(this.createStamp, offset); + // offset += 4; + // buffer.writeUInt32BE(this.lastLoginStamp, offset); + // offset += 4; + // buffer.writeUInt32BE(this.numberGames, offset); + // offset += 4; + // putShortBool(buffer, offset, this.isOnline); + // offset += 2; + // buffer.writeUInt32BE(this.gamePurchaseStamp, offset); + // offset += 4; + // putLenString(buffer, offset, this.gameSerialNumber, false); + // offset += this.gameSerialNumber.length + 2; + // buffer.writeUInt32BE(this.timeOnline, offset); + // offset += 4; + // buffer.writeUInt32BE(this.timeInGame, offset); + // offset += 4; + // putLenBlob(buffer, offset, this.gameBlob, false); + // offset += this.gameBlob.length + 2; + // putLenBlob(buffer, offset, this.personalBlob, false); + // offset += this.personalBlob.length + 2; + // this.pictureBlob.copy(buffer, offset, 0, 1); + // offset += 1; + // putShortBool(buffer, offset, this.dnd); + // offset += 2; + // buffer.writeUInt32BE(this.gameStartStamp, offset); + // offset += 4; + // putLenString(buffer, offset, this.currentKey, false); + // offset += this.currentKey.length + 2; + // buffer.writeUInt16BE(this.profileLevel, offset); + // offset += 2; + return buffer; + } + toString(): string { + return `GameProfile: + customerID: ${this.customerId} + profileName: ${this.profileName} + serverId: ${this.serverId} + createStamp: ${this.createStamp} + lastLoginStamp: ${this.lastLoginStamp} + numberGames: ${this.numberGames} + profileId: ${this.profileId} + isOnline: ${this.isOnline} + gamePurchaseStamp: ${this.gamePurchaseStamp} + gameSerialNumber: ${this.gameSerialNumber} + timeOnline: ${this.timeOnline} + timeInGame: ${this.timeInGame} + gameBlob: ${getAsHex(this.gameBlob)} + personalBlob: ${getAsHex(this.personalBlob)} + pictureBlob: ${getAsHex(this.pictureBlob)} + dnd: ${this.dnd} + gameStartStamp: ${this.gameStartStamp} + currentKey: ${this.currentKey} + profileLevel: ${this.profileLevel} + shardId: ${this.shardId} + `; + } + toHex(): string { + return getAsHex(this.toBytes()); + } + setData(): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } + getSize(): number { + return 52; + } +} diff --git a/packages/nps/messageStructs/MiniRiffList.ts b/packages/nps/messageStructs/MiniRiffList.ts new file mode 100644 index 000000000..e4de5b79f --- /dev/null +++ b/packages/nps/messageStructs/MiniRiffList.ts @@ -0,0 +1,100 @@ +import type { ISerializable } from 'rusty-motors-nps'; +import { putLenString } from 'rusty-motors-nps'; +import { NPSList } from './NPSList.js'; + +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +const channelRecordSize = 40; + +export class MiniRiffInfo implements ISerializable { + riffName: string; // 32 bytes - max length + riffId: number; // 4 bytes + population: number; // 2 bytes + + constructor(riffName: string, riffId: number, population: number) { + if (riffName.length > 32) { + throw new Error(`Riff name too long: ${riffName}`); + } + + this.riffName = riffName; + this.riffId = riffId; + this.population = population; + } + + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + putLenString(buffer, offset, this.riffName, false); + offset += 2 + this.riffName.length + 1; + buffer.writeUInt32BE(this.riffId, offset); + offset += 4; + buffer.writeUInt16BE(this.population, offset); + log.debug( + `MiniRiffInfo: ${this.toString()} - ${buffer.toString('hex')}` + ); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error('Method not implemented.'); + } + getByteSize(): number { + return 4 + this.riffName.length + 1 + 4 + 2; + } + toString(): string { + return `MiniRiffInfo(riffName=${this.riffName}, riffId=${this.riffId}, population=${this.population})`; + } +} + +export class MiniRiffList extends NPSList implements ISerializable { + override serialize(): Buffer { + return this.toBytes(); + } + override deserialize(data: Buffer): void { + throw new Error('Method not implemented.'); + } + override getByteSize(): number { + return this.getSize(); + } + private riffs: MiniRiffInfo[] = []; + + getMaxRiffs(): number { + return this.riffs.length; + } + + addRiff(riff: MiniRiffInfo): void { + this.riffs.push(riff); + } + + override toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this.riffs.length, offset); + offset += 4; + for (const riff of this.riffs) { + const riffBuffer = riff.serialize(); + riffBuffer.copy(buffer, offset); + offset += riff.getByteSize(); + } + + log.debug( + `MiniRiffList: ${this.toString()} - ${buffer.toString('hex')}` + ); + return buffer; + } + override toString(): string { + return `MiniRiffList(riffs=${this.riffs})`; + } + override toHex(): string { + return this.toBytes().toString('hex'); + } + + override getSize(): number { + let size = 4; + for (const riff of this.riffs) { + size += riff.getByteSize(); + } + return size; + } +} diff --git a/packages/nps/messageStructs/MiniUserList.ts b/packages/nps/messageStructs/MiniUserList.ts new file mode 100644 index 000000000..41c56b150 --- /dev/null +++ b/packages/nps/messageStructs/MiniUserList.ts @@ -0,0 +1,74 @@ +import type { ISerializable } from "rusty-motors-nps"; +import { putLenString } from "rusty-motors-nps"; + +export class MiniUserInfo implements ISerializable { + userId: number; // 4 bytes + userName: string; // 32 bytes - max length + + constructor(userId: number, userName: string) { + if (userName.length > 32) { + throw new Error(`User name too long: ${userName}`); + } + + this.userId = userId; + this.userName = userName; + } + + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.userId, offset); + offset += 4; + putLenString(buffer, offset, this.userName, false); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return 4 + 4 + this.userName.length + 1; + } + toString(): string { + return `MiniUserInfo(userId=${this.userId}, userName=${this.userName})`; + } +} + +export class MiniUserList implements ISerializable { + private channelId: number; // 4 bytes + private channelUsers: MiniUserInfo[] = []; + + constructor(channelId: number) { + this.channelId = channelId; + } + + addChannelUser(user: MiniUserInfo): void { + this.channelUsers.push(user); + } + + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.channelId, offset); + offset += 4; + buffer.writeUInt32BE(this.channelUsers.length, offset); + offset += 4; + this.channelUsers.forEach((user) => { + const userBuffer = user.serialize(); + userBuffer.copy(buffer, offset); + offset += userBuffer.length; + }); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return ( + 16 + + this.channelUsers.reduce((acc, user) => acc + user.getByteSize(), 0) + ); + } + toString(): string { + return `MiniUserList(channelId=${this.channelId}, channelUsers=${this.channelUsers})`; + } +} diff --git a/packages/nps/messageStructs/NPSList.ts b/packages/nps/messageStructs/NPSList.ts new file mode 100644 index 000000000..268011d4a --- /dev/null +++ b/packages/nps/messageStructs/NPSList.ts @@ -0,0 +1,34 @@ +import type { ISerializable, IMessage } from "rusty-motors-nps"; + +export class NPSList implements ISerializable { + serialize(): Buffer { + throw new Error("Method not implemented."); + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + private list: IMessage[] = []; + + toBytes(): Buffer { + throw new Error("Method not implemented."); + } + toString(): string { + throw new Error("Method not implemented."); + } + toHex(): string { + throw new Error("Method not implemented."); + } + setData(data: Buffer): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } + + getSize(): number { + return 0; + } +} diff --git a/packages/nps/messageStructs/ProfileList.ts b/packages/nps/messageStructs/ProfileList.ts new file mode 100644 index 000000000..4a5d6ce02 --- /dev/null +++ b/packages/nps/messageStructs/ProfileList.ts @@ -0,0 +1,59 @@ +import type { ISerializable } from 'rusty-motors-nps'; +import { GameProfile } from './GameProfile.js'; +import { NPSList } from './NPSList.js'; + +export class ProfileList extends NPSList implements ISerializable { + override serialize(): Buffer { + return this.toBytes(); + } + override deserialize(data: Buffer): void { + throw new Error('Method not implemented.'); + } + override getByteSize(): number { + return this.getSize(); + } + maxProfiles = 0; // 1 byte + private profiles: GameProfile[] = []; + + getMaxProfiles(): number { + return this.maxProfiles; + } + + addProfile(profile: GameProfile): void { + this.profiles.push(profile); + this.maxProfiles = this.profiles.length; + } + + override toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt16BE(this.maxProfiles, offset); + offset += 2; + for (const profile of this.profiles) { + const profileBuffer = profile.toBytes(); + profileBuffer.copy(buffer, offset); + offset += profile.getSize(); + } + return buffer; + } + override toString(): string { + return `ProfileList(maxProfiles=${this.maxProfiles}, profiles=${this.profiles})`; + } + override toHex(): string { + throw new Error('Method not implemented.'); + } + override setData(data: Buffer): void { + throw new Error('Method not implemented.'); + } + override getData(): Buffer { + throw new Error('Method not implemented.'); + } + + override getSize(): number { + let size = 4; + for (const profile of this.profiles) { + size += profile.getSize(); + } + return size; + } +} diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts new file mode 100644 index 000000000..ba53e0b1a --- /dev/null +++ b/packages/nps/messageStructs/SessionKey.ts @@ -0,0 +1,113 @@ +import type { ISerializable } from 'rusty-motors-nps'; +import { getAsHex, isOnlyOneSet } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export class SessionKey implements ISerializable { + private key: Buffer = Buffer.alloc(0); + private timestamp: number = 0; + private _isSet: boolean = false; + + constructor({ key, timestamp }: { key?: Buffer; timestamp?: number }) { + log.setName('SessionKey'); + if (isOnlyOneSet(key, timestamp)) { + throw new Error('Both key and timestamp must be set if one is set'); + } + + if (typeof key !== 'undefined' && typeof timestamp !== 'undefined') { + log.debug( + `SessionKey: key=${getAsHex(key)}, timestamp=${timestamp}` + ); + this.key = key; + this.timestamp = timestamp; + this._isSet = true; + } + log.resetName(); + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(data: Buffer): void { + SessionKey.fromBytes(data); + } + getByteSize(): number { + throw new Error('Method not implemented.'); + } + + static fromBytes(bytes: Buffer): SessionKey { + log.setName('SessionKey.fromBytes'); + const keyLength = bytes.readUInt16BE(0); + + // Set the data offset + const dataOffset = 2 + keyLength; + + const key = bytes.subarray(2, dataOffset); + + log.debug(`SessionKey.fromBytes: key=${getAsHex(key)}`); + + // Get the timestamp + const timestamp = bytes.readUInt32BE(dataOffset); + + log.resetName(); + + return new SessionKey({ + key, + timestamp, + }); + } + + static fromKeyString(key: string): SessionKey { + const keyBuffer = Buffer.from(key, 'hex'); + + return new SessionKey({ + key: keyBuffer, + timestamp: 0, + }); + } + + getKey(): string { + return this.key.toString('hex'); + } + + toString(): string { + return `SessionKey(key=${this.getKey()}, timestamp=${this.timestamp})`; + } + + toHex(): string { + return getAsHex(this.toBytes()); + } + + toBytes(): Buffer { + if (!this.isSet()) { + throw new Error('Session key is not set'); + } + + const keyLength = this.key.length; + const timestamp = this.timestamp; + + const buffer = Buffer.alloc(2 + keyLength + 4); + + buffer.writeUInt16BE(keyLength, 0); + this.key.copy(buffer, 2); + buffer.writeUInt32BE(timestamp, 2 + keyLength); + + return buffer; + } + + getSize(): number { + return this.key.length + 6; + } + + getData(): Buffer { + throw new Error('Method not implemented.'); + } + + setData(): void { + throw new Error('Method not implemented.'); + } + + isSet(): boolean { + return this._isSet; + } +} diff --git a/packages/nps/messageStructs/UserAction.ts b/packages/nps/messageStructs/UserAction.ts new file mode 100644 index 000000000..7c218f04a --- /dev/null +++ b/packages/nps/messageStructs/UserAction.ts @@ -0,0 +1,133 @@ +import type { ISerializable } from 'rusty-motors-nps'; +import { getAsHex } from 'rusty-motors-nps'; +import { getServerLogger } from 'rusty-motors-shared'; + +const log = getServerLogger(); + +export class UserAction implements ISerializable { + private name: string; + private _endTimeMaybe = 0; // 4 bytes + private _b1 = 0; // 1 byte + private _b2 = 0; // 1 byte + private _initiator = ''; // 64 bytes + private _startComment = ''; // 256 bytes + private _endComment = ''; // 256 bytes + + constructor(name: string) { + this.name = name; + } + + serialize(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this._endTimeMaybe, offset); + offset += 4; + buffer.writeUInt8(this._b1, offset); + offset += 1; + buffer.writeUInt8(this._b2, offset); + offset += 1; + buffer.write(this._initiator, offset, 0x40, 'utf8'); + offset += 0x40; + buffer.write(this._startComment, offset, 0x100, 'utf8'); + offset += 0x100; + buffer.write(this._endComment, offset, 0x100, 'utf8'); + + return buffer; + } + deserialize(data: Buffer): void { + try { + this._endTimeMaybe = data.readUInt32BE(0); + this._b1 = data.readUInt8(4); + this._b2 = data.readUInt8(5); + this._initiator = data.toString('utf8', 6, 0x46); + this._startComment = data.toString('utf8', 0x46, 0x146); + this._endComment = data.toString('utf8', 0x146, 0x246); + } catch (error) { + log.error(`Error deserializing UserAction: ${error as string}`); + throw error; + } + } + getByteSize(): number { + throw new Error('Method not implemented.'); + } + setData(): void { + throw new Error('Method not implemented.'); + } + getData(): Buffer { + throw new Error('Method not implemented.'); + } + + static fromBytes(name: string, bytes: Buffer): UserAction { + const userAction = new UserAction(name); + userAction.deserialize(bytes); + + return userAction; + } + + toBytes(): Buffer { + return this.serialize(); + } + toString(): string { + return `UserAction: ${this.name} - ${this._initiator} - ${this._startComment} - ${this._endComment}`; + } + toHex(): string { + return getAsHex(this.serialize()); + } + + getSize(): number { + return 4 + 1 + 1 + 0x40 + 0x100 + 0x100; + } + + public set({ + endTimeMaybe, + b1, + b2, + initiator, + startComment, + endComment, + }: { + endTimeMaybe?: number; + b1?: number; + b2?: number; + initiator: string; + startComment: string; + endComment?: string; + }): void { + this._endTimeMaybe = endTimeMaybe || 0; + this._b1 = b1 || 0; + this._b2 = b2 || 0; + this._initiator = initiator; + this._startComment = startComment; + this._endComment = endComment || ''; + } + + public clear(): void { + this._endTimeMaybe = 0; + this._b1 = 0; + this._b2 = 0; + this._initiator = ''; + this._startComment = ''; + this._endComment = ''; + } + + updateEmptyValuesFrom(other: UserAction) { + if (this._endTimeMaybe === 0) { + this._endTimeMaybe = other._endTimeMaybe; + } + if (this._b1 === 0) { + this._b1 = other._b1; + } + if (this._b2 === 0) { + this._b2 = other._b2; + } + if (this._initiator === '') { + this._initiator = other._initiator; + } + if (this._startComment === '') { + this._startComment = other._startComment; + } + if (this._endComment === '') { + this._endComment = other._endComment; + } + } +} diff --git a/packages/nps/messageStructs/UserInfo.ts b/packages/nps/messageStructs/UserInfo.ts new file mode 100644 index 000000000..308dc5cad --- /dev/null +++ b/packages/nps/messageStructs/UserInfo.ts @@ -0,0 +1,46 @@ +import type { ISerializable } from "rusty-motors-nps"; + +export class UserInfo implements ISerializable { + private profileId: number; // 4 bytes + private profileName: string; // 32 bytes - max length + private userData; // 64 bytes + + constructor(id: number, name: string) { + if (name.length > 31) { + throw new Error( + `Profile name too long: ${name}, max length is 31, got ${name.length}`, + ); + } + this.profileId = id; + this.profileName = name; + this.userData = Buffer.alloc(64); + } + + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeInt32BE(this.profileId, offset); + offset += 4; + buffer.writeUInt16BE(this.profileName.length, offset); + offset += 2; + buffer.write( + `${this.profileName}\0`, + offset, + this.profileName.length + 1, + "utf8", + ); + offset += this.profileName.length + 1; + this.userData.copy(buffer, offset); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return 4 + 2 + this.profileName.length + 1 + 64; + } + toString(): string { + return `Profile ID: ${this.profileId}, + Profile Name: ${this.profileName}`; + } +} diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts new file mode 100644 index 000000000..9dd3157d1 --- /dev/null +++ b/packages/nps/messageStructs/UserStatus.ts @@ -0,0 +1,178 @@ +import { randomUUID } from "crypto"; +import type { ISerializable } from "../types.js"; +import { SessionKey } from "./SessionKey.js"; +import { UserAction } from "./UserAction.js"; + +export class UserStatus implements ISerializable { + private _sessionId: string = ""; + private _remoteIp: string = ""; + private _machineId: string = ""; + private customerId: number = 0; + private personaId: number = 0; + private isCacheHit: boolean = false; + readonly ban: UserAction = new UserAction("ban"); + readonly gag: UserAction = new UserAction("gag"); + private sessionKey: SessionKey = new SessionKey({}); + + constructor({ + customerId, + personaId, + sessionKey, + }: { + customerId: number; + personaId?: number; + sessionKey?: SessionKey; + + }) { + this._sessionId = randomUUID(); + this.customerId = customerId; + this.personaId = personaId || 0; + this.isCacheHit = false; + this.ban = new UserAction("ban"); + this.gag = new UserAction("gag"); + this.sessionKey = sessionKey || new SessionKey({}); + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return this.getSize(); + } + + getSessionId(): string { + return this._sessionId; + } + + getRemoteIp(): string { + return this._remoteIp; + } + + setRemoteIp(value: string) { + if (this._remoteIp !== "" && this._remoteIp !== value) { + throw new Error("Remote IP is already set and cannot be changed"); + } + this._remoteIp = value; + } + + getMachineId(): string { + return this._machineId; + } + + setMachineId(value: string) { + if (this._machineId !== "" && this._machineId !== value) { + throw new Error("Machine ID is already set and cannot be changed"); + } + this._machineId = value; + } + + static new(): UserStatus { + return new UserStatus({ + customerId: 0, + }); + + } + + static fromBytes(bytes: Buffer): UserStatus { + let offset = 0; + const customerId = bytes.readUInt32BE(offset); + offset += 4; + const personaId = bytes.readUInt32BE(offset); + offset += 4; + // Skip isCacheHit + offset += 1; + const ban = UserAction.fromBytes("ban", bytes.subarray(offset)); + offset += ban.getSize(); + const gag = UserAction.fromBytes("gag", bytes.subarray(offset)); + offset += gag.getSize(); + const sessionKey = SessionKey.fromBytes(bytes.subarray(offset)); + + return new UserStatus({ + customerId, + personaId, + sessionKey, + + }); + } + + toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + + if (this.sessionKey === null) { + throw new Error("Session key is required"); + } + + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); + offset += 4; + buffer.writeUInt32BE(this.personaId, offset); + offset += 4; + buffer.writeUInt8(this.isCacheHit ? 1 : 0, offset); + offset += 1; + this.ban.toBytes().copy(buffer, offset); + offset += this.ban.getSize(); + this.gag.toBytes().copy(buffer, offset); + offset += this.gag.getSize(); + this.sessionKey.toBytes().copy(buffer, offset); + offset += this.sessionKey.getSize(); + + return buffer; + } + + getSize(): number { + return ( + 4 + + 4 + + 1 + + this.ban.getSize() + + this.gag.getSize() + + this.sessionKey.getSize() + + 4 + + 64 + ); + } + + getCustomerId(): number { + return this.customerId; + } + + setCustomerId(customerId: number) { + this.customerId = customerId; + } + + getPersonaId(): number { + return this.personaId; + } + + setPersonaId(personaId: number) { + this.personaId = personaId; + } + + getSessionKey(): SessionKey { + return this.sessionKey; + } + + setSessionKey(sessionKey: SessionKey) { + this.sessionKey = sessionKey; + } + + toString(): string { + return `UserStatus: + Customer ID: ${this.customerId} + Persona ID: ${this.personaId} + Is Cache Hit: ${this.isCacheHit} + Ban: ${this.ban.toString()} + Gag: ${this.gag.toString()} + Session Key: ${this.sessionKey.toString()}`; + } + + toHex(): string { + return this.toBytes().toString("hex"); + } + + setData() { + throw new Error("Method not implemented."); + } +} diff --git a/packages/nps/package.json b/packages/nps/package.json new file mode 100644 index 000000000..94256f9f3 --- /dev/null +++ b/packages/nps/package.json @@ -0,0 +1,25 @@ +{ + "name": "rusty-motors-nps", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + }, + "description": "" +} diff --git a/packages/nps/services/account.ts b/packages/nps/services/account.ts new file mode 100644 index 000000000..6822ae457 --- /dev/null +++ b/packages/nps/services/account.ts @@ -0,0 +1,44 @@ +import { db, LoginSchema } from 'rusty-motors-database'; +import { getServerLogger } from 'rusty-motors-shared'; +import type { DatabaseSchema } from '../../database/src/services/database'; + +const log = getServerLogger(); + +export async function populateGameUsers(): Promise { + await LoginSchema(db).insertOrIgnore({ + customer_id: 1, + login_name: 'admin', + password: 'admin', + login_level: 1, + }); +} + +export async function getUser( + username: string, + password: string +): Promise { + log.setName('getUser'); + + log.debug(`Getting user ${username}, ${password}`); + + const userAccount = await LoginSchema(db).findOne({ + login_name: username, + password, + }); + + if (!userAccount) { + log.warn(`User ${username} not found`); + } + + return userAccount; +} + +export async function isSuperUser( + username: string, + password: string +): Promise { + const user = await getUser(username, password); + return user ? user.login_level === 1 : false; +} + +// Path: packages/nps/services/account.ts diff --git a/packages/nps/services/profile.ts b/packages/nps/services/profile.ts new file mode 100644 index 000000000..e6b483cb2 --- /dev/null +++ b/packages/nps/services/profile.ts @@ -0,0 +1,74 @@ +import { db, ProfileSchema } from 'rusty-motors-database'; +import { GameProfile } from '../messageStructs/GameProfile.js'; + +export const gameProfiles: GameProfile[] = []; + +export function getGameProfilesForCustomerId( + customerId: number +): GameProfile[] { + const profiles: GameProfile[] = []; + for (const profile of gameProfiles.values()) { + if (profile.customerId === customerId) { + profiles.push(profile); + } + } + return profiles; +} + +export function getCustomerId(profileId: number): number { + for (const profile of gameProfiles.values()) { + if (profile.profileId === profileId) { + return profile.customerId; + } + } + return -1; +} + +export function gameProfileExists(profileName: string): boolean { + for (const profile of gameProfiles.values()) { + if (profile.profileName === profileName) { + return true; + } + } + return false; +} + +export async function addGameProfile(profile: GameProfile): Promise { + await ProfileSchema(db).insertOrIgnore({ + customer_id: profile.customerId, + profile_name: profile.profileName, + server_id: profile.serverId, + create_stamp: profile.createStamp, + last_login_stamp: profile.lastLoginStamp, + number_games: profile.numberGames, + profile_id: profile.profileId, + is_online: profile.isOnline, + game_purchase_stamp: profile.gamePurchaseStamp, + game_serial_number: profile.gameSerialNumber, + time_online: profile.timeOnline, + time_in_game: profile.timeInGame, + game_blob: profile.gameBlob.toString(), + personal_blob: profile.personalBlob.toString(), + picture_blob: profile.pictureBlob.toString(), + dnd: profile.dnd, + game_start_stamp: profile.gameStartStamp, + current_key: profile.currentKey, + profile_level: profile.profileLevel, + shard_id: profile.shardId, + }); +} + +export function deleteGameProfile(profileId: number): void { + for (const [index, profile] of gameProfiles.entries()) { + if (profile.profileId === profileId) { + gameProfiles.splice(index, 1); + return; + } + } +} + +export function createGameProfile(): GameProfile { + const profile = GameProfile.new(); + + return profile; +} diff --git a/packages/nps/services/token.ts b/packages/nps/services/token.ts new file mode 100644 index 000000000..4f6bca8db --- /dev/null +++ b/packages/nps/services/token.ts @@ -0,0 +1,68 @@ +import ShortUniqueId from "short-unique-id"; + +const uid = new ShortUniqueId.default(); + +export type TokenRecord = { + customerId: number; + token: string; +}; + +export const activeTokens = new Map([]); + +export function generateTokenRecord(customerId: number): TokenRecord { + const token = uid.stamp(34); + + return { + customerId, + token, + }; +} + +export function generateToken(customerId: number): string { + if (typeof customerId !== "number") { + throw new Error("Invalid customer ID"); + } + const tokenRecord = generateTokenRecord(customerId); + activeTokens.set(tokenRecord.token, tokenRecord); + return tokenRecord.token; +} + +export function isTokenExpired(token: string): boolean { + const issuedAt = uid.parseStamp(token).getTime(); + + // 30 minutes + const expirationTime = Date.now() - 1800000; + + if (issuedAt < expirationTime) { + return true; + } + + return false; +} + +export function getToken(token: string): TokenRecord | undefined { + if (activeTokens.has(token)) { + return activeTokens.get(token); + } + return undefined; +} + +export function deleteToken(token: string): void { + activeTokens.delete(token); +} + +export function deleteExpiredTokens(): void { + for (const token of activeTokens.keys()) { + if (isTokenExpired(token)) { + deleteToken(token); + } + } +} + +export function getCustomerId(token: string): number | undefined { + const tokenRecord = getToken(token); + if (typeof tokenRecord !== "undefined" && !isTokenExpired(token)) { + return tokenRecord.customerId; + } + return undefined; +} diff --git a/packages/nps/services/types.ts b/packages/nps/services/types.ts new file mode 100644 index 000000000..81bfde2b1 --- /dev/null +++ b/packages/nps/services/types.ts @@ -0,0 +1,18 @@ +export type Part = { + PartID: number; + ParentPartID: number; + BrandedPartID: number; + RepairPrice: number; + JunkPrice: number; + Wear: number; + AttachmentPoint: number; + Damage: number; +}; + +export type Vehicle = { + VehicleID: number; + SkinID: number; + Flags: number; + Delta: number; + Damage: number; +}; diff --git a/packages/nps/src/EncryptionSession.ts b/packages/nps/src/EncryptionSession.ts new file mode 100644 index 000000000..3bdbe4683 --- /dev/null +++ b/packages/nps/src/EncryptionSession.ts @@ -0,0 +1,68 @@ +import { + Cipher, + Decipher, + createCipheriv, + createDecipheriv +} from "node:crypto"; + + +export type EncryptionSession = { + connectionId: string; + customerId: number; + sessionKey: string; + gameCipher: Cipher; + gameDecipher: Decipher; +}; + +export const encryptionSessions = new Map([]); + +export function setEncryptionSession( + encryptionSession: EncryptionSession +): void { + encryptionSessions.set(encryptionSession.connectionId, encryptionSession); +} + +export function getEncryptionSession( + connectionId: string +): EncryptionSession | undefined { + if (encryptionSessions.has(connectionId)) { + return encryptionSessions.get(connectionId); + } + return undefined; +} + +export function deleteEncryptionSession( + connectionId: string +): void { + encryptionSessions.delete(connectionId); +} + +export function newEncryptionSession({ + connectionId, customerId, sessionKey, +}: { + connectionId: string; + customerId: number; + sessionKey: string; +}): EncryptionSession { + const gameCipher = createCipheriv( + "des-cbc", + Buffer.from(sessionKey, "hex"), + Buffer.alloc(8) + ); + gameCipher.setAutoPadding(false); + const gameDecipher = createDecipheriv( + "des-cbc", + Buffer.from(sessionKey, "hex"), + Buffer.alloc(8) + ); + gameDecipher.setAutoPadding(false); + const encryptionSession = { + connectionId, + customerId, + sessionKey, + gameCipher, + gameDecipher, + }; + setEncryptionSession(encryptionSession); + return encryptionSession; +} diff --git a/packages/nps/src/UserStatusManager.ts b/packages/nps/src/UserStatusManager.ts new file mode 100644 index 000000000..2f884eca7 --- /dev/null +++ b/packages/nps/src/UserStatusManager.ts @@ -0,0 +1,80 @@ +import { UserStatus } from "../messageStructs/UserStatus.js"; + +export class UserStatusManager { + static newUserStatus() { + return new UserStatus({ customerId: 0 }); + } + static _instance: UserStatusManager; + + static getInstance() { + if (!UserStatusManager._instance) { + UserStatusManager._instance = new UserStatusManager(); + } + return UserStatusManager._instance; + } + private _userStatuses: Map = new Map(); + + public addUserStatus(userStatus: UserStatus) { + this._userStatuses.set(userStatus.getCustomerId(), userStatus); + } + + public removeUserStatus(customerId: number) { + this._userStatuses.delete(customerId); + } + + public getUserStatus(customerId: number): UserStatus | undefined { + return this._userStatuses.get(customerId); + } + + public getUserStatuses(): UserStatus[] { + return Array.from(this._userStatuses.values()); + } + + public clearUserStatuses() { + this._userStatuses.clear(); + } + + static addUserStatus(userStatus: UserStatus) { + UserStatusManager.getInstance().addUserStatus(userStatus); + } + + static removeUserStatus(customerId: number) { + UserStatusManager.getInstance().removeUserStatus(customerId); + } + + static getUserStatus(customerId: number): UserStatus | undefined { + const userStatus = UserStatusManager.getInstance().getUserStatus(customerId); + + if (userStatus) { + return userStatus; + } + + const newUserStatus = new UserStatus({ customerId }); + + UserStatusManager.getInstance().addUserStatus(newUserStatus); + + return newUserStatus; + } + + static getUserStatusBySessionId(sessionId: string): UserStatus | undefined { + const userStatus = UserStatusManager.getInstance().getUserStatuses().find((userStatus) => { + return userStatus.getSessionId() === sessionId; + }); + + if (userStatus) { + return userStatus; + } + + return undefined; + } + + getUserStatuseByMachineIdAndIp(machineId: string, remoteIp: string): UserStatus | undefined { + return Array.from(this._userStatuses.values()).find((userStatus) => { + return userStatus.getMachineId() === machineId && userStatus.getRemoteIp() === remoteIp; + }); + } + + static getUserStatuses(): UserStatus[] { + return UserStatusManager.getInstance().getUserStatuses(); + } +} diff --git a/packages/nps/src/utils/pureCompare.ts b/packages/nps/src/utils/pureCompare.ts new file mode 100644 index 000000000..8317df3da --- /dev/null +++ b/packages/nps/src/utils/pureCompare.ts @@ -0,0 +1,48 @@ +export function isZero(n: number): boolean { + // Return true if n is zero + return n === 0; +} + + +export function isUndefined(n: unknown): boolean { + // Return true if n is undefined + return typeof n === "undefined"; +} + +export function lessThan(a: number, b: number): boolean { + // Return true if a < b + return a < b; +} +export function lessThanOrEqual(a: number, b: number): boolean { + // Return true if a <= b + return a <= b; +} +export function greaterThan(a: number, b: number): boolean { + // Return true if a > b + return a > b; +} + +export function greaterThanOrEqual(a: number, b: number): boolean { + // Return true if a >= b + return a >= b; +} + +export function areBothZero(a: number, b: number): boolean { + // Return true if both a and b are zero + return isZero(a) && isZero(b); +} + +export function areBothUndefined(a: unknown, b: unknown): boolean { + // Return true if both a and b are undefined + return typeof a === "undefined" && typeof b === "undefined"; +} + +export function areBothSet(a: unknown, b: unknown): boolean { + // Return true if both a and b are set + return !isUndefined(a) && !isUndefined(b); +} + +export function isOnlyOneSet(a: unknown, b: unknown): boolean { + // Return true if only one of a and b is set + return !areBothSet(a, b) && (!isUndefined(a) || !isUndefined(b)); +} diff --git a/packages/nps/src/utils/pureGet.ts b/packages/nps/src/utils/pureGet.ts new file mode 100644 index 000000000..ae2d0fe3e --- /dev/null +++ b/packages/nps/src/utils/pureGet.ts @@ -0,0 +1,59 @@ +import { greaterThanOrEqual } from "./pureCompare.js"; + +export function getWord(bytes: Buffer, offset: number, isLE: boolean): number { + // Get the word at the offset + return isLE ? bytes.readUInt16LE(offset) : bytes.readUInt16BE(offset); +} + +export function getDWord(bytes: Buffer, offset: number, isLE: boolean): number { + // Get the dword at the offset + return isLE ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset); +} + +/** + * Get the first n bytes of a buffer. + * If the buffer is shorter than n bytes, return the whole buffer + */ +export function getNBytes(bytes: Buffer, n: number): Buffer { + const bufferLength = bytes.length; + + const cutLength = greaterThanOrEqual(bufferLength, n) ? n : bufferLength; + + // Get the first n bytes + return bytes.subarray(0, cutLength); +} + +export function getAsHex(bytes: Buffer): string { + return bytes.length % 2 === 0 + ? bytes.toString("hex") + : bytes.toString("hex") + "0"; +} + +export function getLenString( + bytes: Buffer, + offset: number, + isLE: boolean, +): string { + // Get the length of the string + const strLen = getWord(bytes, offset, isLE); + + // Get the string + return bytes.subarray(offset + 2, offset + 2 + strLen).toString("utf8"); +} + +export function getLenBlob( + bytes: Buffer, + offset: number, + isLE: boolean, +): Buffer { + // Get the length of the blob + const blobLen = getDWord(bytes, offset, isLE); + + // Get the blob + return bytes.subarray(offset + 2, offset + 2 + blobLen); +} + +export function getShortBool(bytes: Buffer, offset: number): boolean { + // Get a 2 byte boolean + return bytes.readUInt16LE(offset) === 1; +} diff --git a/packages/nps/src/utils/purePut.ts b/packages/nps/src/utils/purePut.ts new file mode 100644 index 000000000..460301155 --- /dev/null +++ b/packages/nps/src/utils/purePut.ts @@ -0,0 +1,105 @@ +export function put16( + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, +): Buffer { + // Put the word at the offset + if (isLE) { + bytes.writeUInt16LE(word, offset); + } else { + bytes.writeUInt16BE(word, offset); + } + return bytes; +} + +export function put8(bytes: Buffer, offset: number, byte: number): Buffer { + // Put the byte at the offset + bytes.writeUInt8(byte, offset); + return bytes; +} + +export function put16BE(bytes: Buffer, offset: number, word: number): Buffer { + return put16(bytes, offset, word, false); +} + +export function put16LE(bytes: Buffer, offset: number, word: number): Buffer { + return put16(bytes, offset, word, true); +} + +export function put32( + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, +): Buffer { + // Put the word at the offset + if (isLE) { + bytes.writeUInt32LE(word, offset); + } else { + bytes.writeUInt32BE(word, offset); + } + return bytes; +} + +export function put32BE(bytes: Buffer, offset: number, word: number): Buffer { + return put32(bytes, offset, word, false); +} + +export function put32LE(bytes: Buffer, offset: number, word: number): Buffer { + return put32(bytes, offset, word, true); +} + +export function putLenString( + bytes: Buffer, + offset: number, + str: string, + isLE: boolean, +): Buffer { + // Get the length of the string + const strLen = str.length + 1; + + // Put the length of the string + if (isLE) { + bytes.writeUInt32LE(strLen, offset); + } else { + bytes.writeUInt32BE(strLen, offset); + } + + // Put the string + bytes.write(str.concat("\0"), offset + 4, strLen, "utf8"); + + return bytes; +} + +export function putLenBlob( + bytes: Buffer, + offset: number, + blob: Buffer, + isLE: boolean, +): Buffer { + // Get the length of the blob + const blobLen = blob.length; + + // Put the length of the blob + if (isLE) { + bytes.writeUInt32LE(blobLen, offset); + } else { + bytes.writeUInt32BE(blobLen, offset); + } + + // Put the blob + blob.copy(bytes, offset + 4); + + return bytes; +} + +export function putShortBool( + bytes: Buffer, + offset: number, + bool: boolean, +): Buffer { + // Put a 2 byte boolean + bytes.writeUInt16LE(bool ? 1 : 0, offset); + return bytes; +} diff --git a/packages/nps/src/utils/sendNPSAck.ts b/packages/nps/src/utils/sendNPSAck.ts new file mode 100644 index 000000000..19aadd979 --- /dev/null +++ b/packages/nps/src/utils/sendNPSAck.ts @@ -0,0 +1,11 @@ +import { GameMessage } from "../../messageStructs/GameMessage.js"; +import type { GameSocketCallback } from "../../gameMessageProcessors/index.js"; + +export function sendNPSAck(socketCallback: GameSocketCallback) { + const response = new GameMessage(0); + response.header.setId(519); + + const responseBytes = response.serialize(); + + socketCallback([responseBytes]); +} diff --git a/packages/nps/test/index.test.ts b/packages/nps/test/index.test.ts new file mode 100644 index 000000000..f01d2f75d --- /dev/null +++ b/packages/nps/test/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("example", () => { + it("should pass", () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/nps/types.ts b/packages/nps/types.ts new file mode 100644 index 000000000..e01f50a1e --- /dev/null +++ b/packages/nps/types.ts @@ -0,0 +1,23 @@ +export interface ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; +} + +export interface IMessageHeader extends ISerializable { + getVersion(): number; + getId(): number; + getLength(): number; + getDataOffset(): number; + setVersion(version: number): void; + setId(id: number): void; + setLength(length: number): void; +} + +export interface IMessage extends ISerializable { + header: IMessageHeader; + getData(): ISerializable; + getDataAsBuffer(): Buffer; + setData(data: ISerializable): void; +} diff --git a/packages/nps/vite.config.ts b/packages/nps/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/nps/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/patch/package.json b/packages/patch/package.json new file mode 100644 index 000000000..6460259aa --- /dev/null +++ b/packages/patch/package.json @@ -0,0 +1,27 @@ +{ + "name": "rusty-motors-patch", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" +} diff --git a/packages/patch/vite.config.ts b/packages/patch/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/patch/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/shard/package.json b/packages/shard/package.json new file mode 100644 index 000000000..3d24d015d --- /dev/null +++ b/packages/shard/package.json @@ -0,0 +1,27 @@ +{ + "name": "rusty-motors-shard", + "version": "1.0.0", + "description": "The shard service exposing the following endpoints to the gateway service:", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + } +} diff --git a/packages/shard/vite.config.ts b/packages/shard/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/shard/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/shared-packets/index.ts b/packages/shared-packets/index.ts new file mode 100644 index 000000000..622d72450 --- /dev/null +++ b/packages/shared-packets/index.ts @@ -0,0 +1,11 @@ +export * from "./src/interfaces.js"; +export { + ServerMessage, + ServerMessageHeader, + ServerGenericRequest, + ServerGenericResponse, + ServerMessagePayload, +} from "./src/ServerMessage.js"; +export { Serializable } from "./src/BasePacket.js"; + +// Path: packages/shared-packets/index.ts diff --git a/packages/shared-packets/package.json b/packages/shared-packets/package.json new file mode 100644 index 000000000..9433de639 --- /dev/null +++ b/packages/shared-packets/package.json @@ -0,0 +1,22 @@ +{ + "name": "rusty-motors-shared-packets", + "private": true, + "version": "1.0.0", + "type": "module", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "description": "" +} diff --git a/packages/shared-packets/src/BasePacket.ts b/packages/shared-packets/src/BasePacket.ts new file mode 100644 index 000000000..fb33cdc62 --- /dev/null +++ b/packages/shared-packets/src/BasePacket.ts @@ -0,0 +1,48 @@ +import type { ISerializable } from "./interfaces.js"; +import { getAsHex } from "./utils.js"; + +export class Serializable implements ISerializable { + protected _data: Buffer = Buffer.alloc(4); + + protected _asHex(bytes: Buffer): string { + return bytes.length % 2 === 0 + ? bytes.toString("hex") + : bytes.toString("hex") + "0"; + } + + protected _assertEnoughData(data: Buffer, expected: number) { + if (data.length < expected) { + throw new Error( + `Data is too short. Expected at least ${expected} bytes, got ${data.length} bytes`, + ); + } + } + + serialize(): Buffer { + return this._data; + } + deserialize(data: Buffer): void { + this._data = data; + } + getByteSize(): number { + return this._data.length; + } + toHexString(): string { + return getAsHex(this.serialize()); + } +} + +export class BasePacket extends Serializable implements ISerializable { + private header: ISerializable = new Serializable(); + + override serialize(): Buffer { + return Buffer.concat([this.header.serialize(), this._data]); + } + override deserialize(data: Buffer): void { + this.header.deserialize(data); + this._data = data.subarray(this.header.getByteSize()); + } + override getByteSize(): number { + return this.header.getByteSize() + this._data.length; + } +} diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts new file mode 100644 index 000000000..7aaed363f --- /dev/null +++ b/packages/shared-packets/src/ServerMessage.ts @@ -0,0 +1,372 @@ +import { Serializable } from "./BasePacket.js"; +import type { ISerializable, IMessage } from "./interfaces.js"; +import { McosEncryptionPair, getServerLogger } from "rusty-motors-shared"; + +const log = getServerLogger(); + +/** + * + */ +export class ServerMessageHeader extends Serializable implements ISerializable { + // All fields are little-endian + private length: number = 0; // 2 bytes + private signature: string = ""; // 4 bytes + private sequence: number = 0; // 4 bytes + private flags: number = 0; // 1 + + getDataOffset(): number { + return 11; + } + override getByteSize(): number { + return 11; + } + + getLength(): number { + return this.length; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.length, 0); + buffer.write(this.signature, 2, 4, "ascii"); + buffer.writeUInt32LE(this.sequence, 6); + buffer.writeUInt8(this.flags, 10); + + return buffer; + } + + override deserialize(data: Buffer): ServerMessageHeader { + this._assertEnoughData(data, this.getByteSize()); + + this.length = data.readUInt16LE(0); + this.signature = data.toString("utf8", 2, 6); + this.sequence = data.readUInt32LE(6); + this.flags = data.readUInt8(10); + + return this; + } + + isValidSignature(): boolean { + return this.signature === "TOMC"; + } + + isPayloadEncrypted(): boolean { + // Does the flags bitmask contain have 0x08 set? + return this.flags >= 0x08; + } + + setPayloadEncryption(encrypted: boolean): ServerMessageHeader { + if (encrypted) { + this.flags |= 0x08; + } else { + this.flags &= ~0x08; + } + return this; + } + + toString(): string { + return `ServerMessageHeader {length: ${this.length}, signature: ${this.signature}, sequence: ${this.sequence}, flags: ${this.flags}}`; + } + + toHexString(): string { + return this.serialize().toString("hex"); + } + + getSequence(): number { + return this.sequence; + } + + setSequence(sequence: number): ServerMessageHeader { + this.sequence = sequence; + return this; + } + + setLength(length: number): ServerMessageHeader { + this.length = length; + return this; + } + + setSignature(signature: string): ServerMessageHeader { + this.signature = signature; + return this; + } +} + +export class ServerMessagePayload + extends Serializable + implements ISerializable +{ + protected messageId: number = 0; // 2 bytes + + override getByteSize(): number { + return 2 + this._data.length; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + this._data.copy(buffer, 2); + + return buffer; + } + + override deserialize(data: Buffer): ServerMessagePayload { + this._assertEnoughData(data, 2); + + this.messageId = data.readUInt16LE(0); + this._data = data.subarray(2); + + return this; + } + + getMessageId(): number { + return this.messageId; + } + + setMessageId(messageId: number): ServerMessagePayload { + this.messageId = messageId; + return this; + } +} + +export class ServerGenericRequest extends ServerMessagePayload { + private _data2: Buffer = Buffer.alloc(4); + + override getByteSize(): number { + return 2 + 4 + 4; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + buffer.writeUInt32LE(this._data.readUInt32LE(0), 2); + buffer.writeUInt32LE(this._data2.readUInt32LE(0), 6); + + return buffer; + } catch (error) { + log.error( + `Error serializing ServerGenericRequest: ${error as string}`, + ); + throw error; + } + } + + override deserialize(data: Buffer): ServerGenericRequest { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + this._data = data.subarray(2, 6); + this._data2 = data.subarray(6, 10); + + return this; + } catch (error) { + log.error( + `Error deserializing ServerGenericRequest: ${error as string}`, + ); + throw error; + } + } + + getData() { + return this._data; + } + + getData2() { + return this._data2; + } + + toString(): string { + return `ServerGenericRequest {messageId: ${this.messageId}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; + } +} + +export class ServerGenericResponse extends ServerMessagePayload { + private _msgReply: number = 0; // 2 bytes + private _result: number = 0; // 4 + private _data2: Buffer = Buffer.alloc(4); + + override getByteSize(): number { + return 2 + 2 + 4 + 4 + 4; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + buffer.writeUInt16LE(this._msgReply, 2); + buffer.writeUInt32LE(this._result, 4); + buffer.writeUInt32LE(this._data.readUInt32LE(0), 8); + buffer.writeUInt32LE(this._data2.readUInt32LE(0), 12); + + return buffer; + } + + override deserialize(data: Buffer): ServerGenericResponse { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + this._msgReply = data.readUInt16LE(2); + this._result = data.readUInt32LE(4); + this._data = data.subarray(2, 6); + this._data = data.subarray(6, 10); + + return this; + } + + getMessageReply(): number { + return this._msgReply; + } + + getResult(): number { + return this._result; + } + + setMsgReply(msgReply: number): ServerGenericResponse { + this._msgReply = msgReply; + return this; + } + + toString(): string { + return `ServerGenericResponse {messageId: ${this.messageId}, msgReply: ${this._msgReply}, result: ${this._result}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; + } +} + +export class ServerMessage extends Serializable implements IMessage { + header: ServerMessageHeader; + data: ServerMessagePayload; + private _preDecryptedMessageId: number = -1; + private _preEncryptedMessageId: number = -1; + + constructor(messageId: number) { + super(); + this.header = new ServerMessageHeader(); + this.data = new ServerMessagePayload().setMessageId(messageId); + } + getDataBuffer(): Buffer { + return this.data.serialize(); + } + setDataBuffer(data: Buffer): ServerMessage { + this.data.deserialize(data); + return this; + } + /** The message length is the length of the message data, not including the id */ + override getByteSize(): number { + return this.header.getByteSize() + this.data.getByteSize(); + } + + populateHeader(seq?: number): ServerMessage { + this.header.setLength(this.header.getByteSize() + this.data.getByteSize() - 2); + this.header.setSignature("TOMC"); + this.header.setSequence(seq || 0); + + return this; + } + + getData(): ISerializable { + return this.data; + } + setData(data: ServerMessagePayload): ServerMessage { + this.data = data; + return this; + } + override serialize(): Buffer { + try { + + if (this.header.getSequence() === 0) { + throw new Error("ServerMessage sequence is 0, it must be set to a non-zero value before serializing"); + } + + if (!this.header.isValidSignature()) { + throw new Error("ServerMessage signature is invalid, it must be set to 'TOMC' before serializing"); + } + + if (this.header.getByteSize() === 0) { + throw new Error("ServerMessage header byte size is 0, it must be set before serializing"); + } + + const buffer = Buffer.alloc(this.getByteSize()); + const headerBuffer = this.header.serialize(); + const dataBuffer = this.getDataBuffer(); + + headerBuffer.copy(buffer); + dataBuffer.copy(buffer, this.header.getDataOffset()); + + return buffer; + } catch (error) { + log.error(`Error serializing ServerMessage: ${error as string}`); + throw error; + } + + } + override deserialize(data: Buffer): ServerMessage { + this._assertEnoughData(data, this.header.getByteSize()); + + this.header.deserialize(data); + this.setDataBuffer(data.subarray(this.header.getDataOffset())); + + return this; + } + + isEncrypted() { + return this.header.isPayloadEncrypted(); + } + + decrypt(cipherPair: McosEncryptionPair): ServerMessage { + log.setName("ServerMessage::decrypt"); + if (this.isEncrypted()) { + try { + this._preDecryptedMessageId = this.data.getMessageId(); + log.debug(`Decrypting ServerMessage with message id ${this.data.getMessageId()}`); + this.setDataBuffer(cipherPair.decrypt(this.getDataBuffer())); + log.debug(`Decrypted ServerMessage with message id ${this._preDecryptedMessageId}, new message id: ${this.data.getMessageId()}`); + this.header.setPayloadEncryption(false); + } catch (error) { + log.error(`Error decrypting ServerMessage: ${error as string}`); + throw error; + } + } + log.resetName(); + return this; + } + + encrypt(cipherPair: McosEncryptionPair): ServerMessage { + log.setName("ServerMessage::encrypt"); + if (!this.isEncrypted()) { + try { + this._preEncryptedMessageId = this.data.getMessageId(); + log.debug(`Encrypting ServerMessage with message id ${this.data.getMessageId()}`); + this.setDataBuffer(cipherPair.encrypt(this.getDataBuffer())); + log.debug(`Encrypted ServerMessage with message id ${this._preEncryptedMessageId}, new message id: ${this.data.getMessageId()}`); + this.header.setPayloadEncryption(true); + } catch (error) { + log.error(`Error encrypting ServerMessage: ${error as string}`); + throw error; + } + } + log.resetName(); + return this; + } + + getId() { + return this.data.getMessageId(); + } + + getSequence() { + return this.header.getSequence(); + } + + toString(): string { + return `ServerMessage {length: ${this.header.getLength()}, id: ${this.data.getMessageId()}}`; + } + + getPreDecryptedMessageId() { + return this._preDecryptedMessageId; + } + + + getPreEncryptedMessageId() { + return this._preEncryptedMessageId; + } + +} diff --git a/packages/shared-packets/src/interfaces.ts b/packages/shared-packets/src/interfaces.ts new file mode 100644 index 000000000..5d7086fe3 --- /dev/null +++ b/packages/shared-packets/src/interfaces.ts @@ -0,0 +1,15 @@ +export interface ISerializable { + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; + toHexString(): string; +} + +export interface IMessage extends ISerializable { + header: ISerializable; + getData(): ISerializable; + getDataBuffer(): Buffer; + setData(data: ISerializable): void; + setDataBuffer(data: Buffer): void; +} diff --git a/packages/shared-packets/src/utils.ts b/packages/shared-packets/src/utils.ts new file mode 100644 index 000000000..482d28dd5 --- /dev/null +++ b/packages/shared-packets/src/utils.ts @@ -0,0 +1,5 @@ +export function getAsHex(bytes: Buffer): string { + return bytes.length % 2 === 0 + ? bytes.toString("hex") + : bytes.toString("hex") + "0"; +} diff --git a/packages/shared-packets/test/index.test.ts b/packages/shared-packets/test/index.test.ts new file mode 100644 index 000000000..f01d2f75d --- /dev/null +++ b/packages/shared-packets/test/index.test.ts @@ -0,0 +1,7 @@ +import { describe, expect, it } from "vitest"; + +describe("example", () => { + it("should pass", () => { + expect(true).toBe(true); + }); +}); diff --git a/packages/shared-packets/tsconfig.json b/packages/shared-packets/tsconfig.json new file mode 100644 index 000000000..eeb3f6426 --- /dev/null +++ b/packages/shared-packets/tsconfig.json @@ -0,0 +1,109 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "commonjs" /* Specify what module code is generated. */, + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} diff --git a/packages/shared-packets/vite.config.ts b/packages/shared-packets/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/shared-packets/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/shared/index.ts b/packages/shared/index.ts new file mode 100644 index 000000000..554e1f4b4 --- /dev/null +++ b/packages/shared/index.ts @@ -0,0 +1,31 @@ +export { SubThread } from "./SubThread.js"; +export { NetworkMessage } from "./src/NetworkMessage.js"; +export { ServerLogger, getServerLogger } from "./src/log.js"; +export { Configuration, getServerConfiguration } from "./Configuration.js"; + +export { RawMessage } from "./src/RawMessage.js"; +export { ServerMessage } from "./src/ServerMessage.js"; +export type * from "./src/types.js"; + +export interface KeypressEvent { + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; +} + +export interface ConnectionRecord { + customerId: number; + connectionId: string; + sessionKey: string; + sKey: string; + contextId: string; +} + +export { + McosEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, + verifyLegacyCipherSupport, +} from "./src/encryption.js"; diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 000000000..52f3f9ace --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,34 @@ +{ + "name": "rusty-motors-shared", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + }, + "./test": { + "import": "./test/index.js", + "require": "./test/index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "fastify": "^4.27.0", + "pino": "^9.0.0", + "pino-pretty": "^11.0.0", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" +} diff --git a/packages/shared/vite.config.ts b/packages/shared/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/shared/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/server.ts b/server.ts index e9ad48cc5..931bfcbf4 100755 --- a/server.ts +++ b/server.ts @@ -33,7 +33,7 @@ try { } Sentry.init({ - dsn: "https://9cefd6a6a3b940328fcefe45766023f2@o1413557.ingest.sentry.io/4504406901915648", + dsn: process.env.SENTRY_DSN, // We recommend adjusting this value in production, or using tracesSampler // for finer control @@ -42,28 +42,28 @@ Sentry.init({ }); try { - if (typeof process.env["EXTERNAL_HOST"] === "undefined") { + if (typeof process.env.EXTERNAL_HOST === "undefined") { console.error("Please set EXTERNAL_HOST"); process.exit(1); } - if (typeof process.env["CERTIFICATE_FILE"] === "undefined") { + if (typeof process.env.CERTIFICATE_FILE === "undefined") { console.error("Please set CERTIFICATE_FILE"); process.exit(1); } - if (typeof process.env["PRIVATE_KEY_FILE"] === "undefined") { + if (typeof process.env.PRIVATE_KEY_FILE === "undefined") { console.error("Please set PRIVATE_KEY_FILE"); process.exit(1); } - if (typeof process.env["PUBLIC_KEY_FILE"] === "undefined") { + if (typeof process.env.PUBLIC_KEY_FILE === "undefined") { console.error("Please set PUBLIC_KEY_FILE"); process.exit(1); } const config = getServerConfiguration({ - host: process.env["EXTERNAL_HOST"], - certificateFile: process.env["CERTIFICATE_FILE"], - privateKeyFile: process.env["PRIVATE_KEY_FILE"], - publicKeyFile: process.env["PUBLIC_KEY_FILE"], - logLevel: process.env["LOG_LEVEL"], + host: process.env.EXTERNAL_HOST, + certificateFile: process.env.CERTIFICATE_FILE, + privateKeyFile: process.env.PRIVATE_KEY_FILE, + publicKeyFile: process.env.PUBLIC_KEY_FILE, + logLevel: process.env.LOG_LEVEL, }); const appLog = getServerLogger({ From 2d4c34f0245a855d66c041b71aef0d64645f7a81 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Tue, 20 Aug 2024 20:02:29 -0400 Subject: [PATCH 02/84] chore: Remove unused server.ts file and update tsconfig.json --- apps/main/server.ts | 112 -------------------------------------------- tsconfig.json | 9 +++- 2 files changed, 7 insertions(+), 114 deletions(-) delete mode 100755 apps/main/server.ts diff --git a/apps/main/server.ts b/apps/main/server.ts deleted file mode 100755 index 6ecb6109a..000000000 --- a/apps/main/server.ts +++ /dev/null @@ -1,112 +0,0 @@ -// mcos is a game server, written from scratch, for an old game -// Copyright (C) <2017> -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published -// by the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -import * as Sentry from "@sentry/node"; -import { nodeProfilingIntegration } from "@sentry/profiling-node"; -import { getServerLogger } from "rusty-motors-shared"; -import { verifyLegacyCipherSupport } from "rusty-motors-shared"; -import { getServerConfiguration } from "rusty-motors-shared"; -import { getGatewayServer } from "rusty-motors-gateway"; - -process.on("unhandledRejection", (reason, promise) => { - console.error("Unhandled Rejection at:", promise, "reason:", reason); - Sentry.captureException(reason); -}); - - -export default async function main() { - const coreLogger = getServerLogger({ - level: "info", - }); - - try { - verifyLegacyCipherSupport(); - } catch (err) { - coreLogger.fatal(`Error in core server: ${String(err)}`); - throw err; - } - - Sentry.init({ - dsn: "https://f4c0126e2fc35876c860dd72fc056db9@o1413557.ingest.sentry.io/4506787875061760", - - // We recommend adjusting this value in production, or using tracesSampler - // for finer control - tracesSampleRate: 1.0, - profilesSampleRate: 1.0, // Profiling sample rate is relative to tracesSampleRate - integrations: [ - nodeProfilingIntegration(), - ], - _experiments: { - metricsAggregator: true, - }, - }); - - try { - if (typeof process.env["EXTERNAL_HOST"] === "undefined") { - console.error("Please set EXTERNAL_HOST"); - process.exit(1); - } - if (typeof process.env["CERTIFICATE_FILE"] === "undefined") { - console.error("Please set CERTIFICATE_FILE"); - process.exit(1); - } - if (typeof process.env["PRIVATE_KEY_FILE"] === "undefined") { - console.error("Please set PRIVATE_KEY_FILE"); - process.exit(1); - } - if (typeof process.env["PUBLIC_KEY_FILE"] === "undefined") { - console.error("Please set PUBLIC_KEY_FILE"); - process.exit(1); - } - const config = getServerConfiguration({ - host: process.env["EXTERNAL_HOST"], - certificateFile: process.env["CERTIFICATE_FILE"], - privateKeyFile: process.env["PRIVATE_KEY_FILE"], - publicKeyFile: process.env["PUBLIC_KEY_FILE"], - }); - - const appLog = getServerLogger(); - - const listeningPortList: number[] = [ - 6660, 7003, 8228, 8226, 8227, - // I don't know what part 9000 is for, but it's in the original list - // 9000, - 9001, 9002, 9003, 9004, 9005, 9006, - 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, - 53303, - ]; - - const gatewayServer = getGatewayServer({ - config, - log: appLog, - listeningPortList, - }); - - await gatewayServer.start(); - } catch (err) { - Sentry.captureException(err); - coreLogger.fatal(`Error in core server: ${String(err)}`); - throw err; - } -} - -try { - await main(); -} catch (error) { - console.error("Error in main server:", error); - process.exit(1); - -} diff --git a/tsconfig.json b/tsconfig.json index ae87fc09f..ecd9f5e30 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,5 +12,10 @@ "strict": true, "skipLibCheck": true }, - "include": ["src", "test", "packages", "server.ts"] -} + "include": [ + "src", + "test", + "packages", + "server.ts" + ] +} \ No newline at end of file From 6edb2d0003faed647725f59f3dda757cf4a63231 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Tue, 20 Aug 2024 20:22:37 -0400 Subject: [PATCH 03/84] chore: Update node.yml workflow to improve testing process --- .github/workflows/node.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index cae065c6d..10d3eb9d7 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -26,9 +26,9 @@ jobs: - name: Install and test run: | npm install - export DATABASE_URL=$(npx pg-test start) + # export DATABASE_URL=$(npx pg-test start) npm test - npx pg-test stop + # npx pg-test stop env: CODECOV_UPLOAD_BUNDLE_TOKEN: ${{ secrets.CODECOV_UPLOAD_BUNDLE_TOKEN }} - name: Codecov From 29191923484e947b4b07df4f903ab884c5816cb4 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Tue, 20 Aug 2024 20:24:45 -0400 Subject: [PATCH 04/84] chore: Update node.yml workflow to improve testing process --- .github/workflows/node.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index b7d9186f5..bc661075f 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -27,9 +27,7 @@ jobs: - name: Install and test run: | npm install - # export DATABASE_URL=$(npx pg-test start) npm test - # npx pg-test stop env: CODECOV_UPLOAD_BUNDLE_TOKEN: ${{ secrets.CODECOV_UPLOAD_BUNDLE_TOKEN }} - name: Codecov From 02e84c08b89fd240cfa945a1d75b136df6a536d7 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 06:59:36 -0400 Subject: [PATCH 05/84] chore: wip - npm start still works --- .eslintrc.json | 28 +- .renovaterc.json | 12 +- .vscode/extensions.json | 14 +- .vscode/settings.json | 6 +- apps/main/package.json | 20 - biome.json | 69 + jsconfig-old.json | 22 +- package-lock.json | 30868 ++++++++-------- package.json | 190 +- packages/cli/ConsoleThread.ts | 118 +- packages/cli/package.json | 52 +- packages/cli/test/index.test.ts | 6 +- packages/cli/vite.config.ts | 36 +- .../core/src/serializationHelpers.test.ts | 642 +- packages/core/src/serializationHelpers.ts | 76 +- packages/database/package.json | 66 +- packages/database/src/DatabaseManager.ts | 266 +- packages/database/src/models/Lobby.ts | 22 +- packages/database/src/models/Player.ts | 14 +- packages/database/test/Database.test.ts | 150 +- packages/database/test/Player.test.ts | 8 +- packages/database/vite.config.ts | 36 +- packages/gateway/package.json | 56 +- packages/gateway/src/GatewayServer.ts | 624 +- packages/gateway/src/encryption.ts | 68 +- packages/gateway/src/index.ts | 270 +- packages/gateway/src/web.ts | 194 +- packages/gateway/test/encryption.test.ts | 251 +- packages/gateway/vite.config.ts | 36 +- packages/interfaces/index.d.ts | 240 +- packages/lobby/src/LoginInfoMessage.ts | 180 +- packages/lobby/src/MiniRiffMessage.js | 157 +- .../lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts | 90 +- .../lobby/src/NPS_LOBBYSERVER_COMMANDS.ts | 94 +- packages/lobby/src/NPS_LOBBY_COMMANDS.ts | 4 +- packages/lobby/src/UserInfoMessage.ts | 216 +- packages/lobby/src/handlers/_setMyUserData.ts | 95 +- .../lobby/src/handlers/encryptedCommand.ts | 348 +- .../src/handlers/handleGetMiniUserList.ts | 97 +- .../src/handlers/handleSendMiniRiffList.ts | 94 +- .../lobby/src/handlers/handleTrackingPing.ts | 36 +- packages/lobby/src/handlers/heartbeat.js | 40 +- packages/lobby/src/handlers/index.js | 22 +- .../src/handlers/requestConnectGameServer.ts | 208 +- packages/lobby/src/internal.ts | 170 +- .../handlers/handleSendMiniRiffList.test.ts | 20 +- packages/login/src/NPSUserStatus.ts | 190 +- .../login/src/NPS_LOGINCLIENT_COMMANDS.ts | 88 +- packages/login/src/NPS_LOGIN_COMMANDS.ts | 2 +- packages/login/src/index.ts | 228 +- packages/login/src/internal.ts | 330 +- packages/login/src/premadeLogin.ts | 520 +- packages/login/test/LoginServer.test.ts | 32 +- packages/mcots/ClientConnectionManager.ts | 90 +- packages/mcots/errors/ErrorNoKey.ts | 6 +- packages/mcots/index.ts | 28 +- packages/mcots/messageProcessors/index.ts | 28 +- .../messageProcessors/processClientConnect.ts | 146 +- .../processClientTracking.ts | 32 +- .../messageProcessors/processServerLogin.ts | 50 +- .../messageProcessors/processSetOptions.ts | 36 +- .../messageProcessors/processStockCarInfo.ts | 142 +- .../mcots/messageProcessors/sendSuccess.ts | 23 +- packages/mcots/package.json | 46 +- .../mcots/payloads/ClientConnectMessage.ts | 97 +- .../mcots/payloads/ClientTrackingMessage.ts | 58 +- .../mcots/payloads/LoginCompleteMessage.ts | 312 +- packages/mcots/payloads/LoginMessage.ts | 119 +- packages/mcots/payloads/SetOptionsMessage.ts | 140 +- packages/mcots/payloads/StockCar.ts | 224 +- packages/mcots/payloads/index.ts | 12 +- packages/mcots/test/index.test.ts | 6 +- packages/mcots/vite.config.ts | 36 +- .../getLobMiniRiffList.ts | 50 +- .../getLobMiniUserList.ts | 32 +- packages/nps/gameMessageProcessors/index.ts | 104 +- .../gameMessageProcessors/lobbyCommands.ts | 4 +- .../processCheckPlateText.ts | 36 +- .../processCheckProfileName.ts | 34 +- .../processCreateProfile.ts | 51 +- .../processDeleteProfile.ts | 134 +- .../processEncryptedGameCommand.ts | 199 +- .../gameMessageProcessors/processGameLogin.ts | 333 +- .../processGameLogout.ts | 17 +- .../processGetFirstBuddy.ts | 58 +- .../processGetProfileInfo.ts | 94 +- .../processGetProfileMaps.ts | 100 +- .../nps/gameMessageProcessors/processPing.ts | 28 +- .../processSelectPersona.ts | 64 +- .../gameMessageProcessors/processUserLogin.ts | 88 +- packages/nps/index.ts | 96 +- packages/nps/messageStructs/GameMessage.ts | 387 +- packages/nps/messageStructs/GameProfile.ts | 323 +- packages/nps/messageStructs/MiniRiffList.ts | 158 +- packages/nps/messageStructs/MiniUserList.ts | 119 +- packages/nps/messageStructs/NPSList.ts | 58 +- packages/nps/messageStructs/ProfileList.ts | 92 +- packages/nps/messageStructs/SessionKey.ts | 214 +- packages/nps/messageStructs/UserAction.ts | 236 +- packages/nps/messageStructs/UserInfo.ts | 78 +- packages/nps/messageStructs/UserStatus.ts | 323 +- packages/nps/package.json | 46 +- packages/nps/services/account.ts | 52 +- packages/nps/services/profile.ts | 104 +- packages/nps/services/token.ts | 70 +- packages/nps/services/types.ts | 26 +- packages/nps/src/EncryptionSession.ts | 91 +- packages/nps/src/UserStatusManager.ts | 161 +- packages/nps/src/utils/pureCompare.ts | 41 +- packages/nps/src/utils/pureGet.ts | 54 +- packages/nps/src/utils/purePut.ts | 130 +- packages/nps/src/utils/sendNPSAck.ts | 10 +- packages/nps/test/index.test.ts | 6 +- packages/nps/types.ts | 30 +- packages/nps/vite.config.ts | 36 +- packages/patch/package.json | 50 +- packages/patch/src/PatchServer.ts | 176 +- packages/patch/test/PatchServer.test.ts | 56 +- packages/patch/vite.config.ts | 36 +- packages/persona/src/BuddyInfoMessage.ts | 198 +- packages/persona/src/PersonaMapsMessage.ts | 621 +- packages/persona/src/_gameLogout.ts | 66 +- packages/persona/src/_getFirstBuddy.ts | 174 +- packages/persona/src/_selectGamePersona.ts | 76 +- .../persona/src/getPersonasByPersonaId.ts | 26 +- .../src/handlers/validatePersonaName.ts | 64 +- packages/persona/src/index.js | 32 +- packages/persona/src/internal.ts | 382 +- .../test/getPersonasByPersonaId.test.ts | 42 +- packages/shard/package.json | 50 +- packages/shard/src/ShardServer.ts | 82 +- packages/shard/src/index.ts | 46 +- packages/shard/src/shard-entry.ts | 148 +- packages/shard/test/shard-entry.test.ts | 52 +- packages/shard/vite.config.ts | 36 +- packages/shared-packets/index.ts | 10 +- packages/shared-packets/package.json | 40 +- packages/shared-packets/src/BasePacket.ts | 72 +- packages/shared-packets/src/ServerMessage.ts | 692 +- packages/shared-packets/src/interfaces.ts | 20 +- packages/shared-packets/src/utils.ts | 5 +- packages/shared-packets/test/index.test.ts | 6 +- packages/shared-packets/tsconfig.json | 119 +- packages/shared-packets/vite.config.ts | 36 +- packages/shared/Configuration.ts | 130 +- packages/shared/MessageNode.ts | 176 +- packages/shared/NPSMessage.js | 134 +- packages/shared/RawMessageHeader.js | 96 +- packages/shared/ServerMessage.test.ts | 54 +- packages/shared/State.ts | 432 +- packages/shared/SubThread.ts | 70 +- packages/shared/TimeStamp.ts | 128 +- packages/shared/errors/ServerError.ts | 178 +- packages/shared/index.ts | 28 +- packages/shared/log.ts | 150 +- packages/shared/messageFactory.ts | 1538 +- packages/shared/package.json | 64 +- packages/shared/src/BaseSerialized.ts | 62 +- packages/shared/src/NetworkMessage.ts | 100 +- packages/shared/src/RawMessage.ts | 74 +- packages/shared/src/SerializedBuffer.ts | 61 +- packages/shared/src/ServerMessage.ts | 138 +- packages/shared/structs.ts | 336 +- packages/shared/test/BaseSerialized.test.ts | 66 +- packages/shared/test/RawMessage.test.ts | 120 +- packages/shared/test/SerializedBuffer.test.ts | 94 +- packages/shared/utils.js | 12 +- packages/shared/vite.config.ts | 36 +- packages/transactions/src/ArcadeCarMessage.ts | 130 +- .../transactions/src/EntryFeePurseMessage.ts | 170 +- packages/transactions/src/GameUrlsMessage.ts | 132 +- .../transactions/src/GenericReplyMessage.ts | 284 +- .../transactions/src/GenericRequestMessage.ts | 106 +- packages/transactions/src/LobbyMessage.ts | 1214 +- .../transactions/src/OwnedVehiclesMessage.ts | 120 +- .../transactions/src/PartsAssemblyMessage.ts | 172 +- .../transactions/src/PlayerInfoMessage.ts | 375 +- .../transactions/src/PlayerPhysicalMessage.ts | 84 +- .../src/PlayerRacingHistoryMessage.ts | 292 +- packages/transactions/src/StockCar.ts | 68 +- .../transactions/src/StockCarInfoMessage.ts | 144 +- .../transactions/src/TClientConnectMessage.ts | 146 +- packages/transactions/src/TLoginMessage.ts | 228 +- packages/transactions/src/TunablesMessage.ts | 246 +- .../transactions/src/_getArcadeCarInfo.ts | 36 +- packages/transactions/src/_getGameUrls.ts | 36 +- packages/transactions/src/_getOwnedParts.ts | 46 +- .../transactions/src/_getOwnedVehicles.ts | 52 +- packages/transactions/src/_getPlayerInfo.ts | 42 +- .../transactions/src/_getPlayerPhysical.ts | 32 +- .../transactions/src/_getPlayerRaceHistory.ts | 116 +- packages/transactions/src/_getStockCarInfo.ts | 42 +- packages/transactions/src/_getTunables.ts | 28 +- packages/transactions/src/_logout.ts | 28 +- packages/transactions/src/clientConnect.ts | 132 +- packages/transactions/src/getLobbies.ts | 116 +- packages/transactions/src/handlers.ts | 144 +- packages/transactions/src/internal.ts | 417 +- packages/transactions/src/login.ts | 36 +- packages/transactions/src/trackingPing.ts | 28 +- .../transactions/test/LobbyMessage.test.ts | 186 +- .../test/OwnedVehiclesMessage.test.ts | 52 +- .../test/PartsAssemblyMessage.test.ts | 75 +- .../test/PlayerInfoMessage.test.ts | 24 +- .../test/PlayerRacingHistoryMessage.test.ts | 8 +- .../test/TClientConnectMessage.test.ts | 18 +- .../test/_getPlayerRaceHistory.test.ts | 35 +- .../transactions/test/clientConnect.test.ts | 92 +- packages/transactions/test/getLobbies.test.ts | 34 +- packages/transactions/test/login.test.ts | 38 +- .../transactions/test/trackingPing.test.ts | 38 +- prettierrc | 6 - server.ts | 105 +- test/factoryMocks.ts | 54 +- tsconfig.json | 35 +- vite.config.ts | 26 +- 216 files changed, 28453 insertions(+), 29024 deletions(-) delete mode 100644 apps/main/package.json create mode 100644 biome.json delete mode 100644 prettierrc diff --git a/.eslintrc.json b/.eslintrc.json index ec9f7707d..3856b5806 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,16 +1,16 @@ { - "extends": ["eslint:recommended", "plugin:prettier/recommended"], - "env": { - "node": true, - "es2021": true - }, - "plugins": ["prettier"], - "parserOptions": { - "ecmaVersion": "latest", - "sourceType": "module" - }, - "rules": { - "prettier/prettier": "error", - "no-undef": "error" - } + "extends": ["eslint:recommended", "plugin:prettier/recommended"], + "env": { + "node": true, + "es2021": true + }, + "plugins": ["prettier"], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + }, + "rules": { + "prettier/prettier": "error", + "no-undef": "error" + } } diff --git a/.renovaterc.json b/.renovaterc.json index 8a90a2740..4dc3e5619 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -1,8 +1,8 @@ { - "extends": ["config:base"], - "statusCheckVerify": true, - "automerge": true, - "automergeType": "branch", - "rangeStrategy": "bump", - "enabledManagers": ["npm"] + "extends": ["config:base"], + "statusCheckVerify": true, + "automerge": true, + "automergeType": "branch", + "rangeStrategy": "bump", + "enabledManagers": ["npm"] } diff --git a/.vscode/extensions.json b/.vscode/extensions.json index d8d18723f..b17b16dd4 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,9 +1,9 @@ { - "recommendations": [ - "ms-azuretools.vscode-docker", - "dbaeumer.vscode-eslint", - "esbenp.prettier-vscode", - "ms-vscode.makefile-tools", - "usernamehw.errorlens" - ] + "recommendations": [ + "ms-azuretools.vscode-docker", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "ms-vscode.makefile-tools", + "usernamehw.errorlens" + ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 81682a824..ea51765b1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "git.enableCommitSigning": true, - "typescript.tsdk": "node_modules/typescript/lib", - "js/ts.implicitProjectConfig.checkJs": true + "git.enableCommitSigning": true, + "typescript.tsdk": "node_modules/typescript/lib", + "js/ts.implicitProjectConfig.checkJs": true } diff --git a/apps/main/package.json b/apps/main/package.json deleted file mode 100644 index d79f2dfd9..000000000 --- a/apps/main/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "rusty-motors-server", - "version": "1.0.0", - "type": "module", - "scripts": { - "start": "tsx --openssl-legacy-provider --env-file=../../.env server.ts" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "@sentry/profiling-node": "^8.0.0", - "rusty-motors-gateway": "^1.0.0", - "rusty-motors-shared": "^1.0.0", - "tsx": "^4.10.2", - "typescript": "^5.4.5" - }, - "description": "" -} diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..ee9a136af --- /dev/null +++ b/biome.json @@ -0,0 +1,69 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "organizeImports": { "enabled": true }, + "linter": { + "enabled": true, + "rules": { + "recommended": false, + "complexity": { + "noExtraBooleanCast": "error", + "noMultipleSpacesInRegularExpressionLiterals": "error", + "noUselessCatch": "error", + "noWith": "error", + "useArrowFunction": "off" + }, + "correctness": { + "noConstAssign": "error", + "noConstantCondition": "error", + "noEmptyCharacterClassInRegex": "error", + "noEmptyPattern": "error", + "noGlobalObjectCalls": "error", + "noInnerDeclarations": "error", + "noInvalidConstructorSuper": "error", + "noNewSymbol": "error", + "noNonoctalDecimalEscape": "error", + "noPrecisionLoss": "error", + "noSelfAssign": "error", + "noSetterReturn": "error", + "noSwitchDeclarations": "error", + "noUndeclaredVariables": "error", + "noUnreachable": "error", + "noUnreachableSuper": "error", + "noUnsafeFinally": "error", + "noUnsafeOptionalChaining": "error", + "noUnusedLabels": "error", + "noUnusedVariables": "error", + "useIsNan": "error", + "useValidForDirection": "error", + "useYield": "error" + }, + "style": { "useBlockStatements": "off" }, + "suspicious": { + "noAssignInExpressions": "error", + "noAsyncPromiseExecutor": "error", + "noCatchAssign": "error", + "noClassAssign": "error", + "noCompareNegZero": "error", + "noControlCharactersInRegex": "error", + "noDebugger": "error", + "noDuplicateCase": "error", + "noDuplicateClassMembers": "error", + "noDuplicateObjectKeys": "error", + "noDuplicateParameters": "error", + "noEmptyBlockStatements": "error", + "noFallthroughSwitchClause": "error", + "noFunctionAssign": "error", + "noGlobalAssign": "error", + "noImportAssign": "error", + "noMisleadingCharacterClass": "error", + "noPrototypeBuiltins": "error", + "noRedeclare": "error", + "noShadowRestrictedNames": "error", + "noUnsafeNegation": "error", + "useGetterReturn": "error", + "useValidTypeof": "error" + } + }, + "ignore": ["**/*.d.ts", "**/dist", "**/out"] + } +} diff --git a/jsconfig-old.json b/jsconfig-old.json index 0f9972668..bfaa42147 100644 --- a/jsconfig-old.json +++ b/jsconfig-old.json @@ -1,13 +1,13 @@ { - "extends": "@tsconfig/node20/tsconfig.json", - "compilerOptions": { - "strict": true, - "module": "NodeNext", - "noEmit": true, - "allowJs": true, - "checkJs": true, - "noErrorTruncation": true - }, - "exclude": ["node_modules", "**/node_modules/*"], - "include": ["src/**/*", "packages/**/*", "test/**/*", "server.js"] + "extends": "@tsconfig/node20/tsconfig.json", + "compilerOptions": { + "strict": true, + "module": "NodeNext", + "noEmit": true, + "allowJs": true, + "checkJs": true, + "noErrorTruncation": true + }, + "exclude": ["node_modules", "**/node_modules/*"], + "include": ["src/**/*", "packages/**/*", "test/**/*", "server.js"] } diff --git a/package-lock.json b/package-lock.json index 6ce27680e..63553d74d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15624 +1,15248 @@ { - "name": "mcos", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "mcos", - "version": "1.0.0", - "license": "AGPL-3.0", - "workspaces": [ - "apps/main", - "packages/cli", - "packages/connection", - "packages/database", - "packages/gateway", - "packages/mcots", - "packages/nps", - "packages/patch", - "packages/shard", - "packages/shared", - "packages/shared-packets" - ], - "dependencies": { - "@adminjs/sequelize": "^4.1.1", - "@fastify/sensible": "^5.5.0", - "@sentry/node": "7.88", - "@sentry/profiling-node": "^1.3.2", - "adminjs": "^7.5.2", - "fastify": "^4.25.1", - "moment": "^2.29.4", - "pino": "^8.17.1", - "sequelize": "^6.35.2", - "sqlite": "^5.1.1", - "ts-node": "10.9.2" - }, - "devDependencies": { - "@sentry/cli": "^2.23.1", - "@tsconfig/node-lts": "^20.1.0", - "@tsconfig/node20": "^20.1.2", - "@types/chai": "4.3.11", - "@types/node": "^20.10.5", - "@types/sinon": "17.0.2", - "@types/sinon-chai": "3.2.12", - "@typescript-eslint/eslint-plugin": "^6.15.0", - "@typescript-eslint/parser": "^6.15.0", - "@vitest/coverage-v8": "^1.1.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "5.1.1", - "husky": "^8.0.3", - "jsdoc": "^4.0.2", - "lint-staged": "^15.2.0", - "prettier": "3.1.1", - "prettier-eslint": "16.2.0", - "rimraf": "^5.0.5", - "standard-version": "^9.5.0", - "tsx": "4.7.0", - "typescript": "^5.3.3", - "typescript-eslint-language-service": "^5.0.5", - "vitest": "^1.1.0" - } - }, - "apps/main": { - "name": "rusty-motors-server", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "@sentry/profiling-node": "^8.0.0", - "rusty-motors-gateway": "^1.0.0", - "rusty-motors-shared": "^1.0.0", - "tsx": "^4.10.2", - "typescript": "^5.4.5" - } - }, - "apps/main/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "apps/main/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "license": "MIT", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "apps/main/node_modules/@sentry/node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", - "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", - "license": "MIT", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.38.0", - "@opentelemetry/instrumentation-express": "0.41.1", - "@opentelemetry/instrumentation-fastify": "0.38.0", - "@opentelemetry/instrumentation-fs": "0.14.0", - "@opentelemetry/instrumentation-graphql": "0.42.0", - "@opentelemetry/instrumentation-hapi": "0.40.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.42.0", - "@opentelemetry/instrumentation-koa": "0.42.0", - "@opentelemetry/instrumentation-mongodb": "0.46.0", - "@opentelemetry/instrumentation-mongoose": "0.40.0", - "@opentelemetry/instrumentation-mysql": "0.40.0", - "@opentelemetry/instrumentation-mysql2": "0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "0.39.0", - "@opentelemetry/instrumentation-pg": "0.43.0", - "@opentelemetry/instrumentation-redis-4": "0.41.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.17.0", - "@sentry/core": "8.26.0", - "@sentry/opentelemetry": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "import-in-the-middle": "^1.11.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.3" - } - }, - "apps/main/node_modules/@sentry/profiling-node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-8.26.0.tgz", - "integrity": "sha512-yGHFoqSKe5j9fDK9n5ntJxDyZnedwjCm6fAXwIlsLJOUBqn5g7l8V1XgBPlCJLZzOG0fbvGvSo4WyBfDoSD8vQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "@sentry/core": "8.26.0", - "@sentry/node": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "detect-libc": "^2.0.2", - "node-abi": "^3.61.0" - }, - "bin": { - "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.js" - }, - "engines": { - "node": ">=14.18" - } - }, - "apps/main/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "license": "MIT", - "engines": { - "node": ">=14.18" - } - }, - "apps/main/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "license": "MIT", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "apps/main/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "apps/main/node_modules/tsx": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.17.0.tgz", - "integrity": "sha512-eN4mnDA5UMKDt4YZixo9tBioibaMBpoxBkD+rIPAjVmYERSG0/dWEY1CEFuV89CgASlKL499q8AhmkMnnjtOJg==", - "license": "MIT", - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adminjs/design-system": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "@hypnosphi/create-react-context": "^0.3.1", - "@tiptap/core": "2.0.1", - "@tiptap/extension-bubble-menu": "2.0.1", - "@tiptap/extension-character-count": "2.0.1", - "@tiptap/extension-code": "2.0.1", - "@tiptap/extension-document": "2.0.1", - "@tiptap/extension-floating-menu": "2.0.1", - "@tiptap/extension-heading": "2.0.1", - "@tiptap/extension-image": "2.0.1", - "@tiptap/extension-link": "2.0.1", - "@tiptap/extension-table": "2.0.1", - "@tiptap/extension-table-cell": "2.0.1", - "@tiptap/extension-table-header": "2.0.1", - "@tiptap/extension-table-row": "2.0.1", - "@tiptap/extension-text": "2.0.1", - "@tiptap/extension-text-align": "2.0.1", - "@tiptap/extension-typography": "2.0.1", - "@tiptap/pm": "2.0.1", - "@tiptap/react": "2.0.1", - "@tiptap/starter-kit": "2.0.1", - "date-fns": "^2.29.3", - "flat": "^5.0.2", - "jw-paginate": "^1.0.4", - "lodash": "^4.17.21", - "polished": "^4.2.2", - "react-currency-input-field": "^3.6.10", - "react-datepicker": "^4.10.0", - "react-feather": "^2.0.10", - "react-phone-input-2": "^2.15.1", - "react-select": "^5.7.2", - "react-text-mask": "^5.5.0", - "styled-components": "5.3.9", - "styled-system": "^5.1.5", - "text-mask-addons": "^3.8.0" - }, - "peerDependencies": { - "react": "^18.1.0", - "react-dom": "^18.1.0" - } - }, - "node_modules/@adminjs/sequelize": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@adminjs/sequelize/-/sequelize-4.1.1.tgz", - "integrity": "sha512-HKOuuFn79tvW6xKP+v7FvKc6V7vERlmdEu9oAAR3gz6SE3T+V7Uz8N+trwngFhOpTWVcuws2FchFvKG3Xrm9iw==", - "dependencies": { - "escape-regexp": "0.0.1" - }, - "peerDependencies": { - "adminjs": "^7.0.0", - "sequelize": ">=6" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.22.9", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.22.15", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helpers": "^7.22.15", - "@babel/parser": "^7.22.15", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-wrap-function": "^7.22.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.9", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.10", - "license": "MIT", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.13", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.25.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", - "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", - "dependencies": { - "@babel/types": "^7.25.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.9", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "license": "MIT", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.15", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.22.15", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.22.15", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-modules-systemjs": "^7.22.11", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.22.15", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.22.15", - "babel-plugin-polyfill-corejs2": "^0.4.5", - "babel-plugin-polyfill-corejs3": "^0.8.3", - "babel-plugin-polyfill-regenerator": "^0.5.2", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.22.15", - "@babel/plugin-transform-typescript": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.5", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/@babel/runtime": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.25.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", - "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", - "dependencies": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@databases/connection-pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@databases/connection-pool/-/connection-pool-1.1.0.tgz", - "integrity": "sha512-/12/SNgl0V77mJTo5SX3yGPz4c9XGQwAlCfA0vlfs/0HcaErNpYXpmhj0StET07w6TmTJTnaUgX2EPcQK9ez5A==", - "dependencies": { - "@databases/queue": "^1.0.0", - "is-promise": "^4.0.0" - } - }, - "node_modules/@databases/escape-identifier": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", - "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", - "dependencies": { - "@databases/validate-unicode": "^1.0.0" - } - }, - "node_modules/@databases/lock": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@databases/lock/-/lock-2.1.0.tgz", - "integrity": "sha512-ReWnFE5qeCuO2SA5h5fDh/hE/vMolA+Epe6xkAQP1FL2nhnsTCYwN2JACk/kWctR4OQoh0njBjPZ0yfIptclcA==", - "dependencies": { - "@databases/queue": "^1.0.0" - } - }, - "node_modules/@databases/pg": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@databases/pg/-/pg-5.5.0.tgz", - "integrity": "sha512-WIojK9AYIlNi5YRfc5YUOow3PQ82ClmwT9HG3nEsKLUERYieoVmHMYDQLS0ry6FjgJx+2yFs7LCw4kZpWu1TBw==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "@databases/escape-identifier": "^1.0.3", - "@databases/pg-config": "^3.2.0", - "@databases/pg-connection-string": "^1.0.0", - "@databases/pg-data-type-id": "^3.0.0", - "@databases/pg-errors": "^1.0.0", - "@databases/push-to-async-iterable": "^3.0.0", - "@databases/shared": "^3.1.0", - "@databases/split-sql-query": "^1.0.4", - "@databases/sql": "^3.3.0", - "assert-never": "^1.2.1", - "pg": "^8.4.2", - "pg-cursor": "^2.4.2" - } - }, - "node_modules/@databases/pg-bulk": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@databases/pg-bulk/-/pg-bulk-1.2.0.tgz", - "integrity": "sha512-GdzwFIllgOtuKbro4r6QBe0+4LipaUwb8+N7+z9QP+wg3XozGLnojnMFQlBrrc70jycw4aCM1O30w4vYtVlR/Q==", - "peerDependencies": { - "@databases/pg": "*" - } - }, - "node_modules/@databases/pg-config": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@databases/pg-config/-/pg-config-3.2.0.tgz", - "integrity": "sha512-hoPAK/F8gLcLgEJ8mLSnNvRlKqShwx5+GglDHIIfQhKF+Zz6M6QceiOefckS4WSjA0x2HClPvpercnXp9i24ag==", - "dependencies": { - "cosmiconfig": "^8.1.0", - "funtypes": "^4.1.0" - } - }, - "node_modules/@databases/pg-config/node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@databases/pg-connection-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@databases/pg-connection-string/-/pg-connection-string-1.0.0.tgz", - "integrity": "sha512-8czOF9jlv7PlS7BPjnL82ynpDs1t8cu+C2jvdtMr37e8daPKMS7n1KfNE9xtr2Gq4QYKjynep097eYa5yIwcLA==" - }, - "node_modules/@databases/pg-data-type-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@databases/pg-data-type-id/-/pg-data-type-id-3.0.0.tgz", - "integrity": "sha512-VqW1csN8pRsWJxjPsGIC9FQ8wyenfmGv0P//BaeDMAu/giM3IXKxKM8fkScUSQ00uqFK/L1iHS5g6dgodF3XzA==" - }, - "node_modules/@databases/pg-errors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@databases/pg-errors/-/pg-errors-1.0.0.tgz", - "integrity": "sha512-Yz3exbptZwOn4ZD/MSwY6z++XVyOFsMh5DERvSw3awRwJFnfdaqdeiIxxX0MVjM6KPihF0xxp8lPO7vTc5ydpw==" - }, - "node_modules/@databases/pg-schema-cli": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@databases/pg-schema-cli/-/pg-schema-cli-4.4.0.tgz", - "integrity": "sha512-pwLEjFrPl8Gk+7KmSbHHW9kYnUIWN9/V8DCb9Gwee7hXRkZeEZg9thdprG/ngxIdf983MfHyA/8np78IyNyhqg==", - "dependencies": { - "@databases/pg-config": "^3.2.0", - "@databases/pg-schema-introspect": "^4.2.0", - "@databases/pg-schema-print-types": "^4.5.0", - "chalk": "^4.1.0", - "interrogator": "^2.0.0", - "is-interactive": "^1.0.0", - "parameter-reducers": "^2.0.0" - }, - "bin": { - "pg-schema": "lib/cli.js" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@databases/pg-schema-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@databases/pg-schema-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@databases/pg-schema-introspect": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@databases/pg-schema-introspect/-/pg-schema-introspect-4.2.0.tgz", - "integrity": "sha512-WaN79kbMwiQCS78XlCVOPE+Q6Go2gF3FNqatGWUZHnbHn+NR8I/5/1uC7T8HTruC5UfTe3CcCNPUglVad2YoVg==", - "dependencies": { - "@databases/pg": "^5.5.0" - } - }, - "node_modules/@databases/pg-schema-print-types": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@databases/pg-schema-print-types/-/pg-schema-print-types-4.5.0.tgz", - "integrity": "sha512-HlCHVPuu+qm1oNgkp+v3exdvmeJxflZnDTL6D6eSr3yMSClMQ7JBzCthymazWyZ9s4qsHO6gXfNhgUgjUz6LFw==", - "dependencies": { - "@databases/pg-config": "^3.2.0", - "@databases/pg-data-type-id": "^3.0.0", - "@databases/shared-print-types": "^1.2.0", - "assert-never": "^1.2.1" - }, - "peerDependencies": { - "@databases/pg-schema-introspect": "*" - } - }, - "node_modules/@databases/pg-typed": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@databases/pg-typed/-/pg-typed-4.4.1.tgz", - "integrity": "sha512-7UU7RzVKsB3WUfDm3rMI0x0lw79oNtzGQLTG5tVrpSlUxvHBRaZWm4F6kiov3Wo/HVxtQA+d9trGHcvfGOh+dw==", - "dependencies": { - "@databases/pg-bulk": "^1.2.0" - }, - "peerDependencies": { - "@databases/pg": "*" - } - }, - "node_modules/@databases/push-to-async-iterable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@databases/push-to-async-iterable/-/push-to-async-iterable-3.0.0.tgz", - "integrity": "sha512-xwu/yNgINdMU+fn6UwFsxh+pa6UrVPafY+0qm0RK0/nKyjllfDqSbwK4gSmdmLEwPYxKwch9CAE3P8NxN1hPSg==", - "dependencies": { - "@databases/queue": "^1.0.0" - } - }, - "node_modules/@databases/queue": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@databases/queue/-/queue-1.0.1.tgz", - "integrity": "sha512-dqRU+/aQ4lhFzjPIkIhjB0+UEKMb76FoBgHOJUTcEblgatr/IhdhHliT3VVwcImXh35Mz297PAXE4yFM4eYWUQ==" - }, - "node_modules/@databases/shared": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@databases/shared/-/shared-3.1.0.tgz", - "integrity": "sha512-bO1DIYAYDiWOCqVPvBio1JqZQYh4dph2M1av2w/REeFT6WBd64mTrOFlcxKV0CUAYT0UiJsDfPqEfw0/APRzWg==", - "dependencies": { - "@databases/connection-pool": "^1.1.0", - "@databases/lock": "^2.1.0", - "@databases/queue": "^1.0.1", - "@databases/split-sql-query": "^1.0.4", - "@databases/sql": "^3.3.0" - } - }, - "node_modules/@databases/shared-print-types": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@databases/shared-print-types/-/shared-print-types-1.2.0.tgz", - "integrity": "sha512-/TLxh4s1nbMU6fcqZd0u7KXaBvs7/kBDW92kLhkfKqB53vvhdnszOVlrX8G07697qffvtZuF4jLZjKceQcEmDw==", - "dependencies": { - "camelcase": "^6.1.0", - "mkdirp": "^1.0.4", - "pluralize": "^8.0.0", - "uppercamelcase": "^3.0.0" - } - }, - "node_modules/@databases/shared-print-types/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@databases/split-sql-query": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@databases/split-sql-query/-/split-sql-query-1.0.4.tgz", - "integrity": "sha512-lDqDQvH34NNjLs0knaDvL6HKgPtishQlDYHfOkvbAd5VQOEhcDvvmG2zbBuFvS2HQAz5NsyLj5erGaxibkxhvQ==", - "peerDependencies": { - "@databases/sql": "*" - } - }, - "node_modules/@databases/sql": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", - "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==" - }, - "node_modules/@databases/validate-unicode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", - "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==" - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.11.0", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/serialize": "^1.1.2", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.11.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1", - "@emotion/sheet": "^1.2.2", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.1", - "license": "MIT" - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/react": { - "version": "11.11.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.11.0", - "@emotion/cache": "^11.11.0", - "@emotion/serialize": "^1.1.2", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@emotion/utils": "^1.2.1", - "@emotion/weak-memoize": "^0.3.1", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "@emotion/hash": "^0.9.1", - "@emotion/memoize": "^0.8.1", - "@emotion/unitless": "^0.8.1", - "@emotion/utils": "^1.2.1", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "license": "MIT", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.3.1", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", - "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", - "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz", - "integrity": "sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.10.tgz", - "integrity": "sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz", - "integrity": "sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz", - "integrity": "sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz", - "integrity": "sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz", - "integrity": "sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", - "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", - "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", - "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", - "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", - "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", - "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", - "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", - "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", - "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", - "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", - "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", - "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", - "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", - "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", - "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.5.0", - "license": "MIT", - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@fastify/deepmerge": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/@fastify/error": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", - "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==" - }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "fast-json-stringify": "^5.7.0" - } - }, - "node_modules/@fastify/sensible": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", - "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", - "dependencies": { - "@lukeed/ms": "^2.0.1", - "fast-deep-equal": "^3.1.1", - "fastify-plugin": "^4.0.0", - "forwarded": "^0.2.0", - "http-errors": "^2.0.0", - "type-is": "^1.6.18", - "vary": "^1.1.2" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.4.1", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.1.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.4.1", - "@floating-ui/utils": "^0.1.1" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/@hello-pangea/dnd": { - "version": "16.3.0", - "license": "Apache-2.0", - "dependencies": { - "@babel/runtime": "^7.22.5", - "css-box-model": "^1.2.1", - "memoize-one": "^6.0.0", - "raf-schd": "^4.0.3", - "react-redux": "^8.1.1", - "redux": "^4.2.1", - "use-memo-one": "^1.1.3" - }, - "peerDependencies": { - "react": "^16.8.5 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@hutson/parse-repository-url": { - "version": "3.0.2", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@hypnosphi/create-react-context": { - "version": "0.3.1", - "license": "MIT", - "dependencies": { - "gud": "^1.0.0", - "warning": "^4.0.3" - }, - "peerDependencies": { - "prop-types": "^15.0.0", - "react": ">=0.14.0" - } - }, - "node_modules/@inquirer/figures": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", - "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsdoc/salty": { - "version": "0.2.5", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=v12.0.0" - } - }, - "node_modules/@lukeed/ms": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.1.tgz", - "integrity": "sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@opentelemetry/api-logs": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", - "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", - "dependencies": { - "@opentelemetry/api": "^1.0.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", - "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", - "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", - "dependencies": { - "@opentelemetry/api-logs": "0.52.1", - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "^1.8.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-connect": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", - "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/connect": "3.4.36" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-express": { - "version": "0.41.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", - "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fastify": { - "version": "0.38.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", - "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-fs": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", - "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-graphql": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", - "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-hapi": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", - "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-http": { - "version": "0.52.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", - "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/instrumentation": "0.52.1", - "@opentelemetry/semantic-conventions": "1.25.1", - "semver": "^7.5.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-ioredis": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", - "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-koa": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", - "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongodb": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", - "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/sdk-metrics": "^1.9.1", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mongoose": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.40.0.tgz", - "integrity": "sha512-niRi5ZUnkgzRhIGMOozTyoZIvJKNJyhijQI4nF4iFSb+FUx2v5fngfR+8XLmdQAO7xmsD8E5vEGdDVYVtKbZew==", - "dependencies": { - "@opentelemetry/core": "^1.8.0", - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", - "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@types/mysql": "2.15.22" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-mysql2": { - "version": "0.40.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", - "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-nestjs-core": { - "version": "0.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", - "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.23.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg": { - "version": "0.43.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", - "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/semantic-conventions": "^1.22.0", - "@opentelemetry/sql-common": "^0.40.1", - "@types/pg": "8.6.1", - "@types/pg-pool": "2.0.4" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { - "version": "8.6.1", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", - "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@opentelemetry/instrumentation-redis-4": { - "version": "0.41.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.0.tgz", - "integrity": "sha512-H7IfGTqW2reLXqput4yzAe8YpDC0fmVNal95GHMLOrS89W+qWUKIqxolSh63hJyfmwPSFwXASzj7wpSk8Az+Dg==", - "dependencies": { - "@opentelemetry/instrumentation": "^0.52.0", - "@opentelemetry/redis-common": "^0.36.2", - "@opentelemetry/semantic-conventions": "^1.22.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/@opentelemetry/redis-common": { - "version": "0.36.2", - "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", - "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", - "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@opentelemetry/sql-common": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", - "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", - "dependencies": { - "@opentelemetry/core": "^1.1.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@prisma/instrumentation": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.17.0.tgz", - "integrity": "sha512-c1Sle4ji8aasMcYfBBHFM56We4ljfenVtRmS8aY06BllS7SoU6SmJBwG7vil+GHiR0Yrh+t9iBwt4AY0Jr4KNQ==", - "dependencies": { - "@opentelemetry/api": "^1.8", - "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", - "@opentelemetry/sdk-trace-base": "^1.22" - } - }, - "node_modules/@redux-devtools/extension": { - "version": "3.2.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.7", - "immutable": "^4.2.2" - }, - "peerDependencies": { - "redux": "^3.1.0 || ^4.0.0" - } - }, - "node_modules/@remirror/core-constants": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/@remirror/core-helpers": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "@remirror/types": "^1.0.1", - "@types/object.omit": "^3.0.0", - "@types/object.pick": "^1.3.2", - "@types/throttle-debounce": "^2.1.0", - "case-anything": "^2.1.13", - "dash-get": "^1.0.2", - "deepmerge": "^4.3.1", - "fast-deep-equal": "^3.1.3", - "make-error": "^1.3.6", - "object.omit": "^3.0.0", - "object.pick": "^1.3.0", - "throttle-debounce": "^3.0.1" - } - }, - "node_modules/@remirror/types": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "type-fest": "^2.19.0" - } - }, - "node_modules/@remirror/types/node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@remix-run/router": { - "version": "1.8.0", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.3", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "24.1.0", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "glob": "^8.0.3", - "is-reference": "1.2.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { - "version": "0.27.0", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.3", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/magic-string": { - "version": "0.27.0", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-json": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.1", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.2", - "license": "MIT", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace/node_modules/magic-string": { - "version": "0.27.0", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.3", - "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.4", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", - "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", - "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", - "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", - "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", - "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", - "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", - "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", - "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", - "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", - "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", - "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", - "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", - "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", - "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", - "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", - "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sentry-internal/tracing": { - "version": "7.88.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.88.0.tgz", - "integrity": "sha512-xXQdcYhsS+ourzJHjXNjZC9zakuc97udmpgaXRjEP7FjPYclIx+YXwgFBdHM2kzAwZLFOsEce5dr46GVXUDfZw==", - "dependencies": { - "@sentry/core": "7.88.0", - "@sentry/types": "7.88.0", - "@sentry/utils": "7.88.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/cli": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.23.1.tgz", - "integrity": "sha512-3Tg3qzrdNWQAkuRyXniVhT+aNAwucshw0UKr/J2hxQgA72vxzcZlK4G0+Im9gIFwmzuBaD8jSGVpkzATuCeoNA==", - "dev": true, - "dependencies": { - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.7", - "progress": "^2.0.3", - "proxy-from-env": "^1.1.0", - "which": "^2.0.2" - }, - "bin": { - "sentry-cli": "bin/sentry-cli" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@sentry/cli-darwin": "2.23.1", - "@sentry/cli-linux-arm": "2.23.1", - "@sentry/cli-linux-arm64": "2.23.1", - "@sentry/cli-linux-i686": "2.23.1", - "@sentry/cli-linux-x64": "2.23.1", - "@sentry/cli-win32-i686": "2.23.1", - "@sentry/cli-win32-x64": "2.23.1" - } - }, - "node_modules/@sentry/cli-darwin": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.23.1.tgz", - "integrity": "sha512-jSHORd9p/69BmKZRfJXFw4WFYODlw3mH1vBCi8LTWDimR9L3tthlCqYM1v5A26mUACqyNPI3s/6xvw5GOAsIhw==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.23.1.tgz", - "integrity": "sha512-ur7DFWwHXrLRJLa0+vL22Wkr8FC1NIQwo0mfKI+51Y9ijKsfo8R7pO5MPRCYQz0DKR12VPXkq05KPsCNq5AtZQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux", - "freebsd" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-arm64": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.23.1.tgz", - "integrity": "sha512-f6e1x5zudglp8XdgN07hRhX8HVIeiY/dLAcvaV7qPNtZLd9pjsPgS2nyJlPPEC2WgG1FC439t3JmxIhRTjRA9g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux", - "freebsd" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-i686": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.23.1.tgz", - "integrity": "sha512-nm3iDgBwkwAZGkz2Oq44pdh0xdECOq/EumF8mAPA6YS2MKUWGsFQEb5/f6HLnqBULrd88RK1wrEW0eBIuIJs9Q==", - "cpu": [ - "x86", - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux", - "freebsd" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-linux-x64": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.23.1.tgz", - "integrity": "sha512-W8QWaxbkIOW2wpAQ1zUzA7+3bOX8lUu5bPxAfstGLobUtxZcTgydJ+58KCeyE6je/jhgzxu+fieat1bzTUrfdg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux", - "freebsd" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-i686": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.23.1.tgz", - "integrity": "sha512-h8u2OUH9SvWJpRc3f0halzXut7+/BpbLc5eiViPqrcSosmngDSuy0TOGNqwsDW4hpkqm7RcTXWIUhLJcKtFFdA==", - "cpu": [ - "x86", - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/cli-win32-x64": { - "version": "2.23.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.23.1.tgz", - "integrity": "sha512-DG+oyQ1bsG5A7yd3c+gt2aD6V3IsR+mutV6h1QYQ9Y8PoloGhOWmt/fnZ5CT20/HyzejykMfASnscsJGHmXp4w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@sentry/core": { - "version": "7.88.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.88.0.tgz", - "integrity": "sha512-Jzbb7dcwiCO7kI0a1w+32UzWxbEn2OcZWzp55QMEeAh6nZ/5CXhXwpuHi0tW7doPj+cJdmxMTMu9LqMVfdGkzQ==", - "dependencies": { - "@sentry/types": "7.88.0", - "@sentry/utils": "7.88.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/node": { - "version": "7.88.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.88.0.tgz", - "integrity": "sha512-X6Xyh7AEitnWqn1CHQrmsUqRn0GKj/6nPE5VC2DLQfHiFH1Fknrt+csFzDchQ/86awXYwuY4Le5ECEH//X/WzQ==", - "dependencies": { - "@sentry-internal/tracing": "7.88.0", - "@sentry/core": "7.88.0", - "@sentry/types": "7.88.0", - "@sentry/utils": "7.88.0", - "https-proxy-agent": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/opentelemetry": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.26.0.tgz", - "integrity": "sha512-HBDheM/+ysfIz8R1OH4bBIxdgD7ZbQkKLJAUXkdAbBcfbpK/CTtwcplbauF5wY7Q+GYvwL/ShuDwvXRfW+gFyQ==", - "dependencies": { - "@sentry/core": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1" - } - }, - "node_modules/@sentry/opentelemetry/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/opentelemetry/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/opentelemetry/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "node_modules/@sentry/profiling-node": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-1.3.2.tgz", - "integrity": "sha512-Dm2FmR0+BYrTm3YSmbCxjeklAsXZecOwWarZQdrCQniPYlxS9GPgWv1P+J78+CrHZ4IpoIvnlRppGPMrJwPXkw==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^2.0.2", - "node-abi": "^3.52.0" - }, - "bin": { - "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.mjs" - }, - "engines": { - "node": ">=8.0.0" - }, - "peerDependencies": { - "@sentry/node": "^7.44.1" - } - }, - "node_modules/@sentry/types": { - "version": "7.88.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.88.0.tgz", - "integrity": "sha512-FvwvmX1pWAZKicPj4EpKyho8Wm+C4+r5LiepbbBF8oKwSPJdD2QV1fo/LWxsrzNxWOllFIVIXF5Ed3nPYQWpTw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@sentry/utils": { - "version": "7.88.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.88.0.tgz", - "integrity": "sha512-ukminfRmdBXTzk49orwJf3Lu3hR60ZRHjE2a4IXwYhyDT6JJgJqgsq1hzGXx0AyFfyS4WhfZ6QUBy7fu3BScZQ==", - "dependencies": { - "@sentry/types": "7.88.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@styled-system/background": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/border": { - "version": "5.1.5", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/color": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/core": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.1" - } - }, - "node_modules/@styled-system/css": { - "version": "5.1.5", - "license": "MIT" - }, - "node_modules/@styled-system/flexbox": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/grid": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/layout": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/position": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/shadow": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/space": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/typography": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2" - } - }, - "node_modules/@styled-system/variant": { - "version": "5.1.5", - "license": "MIT", - "dependencies": { - "@styled-system/core": "^5.1.2", - "@styled-system/css": "^5.1.5" - } - }, - "node_modules/@tiptap/core": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-blockquote": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bold": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bubble-menu": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-bullet-list": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-character-count": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-code": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-code-block": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-document": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-dropcursor": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-floating-menu": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "tippy.js": "^6.3.7" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-gapcursor": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-hard-break": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-heading": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-history": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-horizontal-rule": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-image": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-italic": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-link": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "linkifyjs": "^4.1.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-list-item": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-ordered-list": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-paragraph": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-strike": { - "version": "2.1.8", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-table": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-table-cell": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-table-header": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-table-row": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-text-align": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/extension-typography": { - "version": "2.0.1", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/pm": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "prosemirror-changeset": "^2.2.0", - "prosemirror-collab": "^1.3.0", - "prosemirror-commands": "^1.3.1", - "prosemirror-dropcursor": "^1.5.0", - "prosemirror-gapcursor": "^1.3.1", - "prosemirror-history": "^1.3.0", - "prosemirror-inputrules": "^1.2.0", - "prosemirror-keymap": "^1.2.0", - "prosemirror-markdown": "^1.10.1", - "prosemirror-menu": "^1.2.1", - "prosemirror-model": "^1.18.1", - "prosemirror-schema-basic": "^1.2.0", - "prosemirror-schema-list": "^1.2.2", - "prosemirror-state": "^1.4.1", - "prosemirror-tables": "^1.3.0", - "prosemirror-trailing-node": "^2.0.2", - "prosemirror-transform": "^1.7.0", - "prosemirror-view": "^1.28.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0" - } - }, - "node_modules/@tiptap/react": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@tiptap/extension-bubble-menu": "^2.0.1", - "@tiptap/extension-floating-menu": "^2.0.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - }, - "peerDependencies": { - "@tiptap/core": "^2.0.0", - "@tiptap/pm": "^2.0.0", - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, - "node_modules/@tiptap/starter-kit": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "@tiptap/core": "^2.0.1", - "@tiptap/extension-blockquote": "^2.0.1", - "@tiptap/extension-bold": "^2.0.1", - "@tiptap/extension-bullet-list": "^2.0.1", - "@tiptap/extension-code": "^2.0.1", - "@tiptap/extension-code-block": "^2.0.1", - "@tiptap/extension-document": "^2.0.1", - "@tiptap/extension-dropcursor": "^2.0.1", - "@tiptap/extension-gapcursor": "^2.0.1", - "@tiptap/extension-hard-break": "^2.0.1", - "@tiptap/extension-heading": "^2.0.1", - "@tiptap/extension-history": "^2.0.1", - "@tiptap/extension-horizontal-rule": "^2.0.1", - "@tiptap/extension-italic": "^2.0.1", - "@tiptap/extension-list-item": "^2.0.1", - "@tiptap/extension-ordered-list": "^2.0.1", - "@tiptap/extension-paragraph": "^2.0.1", - "@tiptap/extension-strike": "^2.0.1", - "@tiptap/extension-text": "^2.0.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/ueberdosis" - } - }, - "node_modules/@tsconfig/node-lts": { - "version": "20.1.0", - "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-20.1.0.tgz", - "integrity": "sha512-3w2D9MfGdqBL51pHB5nGFmGtXBn1gbO+n9xzwcGSvZPArtCn4tElk+6EeelLXispAeqv13GAgbzkgLNHtoxOCQ==", - "dev": true - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@tsconfig/node20": { - "version": "20.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.8", - "license": "MIT", - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/linkify-it": { - "version": "3.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/markdown-it": { - "version": "12.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/linkify-it": "*", - "@types/mdurl": "*" - } - }, - "node_modules/@types/mdurl": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "0.7.31", - "license": "MIT" - }, - "node_modules/@types/mysql": { - "version": "2.15.22", - "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", - "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/node": { - "version": "20.10.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", - "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/object.omit": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/@types/object.pick": { - "version": "1.3.2", - "license": "MIT" - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/@types/pg": { - "version": "8.11.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", - "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^4.0.1" - } - }, - "node_modules/@types/pg-pool": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", - "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", - "dependencies": { - "@types/pg": "*" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.5", - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.2.21", - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.6", - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "license": "MIT" - }, - "node_modules/@types/scheduler": { - "version": "0.16.3", - "license": "MIT" - }, - "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", - "dev": true - }, - "node_modules/@types/shimmer": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", - "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" - }, - "node_modules/@types/sinon": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz", - "integrity": "sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinon-chai": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", - "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", - "dev": true, - "dependencies": { - "@types/chai": "*", - "@types/sinon": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/throttle-debounce": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/@types/validator": { - "version": "13.11.1", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", - "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/type-utils": "6.15.0", - "@typescript-eslint/utils": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", - "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", - "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", - "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "6.15.0", - "@typescript-eslint/utils": "6.15.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", - "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", - "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/visitor-keys": "6.15.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", - "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.15.0", - "@typescript-eslint/types": "6.15.0", - "@typescript-eslint/typescript-estree": "6.15.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", - "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.15.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitest/coverage-v8": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", - "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "debug": "^4.3.4", - "istanbul-lib-coverage": "^3.2.2", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^5.0.4", - "istanbul-reports": "^3.1.6", - "magic-string": "^0.30.5", - "magicast": "^0.3.3", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "test-exclude": "^6.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "vitest": "1.6.0" - } - }, - "node_modules/@vitest/expect": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", - "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", - "dependencies": { - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "chai": "^4.3.10" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", - "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", - "dependencies": { - "@vitest/utils": "1.6.0", - "p-limit": "^5.0.0", - "pathe": "^1.1.1" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", - "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@vitest/snapshot": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", - "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", - "dependencies": { - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", - "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", - "dependencies": { - "tinyspy": "^2.2.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", - "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", - "dependencies": { - "diff-sequences": "^29.6.3", - "estree-walker": "^3.0.3", - "loupe": "^2.3.7", - "pretty-format": "^29.7.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/abstract-logging": { - "version": "2.0.1", - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "optional": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", - "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/add-stream": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/adminjs": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/adminjs/-/adminjs-7.5.2.tgz", - "integrity": "sha512-Gx80srhJSkxLp16BrLl+A3EdsOFmT7ewxw0DNWHchLs3MxV5JNgx69u5NtmFPKspAoKo86ouITpO5JzPyKBFPA==", - "dependencies": { - "@adminjs/design-system": "^4.0.0", - "@babel/core": "^7.21.0", - "@babel/parser": "^7.21.0", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-transform-runtime": "^7.21.0", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@babel/register": "^7.21.0", - "@hello-pangea/dnd": "^16.2.0", - "@redux-devtools/extension": "^3.2.5", - "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-commonjs": "^24.0.1", - "@rollup/plugin-json": "^6.0.0", - "@rollup/plugin-node-resolve": "^15.0.1", - "@rollup/plugin-replace": "^5.0.2", - "@rollup/plugin-terser": "^0.4.0", - "axios": "^1.3.4", - "commander": "^10.0.0", - "flat": "^5.0.2", - "i18next": "^22.4.13", - "i18next-browser-languagedetector": "^7.0.1", - "i18next-http-backend": "^2.2.0", - "lodash": "^4.17.21", - "ora": "^6.2.0", - "prop-types": "^15.8.1", - "punycode": "^2.3.0", - "qs": "^6.11.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-feather": "^2.0.10", - "react-i18next": "^12.2.0", - "react-is": "^18.2.0", - "react-redux": "^8.0.5", - "react-router": "^6.9.0", - "react-router-dom": "^6.9.0", - "redux": "^4.2.1", - "rollup": "^3.15.0", - "rollup-plugin-polyfill-node": "^0.12.0", - "slash": "^5.0.0", - "uuid": "^9.0.0", - "xss": "^1.0.14" - }, - "bin": { - "admin": "cli.js" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/ansi-escapes": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", - "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", - "dev": true, - "dependencies": { - "type-fest": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "license": "Python-2.0" - }, - "node_modules/array-ify": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assert-never": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.3.0.tgz", - "integrity": "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==" - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/atomic-sleep": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", - "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/avvio": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", - "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", - "dependencies": { - "@fastify/error": "^3.3.0", - "fastq": "^1.17.1" - } - }, - "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "license": "MIT", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "license": "MIT", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.51", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bl": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "dev": true, - "license": "MIT" - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.21.10", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001517", - "electron-to-chromium": "^1.4.477", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.11" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "license": "MIT" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001528", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/case-anything": { - "version": "2.1.13", - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/catharsis": { - "version": "0.9.0", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/chai": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", - "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" - }, - "node_modules/classnames": { - "version": "2.3.2", - "license": "MIT" - }, - "node_modules/cli-cursor": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", - "dev": true, - "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", - "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/colorette": { - "version": "2.0.20", - "license": "MIT" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "10.0.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/common-tags": { - "version": "1.8.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/compare-func": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "array-ify": "^1.0.0", - "dot-prop": "^5.1.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "dev": true, - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/conventional-changelog": { - "version": "3.1.25", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-changelog-angular": "^5.0.12", - "conventional-changelog-atom": "^2.0.8", - "conventional-changelog-codemirror": "^2.0.8", - "conventional-changelog-conventionalcommits": "^4.5.0", - "conventional-changelog-core": "^4.2.1", - "conventional-changelog-ember": "^2.0.9", - "conventional-changelog-eslint": "^3.0.9", - "conventional-changelog-express": "^2.0.6", - "conventional-changelog-jquery": "^3.0.11", - "conventional-changelog-jshint": "^2.0.9", - "conventional-changelog-preset-loader": "^2.3.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-angular": { - "version": "5.0.13", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-atom": { - "version": "2.0.8", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-codemirror": { - "version": "2.0.8", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-config-spec": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/conventional-changelog-conventionalcommits": { - "version": "4.6.3", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "lodash": "^4.17.15", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-core": { - "version": "4.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "add-stream": "^1.0.0", - "conventional-changelog-writer": "^5.0.0", - "conventional-commits-parser": "^3.2.0", - "dateformat": "^3.0.0", - "get-pkg-repo": "^4.0.0", - "git-raw-commits": "^2.0.8", - "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^4.1.1", - "lodash": "^4.17.15", - "normalize-package-data": "^3.0.0", - "q": "^1.5.1", - "read-pkg": "^3.0.0", - "read-pkg-up": "^3.0.0", - "through2": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-ember": { - "version": "2.0.9", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-eslint": { - "version": "3.0.9", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-express": { - "version": "2.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jquery": { - "version": "3.0.11", - "dev": true, - "license": "ISC", - "dependencies": { - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-jshint": { - "version": "2.0.9", - "dev": true, - "license": "ISC", - "dependencies": { - "compare-func": "^2.0.0", - "q": "^1.5.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-preset-loader": { - "version": "2.3.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "conventional-commits-filter": "^2.0.7", - "dateformat": "^3.0.0", - "handlebars": "^4.7.7", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "semver": "^6.0.0", - "split": "^1.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-changelog-writer": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/conventional-commits-filter": { - "version": "2.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.ismatch": "^4.4.0", - "modify-values": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser": { - "version": "3.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-text-path": "^1.0.1", - "JSONStream": "^1.0.4", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "conventional-commits-parser": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/conventional-commits-parser/node_modules/split2": { - "version": "3.2.2", - "dev": true, - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/conventional-recommended-bump": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "concat-stream": "^2.0.0", - "conventional-changelog-preset-loader": "^2.3.4", - "conventional-commits-filter": "^2.0.7", - "conventional-commits-parser": "^3.2.0", - "git-raw-commits": "^2.0.8", - "git-semver-tags": "^4.1.1", - "meow": "^8.0.0", - "q": "^1.5.1" - }, - "bin": { - "conventional-recommended-bump": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/core-js-compat": { - "version": "3.32.2", - "license": "MIT", - "dependencies": { - "browserslist": "^4.21.10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/crelt": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/cross-fetch": { - "version": "3.1.6", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.11" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-box-model": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "tiny-invariant": "^1.0.6" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/cssfilter": { - "version": "0.0.10", - "license": "MIT" - }, - "node_modules/csstype": { - "version": "3.1.2", - "license": "MIT" - }, - "node_modules/dargs": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dash-get": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/date-fns": { - "version": "2.30.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-eql": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", - "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defaults": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-libc": { - "version": "2.0.2", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotgitignore": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "find-up": "^3.0.0", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/find-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/locate-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotgitignore/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dotgitignore/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/dottie": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.510", - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "3.0.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/esbuild": { - "version": "0.19.10", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.10.tgz", - "integrity": "sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.10", - "@esbuild/android-arm": "0.19.10", - "@esbuild/android-arm64": "0.19.10", - "@esbuild/android-x64": "0.19.10", - "@esbuild/darwin-arm64": "0.19.10", - "@esbuild/darwin-x64": "0.19.10", - "@esbuild/freebsd-arm64": "0.19.10", - "@esbuild/freebsd-x64": "0.19.10", - "@esbuild/linux-arm": "0.19.10", - "@esbuild/linux-arm64": "0.19.10", - "@esbuild/linux-ia32": "0.19.10", - "@esbuild/linux-loong64": "0.19.10", - "@esbuild/linux-mips64el": "0.19.10", - "@esbuild/linux-ppc64": "0.19.10", - "@esbuild/linux-riscv64": "0.19.10", - "@esbuild/linux-s390x": "0.19.10", - "@esbuild/linux-x64": "0.19.10", - "@esbuild/netbsd-x64": "0.19.10", - "@esbuild/openbsd-x64": "0.19.10", - "@esbuild/sunos-x64": "0.19.10", - "@esbuild/win32-arm64": "0.19.10", - "@esbuild/win32-ia32": "0.19.10", - "@esbuild/win32-x64": "0.19.10" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-regexp": { - "version": "0.0.1" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.1.tgz", - "integrity": "sha512-WQpV3mSmIobb77s4qiCZu3dBrZZ0rj8ckSfBtRrgNK9Wnh2s3eiaxNTWloz1LJ1WtvqZES/PAI7PLvsrGt/CEA==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/esutils": { - "version": "2.0.3", - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/external-editor/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-content-type-parse": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", - "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" - }, - "node_modules/fast-copy": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", - "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" - }, - "node_modules/fast-decode-uri-component": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", - "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stringify": { - "version": "5.8.0", - "license": "MIT", - "dependencies": { - "@fastify/deepmerge": "^1.0.0", - "ajv": "^8.10.0", - "ajv-formats": "^2.1.1", - "fast-deep-equal": "^3.1.3", - "fast-uri": "^2.1.0", - "rfdc": "^1.2.0" - } - }, - "node_modules/fast-json-stringify/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-querystring": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", - "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", - "dependencies": { - "fast-decode-uri-component": "^1.0.1" - } - }, - "node_modules/fast-redact": { - "version": "3.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "node_modules/fast-uri": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/fastify": { - "version": "4.28.1", - "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", - "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "dependencies": { - "@fastify/ajv-compiler": "^3.5.0", - "@fastify/error": "^3.4.0", - "@fastify/fast-json-stringify-compiler": "^4.3.0", - "abstract-logging": "^2.0.1", - "avvio": "^8.3.0", - "fast-content-type-parse": "^1.1.0", - "fast-json-stringify": "^5.8.0", - "find-my-way": "^8.0.0", - "light-my-request": "^5.11.0", - "pino": "^9.0.0", - "process-warning": "^3.0.0", - "proxy-addr": "^2.0.7", - "rfdc": "^1.3.0", - "secure-json-parse": "^2.7.0", - "semver": "^7.5.4", - "toad-cache": "^3.3.0" - } - }, - "node_modules/fastify-plugin": { - "version": "4.5.1", - "license": "MIT" - }, - "node_modules/fastify/node_modules/pino": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", - "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.2.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/fastify/node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/fastify/node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" - }, - "node_modules/fastify/node_modules/pino/node_modules/process-warning": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" - }, - "node_modules/fastify/node_modules/process-warning": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", - "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" - }, - "node_modules/fastify/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/fastify/node_modules/sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/fastify/node_modules/thread-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-cache-dir": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-my-way": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", - "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-querystring": "^1.0.0", - "safe-regex2": "^3.1.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/find-up": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.7", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/funtypes": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/funtypes/-/funtypes-4.2.0.tgz", - "integrity": "sha512-DvOtjiKvkeuXGV0O8LQh9quUP3bSOTEQPGv537Sao8kDq2rDbg48UsSJ7wlBLPzR2Mn0pV7cyAiq5pYG1oUyCQ==" - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-east-asian-width": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", - "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-pkg-repo": { - "version": "4.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@hutson/parse-repository-url": "^3.0.0", - "hosted-git-info": "^4.0.0", - "through2": "^2.0.0", - "yargs": "^16.2.0" - }, - "bin": { - "get-pkg-repo": "src/cli.js" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-pkg-repo/node_modules/readable-stream": { - "version": "2.3.8", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/get-pkg-repo/node_modules/safe-buffer": { - "version": "5.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/get-pkg-repo/node_modules/string_decoder": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/get-pkg-repo/node_modules/through2": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/git-raw-commits": { - "version": "2.0.11", - "dev": true, - "license": "MIT", - "dependencies": { - "dargs": "^7.0.0", - "lodash": "^4.17.15", - "meow": "^8.0.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "git-raw-commits": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-raw-commits/node_modules/split2": { - "version": "3.2.2", - "dev": true, - "license": "ISC", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/git-remote-origin-url": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "gitconfiglocal": "^1.0.0", - "pify": "^2.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/git-remote-origin-url/node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/git-semver-tags": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "meow": "^8.0.0", - "semver": "^6.0.0" - }, - "bin": { - "git-semver-tags": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/gitconfiglocal": { - "version": "1.0.0", - "dev": true, - "license": "BSD", - "dependencies": { - "ini": "^1.3.2" - } - }, - "node_modules/glob": { - "version": "8.1.0", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/gud": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/help-me": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", - "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/hosted-git-info": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "void-elements": "3.1.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "4.3.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/husky": { - "version": "8.0.3", - "dev": true, - "license": "MIT", - "bin": { - "husky": "lib/bin.js" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/typicode" - } - }, - "node_modules/i18next": { - "version": "22.5.1", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.6" - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.19.4" - } - }, - "node_modules/i18next-http-backend": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "cross-fetch": "3.1.6" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immutable": { - "version": "4.3.4", - "license": "MIT" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-in-the-middle": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", - "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-attributes": "^1.9.5", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflection": { - "version": "1.13.4", - "engines": [ - "node >= 0.4.0" - ], - "license": "MIT" - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "dev": true, - "license": "ISC" - }, - "node_modules/inquirer": { - "version": "9.3.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.6.tgz", - "integrity": "sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==", - "dependencies": { - "@inquirer/figures": "^1.0.3", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/inquirer/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/inquirer/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/inquirer/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/inquirer/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/interrogator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/interrogator/-/interrogator-2.0.1.tgz", - "integrity": "sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==", - "dependencies": { - "inquirer": "^9.1.4" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extendable": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-interactive": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" - }, - "node_modules/is-reference": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-text-path": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "text-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "1.3.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js2xmlparser": { - "version": "4.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "xmlcreate": "^2.0.4" - } - }, - "node_modules/jsdoc": { - "version": "4.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@babel/parser": "^7.20.15", - "@jsdoc/salty": "^0.2.1", - "@types/markdown-it": "^12.2.3", - "bluebird": "^3.7.2", - "catharsis": "^0.9.0", - "escape-string-regexp": "^2.0.0", - "js2xmlparser": "^4.0.2", - "klaw": "^3.0.0", - "markdown-it": "^12.3.2", - "markdown-it-anchor": "^8.4.1", - "marked": "^4.0.10", - "mkdirp": "^1.0.4", - "requizzle": "^0.2.3", - "strip-json-comments": "^3.1.0", - "underscore": "~1.13.2" - }, - "bin": { - "jsdoc": "jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsdoc/node_modules/entities": { - "version": "2.1.0", - "dev": true, - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/jsdoc/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jsdoc/node_modules/linkify-it": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/jsdoc/node_modules/markdown-it": { - "version": "12.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~2.1.0", - "linkify-it": "^3.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/json5": { - "version": "2.2.3", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "dev": true, - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "dev": true, - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/jw-paginate": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/keyv": { - "version": "4.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/light-my-request": { - "version": "5.11.0", - "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", - "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", - "dependencies": { - "cookie": "^0.5.0", - "process-warning": "^2.0.0", - "set-cookie-parser": "^2.4.1" - } - }, - "node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "node_modules/linkify-it": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "uc.micro": "^1.0.1" - } - }, - "node_modules/linkifyjs": { - "version": "4.1.1", - "license": "MIT" - }, - "node_modules/lint-staged": { - "version": "15.2.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", - "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.0", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" - }, - "bin": { - "lint-staged": "bin/lint-staged.js" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://opencollective.com/lint-staged" - } - }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "dev": true, - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, - "node_modules/lint-staged/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/lint-staged/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lint-staged/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/lint-staged/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/listr2": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", - "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", - "dev": true, - "dependencies": { - "cli-truncate": "^4.0.0", - "colorette": "^2.0.20", - "eventemitter3": "^5.0.1", - "log-update": "^6.0.0", - "rfdc": "^1.3.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/listr2/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/listr2/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/listr2/node_modules/string-width": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", - "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/listr2/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/local-pkg": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", - "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dependencies": { - "mlly": "^1.4.2", - "pkg-types": "^1.0.3" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "license": "MIT" - }, - "node_modules/lodash.ismatch": { - "version": "4.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "license": "MIT" - }, - "node_modules/lodash.reduce": { - "version": "4.6.0", - "license": "MIT" - }, - "node_modules/lodash.startswith": { - "version": "4.2.1", - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-update": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", - "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", - "dev": true, - "dependencies": { - "ansi-escapes": "^6.2.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^7.0.0", - "strip-ansi": "^7.1.0", - "wrap-ansi": "^9.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "is-fullwidth-code-point": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/string-width": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", - "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", - "dev": true, - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/loglevel": { - "version": "1.8.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - }, - "funding": { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/loglevel" - } - }, - "node_modules/loglevel-colored-level-prefix": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^1.1.3", - "loglevel": "^1.4.1" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { - "version": "2.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.5", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", - "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/magicast": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", - "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.24.4", - "@babel/types": "^7.24.0", - "source-map-js": "^1.2.0" - } - }, - "node_modules/make-dir": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "5.7.2", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "license": "ISC" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-it": { - "version": "13.0.1", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "~3.0.1", - "linkify-it": "^4.0.1", - "mdurl": "^1.0.1", - "uc.micro": "^1.0.5" - }, - "bin": { - "markdown-it": "bin/markdown-it.js" - } - }, - "node_modules/markdown-it-anchor": { - "version": "8.6.7", - "dev": true, - "license": "Unlicense", - "peerDependencies": { - "@types/markdown-it": "*", - "markdown-it": "*" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/mdurl": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "license": "MIT" - }, - "node_modules/meow": { - "version": "8.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/meow/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } - }, - "node_modules/meow/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlly": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", - "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", - "dependencies": { - "acorn": "^8.10.0", - "pathe": "^1.1.1", - "pkg-types": "^1.0.3", - "ufo": "^1.3.0" - } - }, - "node_modules/modify-values": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/module-details-from-path": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", - "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" - }, - "node_modules/moment": { - "version": "2.29.4", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.43", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/neo-async": { - "version": "2.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/node-abi": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.66.0.tgz", - "integrity": "sha512-J3ygyG8cTcn5TVzpHYEBE6zHN4uVoj6wKMS946b19VYGhVpGgR5mB3OK2oBTe0l3Bpsj5/h+TAblq0K8Ec9cRQ==", - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "license": "MIT" - }, - "node_modules/normalize-package-data": { - "version": "3.0.3", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "license": "MIT", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.omit": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "is-extendable": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-exit-leak-free": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "license": "MIT", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "9.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opentelemetry-instrumentation-fetch-node": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.3.tgz", - "integrity": "sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==", - "optional": true, - "dependencies": { - "@opentelemetry/instrumentation": "^0.46.0", - "@opentelemetry/semantic-conventions": "^1.17.0" - }, - "engines": { - "node": ">18.0.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.6.0" - } - }, - "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { - "version": "0.46.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz", - "integrity": "sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==", - "optional": true, - "dependencies": { - "@types/shimmer": "^1.0.2", - "import-in-the-middle": "1.7.1", - "require-in-the-middle": "^7.1.1", - "semver": "^7.5.2", - "shimmer": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", - "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", - "optional": true, - "dependencies": { - "acorn": "^8.8.2", - "acorn-import-assertions": "^1.9.0", - "cjs-module-lexer": "^1.2.2", - "module-details-from-path": "^1.0.3" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ora": { - "version": "6.3.1", - "license": "MIT", - "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "5.3.0", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ora/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/orderedmap": { - "version": "2.1.1", - "license": "MIT" - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/parameter-reducers": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parameter-reducers/-/parameter-reducers-2.1.0.tgz", - "integrity": "sha512-aj9V6DUnNbj4YEmVxloPLX9duhklIC+SIOVUrVdaT3WfgEownET+TYg/JsjANQUNGe46dmOCHEKiuycL36cOnw==" - }, - "node_modules/parent-module": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT" - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.0.1", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", - "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pg": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", - "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", - "dependencies": { - "pg-connection-string": "^2.6.4", - "pg-pool": "^3.6.2", - "pg-protocol": "^1.6.1", - "pg-types": "^2.1.0", - "pgpass": "1.x" - }, - "engines": { - "node": ">= 8.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.1.1" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", - "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", - "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" - }, - "node_modules/pg-cursor": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.11.0.tgz", - "integrity": "sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==", - "peerDependencies": { - "pg": "^8" - } - }, - "node_modules/pg-hstore": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz", - "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==", - "dependencies": { - "underscore": "^1.13.1" - }, - "engines": { - "node": ">= 0.8.x" - } - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-numeric": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", - "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg-pool": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", - "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", - "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" - }, - "node_modules/pg-types": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", - "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", - "dependencies": { - "pg-int8": "1.0.1", - "pg-numeric": "1.0.2", - "postgres-array": "~3.0.1", - "postgres-bytea": "~3.0.0", - "postgres-date": "~2.1.0", - "postgres-interval": "^3.0.0", - "postgres-range": "^1.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/pg/node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/pg/node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg/node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pg/node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/pino": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", - "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "v1.1.0", - "pino-std-serializers": "^6.0.0", - "process-warning": "^2.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^3.7.0", - "thread-stream": "^2.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "node_modules/pino-abstract-transport": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", - "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "node_modules/pino-abstract-transport/node_modules/readable-stream": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", - "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-pretty": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", - "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", - "dependencies": { - "colorette": "^2.0.7", - "dateformat": "^4.6.3", - "fast-copy": "^3.0.2", - "fast-safe-stringify": "^2.1.1", - "help-me": "^5.0.0", - "joycon": "^3.1.1", - "minimist": "^1.2.6", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.0.0", - "pump": "^3.0.0", - "readable-stream": "^4.0.0", - "secure-json-parse": "^2.4.0", - "sonic-boom": "^4.0.1", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "pino-pretty": "bin.js" - } - }, - "node_modules/pino-pretty/node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "engines": { - "node": "*" - } - }, - "node_modules/pino-pretty/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/pino-pretty/node_modules/sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/pino-std-serializers": { - "version": "6.2.2", - "license": "MIT" - }, - "node_modules/pirates": { - "version": "4.0.6", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/pkg-types": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", - "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dependencies": { - "jsonc-parser": "^3.2.0", - "mlly": "^1.2.0", - "pathe": "^1.1.0" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/polished": { - "version": "4.2.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.17.8" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss": { - "version": "8.4.41", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", - "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.1", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/postgres-array": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", - "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-bytea": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", - "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", - "dependencies": { - "obuf": "~1.1.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postgres-date": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", - "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-interval": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", - "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/postgres-range": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", - "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", - "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-eslint": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.2.0.tgz", - "integrity": "sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==", - "dev": true, - "dependencies": { - "@typescript-eslint/parser": "^6.7.5", - "common-tags": "^1.4.0", - "dlv": "^1.1.0", - "eslint": "^8.7.0", - "indent-string": "^4.0.0", - "lodash.merge": "^4.6.0", - "loglevel-colored-level-prefix": "^1.0.0", - "prettier": "^3.0.1", - "pretty-format": "^29.7.0", - "require-relative": "^0.8.7", - "typescript": "^5.2.2", - "vue-eslint-parser": "^9.1.0" - }, - "engines": { - "node": ">=16.10.0" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/process-warning": { - "version": "2.2.0", - "license": "MIT" - }, - "node_modules/progress": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "license": "MIT" - }, - "node_modules/prosemirror-changeset": { - "version": "2.2.1", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-collab": { - "version": "1.3.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.5.2", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.0.0", - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-view": "^1.0.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.3.2", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.2.2", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.31.0", - "rope-sequence": "^1.3.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-markdown": { - "version": "1.11.2", - "license": "MIT", - "dependencies": { - "markdown-it": "^13.0.1", - "prosemirror-model": "^1.0.0" - } - }, - "node_modules/prosemirror-menu": { - "version": "1.2.4", - "license": "MIT", - "dependencies": { - "crelt": "^1.0.0", - "prosemirror-commands": "^1.0.0", - "prosemirror-history": "^1.0.0", - "prosemirror-state": "^1.0.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.19.3", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-basic": { - "version": "1.2.2", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.19.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.3", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.3.4", - "license": "MIT", - "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" - } - }, - "node_modules/prosemirror-trailing-node": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "@remirror/core-constants": "^2.0.2", - "@remirror/core-helpers": "^3.0.0", - "escape-string-regexp": "^4.0.0" - }, - "peerDependencies": { - "prosemirror-model": "^1.19.0", - "prosemirror-state": "^1.4.2", - "prosemirror-view": "^1.31.2" - } - }, - "node_modules/prosemirror-trailing-node/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.7.5", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.31.7", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.16.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/q": { - "version": "1.5.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.0", - "teleport": ">=0.2.0" - } - }, - "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/quick-format-unescaped": { - "version": "4.0.4", - "license": "MIT" - }, - "node_modules/quick-lru": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/raf-schd": { - "version": "4.0.3", - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-currency-input-field": { - "version": "3.6.11", - "license": "MIT", - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-datepicker": { - "version": "4.16.0", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.11.8", - "classnames": "^2.2.6", - "date-fns": "^2.30.0", - "prop-types": "^15.7.2", - "react-onclickoutside": "^6.12.2", - "react-popper": "^2.3.0" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17 || ^18", - "react-dom": "^16.9.0 || ^17 || ^18" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-fast-compare": { - "version": "3.2.2", - "license": "MIT" - }, - "node_modules/react-feather": { - "version": "2.0.10", - "license": "MIT", - "dependencies": { - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": ">=16.8.6" - } - }, - "node_modules/react-i18next": { - "version": "12.3.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.6", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 19.0.0", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "license": "MIT" - }, - "node_modules/react-onclickoutside": { - "version": "6.13.0", - "license": "MIT", - "funding": { - "type": "individual", - "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" - }, - "peerDependencies": { - "react": "^15.5.x || ^16.x || ^17.x || ^18.x", - "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" - } - }, - "node_modules/react-phone-input-2": { - "version": "2.15.1", - "license": "MIT", - "dependencies": { - "classnames": "^2.2.6", - "lodash.debounce": "^4.0.8", - "lodash.memoize": "^4.1.2", - "lodash.reduce": "^4.6.0", - "lodash.startswith": "^4.2.1", - "prop-types": "^15.7.2" - }, - "peerDependencies": { - "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0", - "react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0" - } - }, - "node_modules/react-popper": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-redux": { - "version": "8.1.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-router": { - "version": "6.15.0", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.8.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.15.0", - "license": "MIT", - "dependencies": { - "@remix-run/router": "1.8.0", - "react-router": "6.15.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-select": { - "version": "5.7.4", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.1.2" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-text-mask": { - "version": "5.5.0", - "license": "Unlicense", - "dependencies": { - "prop-types": "^15.5.6" - }, - "peerDependencies": { - "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "license": "BSD-3-Clause", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-pkg": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/p-try": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "dev": true, - "license": "ISC" - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/pify": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/real-require": { - "version": "0.2.0", - "license": "MIT", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "license": "MIT" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "license": "MIT" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "license": "MIT", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "license": "BSD-2-Clause", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-in-the-middle": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", - "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", - "dependencies": { - "debug": "^4.3.5", - "module-details-from-path": "^1.0.3", - "resolve": "^1.22.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/require-in-the-middle/node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/require-relative": { - "version": "0.8.7", - "dev": true, - "license": "MIT" - }, - "node_modules/requizzle": { - "version": "0.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/restore-cursor": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ret": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", - "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry-as-promised": { - "version": "7.0.4", - "license": "MIT" - }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", - "dev": true, - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "3.29.0", - "license": "MIT", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-polyfill-node": { - "version": "0.12.0", - "license": "MIT", - "dependencies": { - "@rollup/plugin-inject": "^5.0.1" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" - } - }, - "node_modules/rope-sequence": { - "version": "1.3.4", - "license": "MIT" - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/run-applescript/node_modules/is-stream": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rusty-motors-cli": { - "resolved": "packages/cli", - "link": true - }, - "node_modules/rusty-motors-database": { - "resolved": "packages/database", - "link": true - }, - "node_modules/rusty-motors-gateway": { - "resolved": "packages/gateway", - "link": true - }, - "node_modules/rusty-motors-mcots": { - "resolved": "packages/mcots", - "link": true - }, - "node_modules/rusty-motors-nps": { - "resolved": "packages/nps", - "link": true - }, - "node_modules/rusty-motors-patch": { - "resolved": "packages/patch", - "link": true - }, - "node_modules/rusty-motors-server": { - "resolved": "apps/main", - "link": true - }, - "node_modules/rusty-motors-shard": { - "resolved": "packages/shard", - "link": true - }, - "node_modules/rusty-motors-shared": { - "resolved": "packages/shared", - "link": true - }, - "node_modules/rusty-motors-shared-packets": { - "resolved": "packages/shared-packets", - "link": true - }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", - "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", - "dependencies": { - "ret": "~0.4.0" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/scheduler": { - "version": "0.23.0", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/secure-json-parse": { - "version": "2.7.0", - "license": "BSD-3-Clause" - }, - "node_modules/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/sequelize": { - "version": "6.35.2", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", - "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/sequelize" - } - ], - "dependencies": { - "@types/debug": "^4.1.8", - "@types/validator": "^13.7.17", - "debug": "^4.3.4", - "dottie": "^2.0.6", - "inflection": "^1.13.4", - "lodash": "^4.17.21", - "moment": "^2.29.4", - "moment-timezone": "^0.5.43", - "pg-connection-string": "^2.6.1", - "retry-as-promised": "^7.0.4", - "semver": "^7.5.4", - "sequelize-pool": "^7.1.0", - "toposort-class": "^1.0.1", - "uuid": "^8.3.2", - "validator": "^13.9.0", - "wkx": "^0.5.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependenciesMeta": { - "ibm_db": { - "optional": true - }, - "mariadb": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-hstore": { - "optional": true - }, - "snowflake-sdk": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "tedious": { - "optional": true - } - } - }, - "node_modules/sequelize-pool": { - "version": "7.1.0", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/sequelize/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.6.0", - "license": "MIT" - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shimmer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" - }, - "node_modules/short-unique-id": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", - "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", - "bin": { - "short-unique-id": "bin/short-unique-id", - "suid": "bin/short-unique-id" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" - }, - "node_modules/slash": { - "version": "5.1.0", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smob": { - "version": "1.4.0", - "license": "MIT" - }, - "node_modules/sonic-boom": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", - "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "dev": true, - "license": "CC-BY-3.0" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/split": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sqlite": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", - "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==" - }, - "node_modules/stackback": { - "version": "0.0.2", - "license": "MIT" - }, - "node_modules/standard-version": { - "version": "9.5.0", - "dev": true, - "license": "ISC", - "dependencies": { - "chalk": "^2.4.2", - "conventional-changelog": "3.1.25", - "conventional-changelog-config-spec": "2.1.0", - "conventional-changelog-conventionalcommits": "4.6.3", - "conventional-recommended-bump": "6.1.0", - "detect-indent": "^6.0.0", - "detect-newline": "^3.1.0", - "dotgitignore": "^2.1.0", - "figures": "^3.1.0", - "find-up": "^5.0.0", - "git-semver-tags": "^4.0.0", - "semver": "^7.1.1", - "stringify-package": "^1.0.1", - "yargs": "^16.0.0" - }, - "bin": { - "standard-version": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", - "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==" - }, - "node_modules/stdin-discarder": { - "version": "0.1.0", - "license": "MIT", - "dependencies": { - "bl": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/stringify-package": { - "version": "1.0.1", - "dev": true, - "license": "ISC" - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", - "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dependencies": { - "js-tokens": "^9.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", - "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==" - }, - "node_modules/styled-components": { - "version": "5.3.9", - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/@emotion/unitless": { - "version": "0.7.5", - "license": "MIT" - }, - "node_modules/styled-system": { - "version": "5.1.5", - "license": "MIT", - "dependencies": { - "@styled-system/background": "^5.1.2", - "@styled-system/border": "^5.1.5", - "@styled-system/color": "^5.1.2", - "@styled-system/core": "^5.1.2", - "@styled-system/flexbox": "^5.1.2", - "@styled-system/grid": "^5.1.2", - "@styled-system/layout": "^5.1.2", - "@styled-system/position": "^5.1.2", - "@styled-system/shadow": "^5.1.2", - "@styled-system/space": "^5.1.2", - "@styled-system/typography": "^5.1.2", - "@styled-system/variant": "^5.1.5", - "object-assign": "^4.1.1" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/synckit": { - "version": "0.8.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/terser": { - "version": "5.19.4", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/text-extensions": { - "version": "1.9.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/text-mask-addons": { - "version": "3.8.0", - "license": "Unlicense" - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/thread-stream": { - "version": "2.4.0", - "license": "MIT", - "dependencies": { - "real-require": "^0.2.0" - } - }, - "node_modules/throttle-debounce": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/through": { - "version": "2.3.8", - "dev": true, - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "license": "MIT" - }, - "node_modules/tinybench": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", - "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==" - }, - "node_modules/tinypool": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", - "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/titleize": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toad-cache": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", - "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", - "engines": { - "node": ">=12" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toposort-class": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/trim-newlines": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/tsx": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", - "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", - "dev": true, - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", - "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", - "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typescript-eslint-language-service": { - "version": "5.0.5", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@typescript-eslint/parser": ">= 5.0.0", - "eslint": ">= 8.0.0", - "typescript": ">= 4.0.0" - } - }, - "node_modules/uc.micro": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", - "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==" - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uppercamelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uppercamelcase/-/uppercamelcase-3.0.0.tgz", - "integrity": "sha512-zTWmRiOJACCdFGWjzye3L5cjSuVdZ/c8C0iHIwVbfORFD8IhGNAO6BOWkZ+fj+SI6/aFbdjGXE6gwPG780H4gQ==", - "dependencies": { - "camelcase": "^4.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/uppercamelcase/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.1.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-memo-one": { - "version": "1.1.3", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.0", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.11.0", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vite": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", - "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", - "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.41", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", - "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.3.4", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^5.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" - } - }, - "node_modules/vite/node_modules/rollup": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", - "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.21.0", - "@rollup/rollup-android-arm64": "4.21.0", - "@rollup/rollup-darwin-arm64": "4.21.0", - "@rollup/rollup-darwin-x64": "4.21.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", - "@rollup/rollup-linux-arm-musleabihf": "4.21.0", - "@rollup/rollup-linux-arm64-gnu": "4.21.0", - "@rollup/rollup-linux-arm64-musl": "4.21.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", - "@rollup/rollup-linux-riscv64-gnu": "4.21.0", - "@rollup/rollup-linux-s390x-gnu": "4.21.0", - "@rollup/rollup-linux-x64-gnu": "4.21.0", - "@rollup/rollup-linux-x64-musl": "4.21.0", - "@rollup/rollup-win32-arm64-msvc": "4.21.0", - "@rollup/rollup-win32-ia32-msvc": "4.21.0", - "@rollup/rollup-win32-x64-msvc": "4.21.0", - "fsevents": "~2.3.2" - } - }, - "node_modules/vitest": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", - "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", - "dependencies": { - "@vitest/expect": "1.6.0", - "@vitest/runner": "1.6.0", - "@vitest/snapshot": "1.6.0", - "@vitest/spy": "1.6.0", - "@vitest/utils": "1.6.0", - "acorn-walk": "^8.3.2", - "chai": "^4.3.10", - "debug": "^4.3.4", - "execa": "^8.0.1", - "local-pkg": "^0.5.0", - "magic-string": "^0.30.5", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.5.0", - "strip-literal": "^2.0.0", - "tinybench": "^2.5.1", - "tinypool": "^0.8.3", - "vite": "^5.0.0", - "vite-node": "1.6.0", - "why-is-node-running": "^2.2.2" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.6.0", - "@vitest/ui": "1.6.0", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/vitest/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vitest/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/vitest/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/void-elements": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vue-eslint-parser": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", - "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "license": "MIT" - }, - "node_modules/warning": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/why-is-node-running": { - "version": "2.2.2", - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wkx": { - "version": "0.5.0", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/xmlcreate": { - "version": "2.0.4", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/xss": { - "version": "1.0.14", - "license": "MIT", - "dependencies": { - "commander": "^2.20.3", - "cssfilter": "0.0.10" - }, - "bin": { - "xss": "bin/xss" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/xss/node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yoctocolors-cjs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", - "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/cli": { - "name": "rusty-motors-cli", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "rusty-motors-shared": "^1.0.0", - "rusty-motors-shared-packets": "^1.0.0" - }, - "devDependencies": { - "@vitest/coverage-v8": "1.6.0" - } - }, - "packages/connection": { - "name": "rusty-motors-connection", - "version": "1.0.0", - "extraneous": true, - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "vitest": "^1.6.0" - } - }, - "packages/database": { - "name": "rusty-motors-database", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "@databases/pg": "^5.5.0", - "@databases/pg-schema-cli": "^4.4.0", - "@databases/pg-typed": "^4.4.1", - "@sentry/node": "^8.0.0", - "@types/pg": "^8.11.6", - "pg": "^8.11.5", - "pg-hstore": "^2.3.4", - "vitest": "^1.6.0" - } - }, - "packages/database/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/database/node_modules/@sentry/node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", - "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.38.0", - "@opentelemetry/instrumentation-express": "0.41.1", - "@opentelemetry/instrumentation-fastify": "0.38.0", - "@opentelemetry/instrumentation-fs": "0.14.0", - "@opentelemetry/instrumentation-graphql": "0.42.0", - "@opentelemetry/instrumentation-hapi": "0.40.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.42.0", - "@opentelemetry/instrumentation-koa": "0.42.0", - "@opentelemetry/instrumentation-mongodb": "0.46.0", - "@opentelemetry/instrumentation-mongoose": "0.40.0", - "@opentelemetry/instrumentation-mysql": "0.40.0", - "@opentelemetry/instrumentation-mysql2": "0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "0.39.0", - "@opentelemetry/instrumentation-pg": "0.43.0", - "@opentelemetry/instrumentation-redis-4": "0.41.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.17.0", - "@sentry/core": "8.26.0", - "@sentry/opentelemetry": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "import-in-the-middle": "^1.11.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.3" - } - }, - "packages/database/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "engines": { - "node": ">=14.18" - } - }, - "packages/database/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/gateway": { - "name": "rusty-motors-gateway", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "@fastify/sensible": "^5.5.0", - "@sentry/node": "^8.0.0", - "fastify": "^4.25.2", - "vitest": "^1.6.0" - } - }, - "packages/gateway/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/gateway/node_modules/@sentry/node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", - "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.38.0", - "@opentelemetry/instrumentation-express": "0.41.1", - "@opentelemetry/instrumentation-fastify": "0.38.0", - "@opentelemetry/instrumentation-fs": "0.14.0", - "@opentelemetry/instrumentation-graphql": "0.42.0", - "@opentelemetry/instrumentation-hapi": "0.40.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.42.0", - "@opentelemetry/instrumentation-koa": "0.42.0", - "@opentelemetry/instrumentation-mongodb": "0.46.0", - "@opentelemetry/instrumentation-mongoose": "0.40.0", - "@opentelemetry/instrumentation-mysql": "0.40.0", - "@opentelemetry/instrumentation-mysql2": "0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "0.39.0", - "@opentelemetry/instrumentation-pg": "0.43.0", - "@opentelemetry/instrumentation-redis-4": "0.41.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.17.0", - "@sentry/core": "8.26.0", - "@sentry/opentelemetry": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "import-in-the-middle": "^1.11.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.3" - } - }, - "packages/gateway/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "engines": { - "node": ">=14.18" - } - }, - "packages/gateway/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/mcots": { - "name": "rusty-motors-mcots", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "short-unique-id": "^5.0.3" - } - }, - "packages/mcots/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/mcots/node_modules/@sentry/node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", - "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.38.0", - "@opentelemetry/instrumentation-express": "0.41.1", - "@opentelemetry/instrumentation-fastify": "0.38.0", - "@opentelemetry/instrumentation-fs": "0.14.0", - "@opentelemetry/instrumentation-graphql": "0.42.0", - "@opentelemetry/instrumentation-hapi": "0.40.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.42.0", - "@opentelemetry/instrumentation-koa": "0.42.0", - "@opentelemetry/instrumentation-mongodb": "0.46.0", - "@opentelemetry/instrumentation-mongoose": "0.40.0", - "@opentelemetry/instrumentation-mysql": "0.40.0", - "@opentelemetry/instrumentation-mysql2": "0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "0.39.0", - "@opentelemetry/instrumentation-pg": "0.43.0", - "@opentelemetry/instrumentation-redis-4": "0.41.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.17.0", - "@sentry/core": "8.26.0", - "@sentry/opentelemetry": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "import-in-the-middle": "^1.11.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.3" - } - }, - "packages/mcots/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "engines": { - "node": ">=14.18" - } - }, - "packages/mcots/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/nps": { - "name": "rusty-motors-nps", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "short-unique-id": "^5.0.3" - } - }, - "packages/nps/node_modules/@sentry/core": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", - "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", - "dependencies": { - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/nps/node_modules/@sentry/node": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", - "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", - "dependencies": { - "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^1.25.1", - "@opentelemetry/core": "^1.25.1", - "@opentelemetry/instrumentation": "^0.52.1", - "@opentelemetry/instrumentation-connect": "0.38.0", - "@opentelemetry/instrumentation-express": "0.41.1", - "@opentelemetry/instrumentation-fastify": "0.38.0", - "@opentelemetry/instrumentation-fs": "0.14.0", - "@opentelemetry/instrumentation-graphql": "0.42.0", - "@opentelemetry/instrumentation-hapi": "0.40.0", - "@opentelemetry/instrumentation-http": "0.52.1", - "@opentelemetry/instrumentation-ioredis": "0.42.0", - "@opentelemetry/instrumentation-koa": "0.42.0", - "@opentelemetry/instrumentation-mongodb": "0.46.0", - "@opentelemetry/instrumentation-mongoose": "0.40.0", - "@opentelemetry/instrumentation-mysql": "0.40.0", - "@opentelemetry/instrumentation-mysql2": "0.40.0", - "@opentelemetry/instrumentation-nestjs-core": "0.39.0", - "@opentelemetry/instrumentation-pg": "0.43.0", - "@opentelemetry/instrumentation-redis-4": "0.41.0", - "@opentelemetry/resources": "^1.25.1", - "@opentelemetry/sdk-trace-base": "^1.25.1", - "@opentelemetry/semantic-conventions": "^1.25.1", - "@prisma/instrumentation": "5.17.0", - "@sentry/core": "8.26.0", - "@sentry/opentelemetry": "8.26.0", - "@sentry/types": "8.26.0", - "@sentry/utils": "8.26.0", - "import-in-the-middle": "^1.11.0" - }, - "engines": { - "node": ">=14.18" - }, - "optionalDependencies": { - "opentelemetry-instrumentation-fetch-node": "1.2.3" - } - }, - "packages/nps/node_modules/@sentry/types": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", - "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", - "engines": { - "node": ">=14.18" - } - }, - "packages/nps/node_modules/@sentry/utils": { - "version": "8.26.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", - "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", - "dependencies": { - "@sentry/types": "8.26.0" - }, - "engines": { - "node": ">=14.18" - } - }, - "packages/patch": { - "name": "rusty-motors-patch", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - } - }, - "packages/shard": { - "name": "rusty-motors-shard", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - } - }, - "packages/shared": { - "name": "rusty-motors-shared", - "version": "1.0.0", - "license": "AGPL-3.0", - "dependencies": { - "fastify": "^4.27.0", - "pino": "^9.0.0", - "pino-pretty": "^11.0.0", - "vitest": "^1.6.0" - } - }, - "packages/shared-packets": { - "name": "rusty-motors-shared-packets", - "version": "1.0.0", - "license": "AGPL-3.0" - }, - "packages/shared/node_modules/pino": { - "version": "9.3.2", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", - "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", - "dependencies": { - "atomic-sleep": "^1.0.0", - "fast-redact": "^3.1.1", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.2.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^4.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "packages/shared/node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", - "dependencies": { - "readable-stream": "^4.0.0", - "split2": "^4.0.0" - } - }, - "packages/shared/node_modules/pino-std-serializers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", - "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" - }, - "packages/shared/node_modules/process-warning": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", - "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" - }, - "packages/shared/node_modules/readable-stream": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", - "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "packages/shared/node_modules/sonic-boom": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", - "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", - "dependencies": { - "atomic-sleep": "^1.0.0" - } - }, - "packages/shared/node_modules/thread-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", - "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", - "dependencies": { - "real-require": "^0.2.0" - } - } - } + "name": "mcos", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mcos", + "version": "1.0.0", + "license": "AGPL-3.0", + "workspaces": [ + "apps/main", + "packages/cli", + "packages/connection", + "packages/database", + "packages/gateway", + "packages/mcots", + "packages/nps", + "packages/patch", + "packages/shard", + "packages/shared", + "packages/shared-packets" + ], + "dependencies": { + "@adminjs/sequelize": "^4.1.1", + "@fastify/sensible": "^5.5.0", + "@sentry/node": "7.88", + "@sentry/profiling-node": "^1.3.2", + "adminjs": "^7.5.2", + "fastify": "^4.25.1", + "moment": "^2.29.4", + "pino": "^8.17.1", + "sequelize": "^6.35.2", + "sqlite": "^5.1.1", + "ts-node": "10.9.2" + }, + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@sentry/cli": "^2.23.1", + "@tsconfig/node-lts": "^20.1.0", + "@tsconfig/node20": "^20.1.2", + "@types/chai": "4.3.11", + "@types/node": "^20.10.5", + "@types/sinon": "17.0.2", + "@types/sinon-chai": "3.2.12", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "@typescript-eslint/parser": "^6.15.0", + "@vitest/coverage-v8": "^1.1.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "5.1.1", + "husky": "^8.0.3", + "jsdoc": "^4.0.2", + "lint-staged": "^15.2.0", + "prettier": "3.1.1", + "prettier-eslint": "16.2.0", + "rimraf": "^5.0.5", + "standard-version": "^9.5.0", + "tsx": "4.7.0", + "typescript": "^5.3.3", + "typescript-eslint-language-service": "^5.0.5", + "vitest": "^1.1.0" + } + }, + "apps/main": { + "name": "rusty-motors-server", + "version": "1.0.0", + "extraneous": true, + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "@sentry/profiling-node": "^8.0.0", + "rusty-motors-gateway": "^1.0.0", + "rusty-motors-shared": "^1.0.0", + "tsx": "^4.10.2", + "typescript": "^5.4.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adminjs/design-system": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@hypnosphi/create-react-context": "^0.3.1", + "@tiptap/core": "2.0.1", + "@tiptap/extension-bubble-menu": "2.0.1", + "@tiptap/extension-character-count": "2.0.1", + "@tiptap/extension-code": "2.0.1", + "@tiptap/extension-document": "2.0.1", + "@tiptap/extension-floating-menu": "2.0.1", + "@tiptap/extension-heading": "2.0.1", + "@tiptap/extension-image": "2.0.1", + "@tiptap/extension-link": "2.0.1", + "@tiptap/extension-table": "2.0.1", + "@tiptap/extension-table-cell": "2.0.1", + "@tiptap/extension-table-header": "2.0.1", + "@tiptap/extension-table-row": "2.0.1", + "@tiptap/extension-text": "2.0.1", + "@tiptap/extension-text-align": "2.0.1", + "@tiptap/extension-typography": "2.0.1", + "@tiptap/pm": "2.0.1", + "@tiptap/react": "2.0.1", + "@tiptap/starter-kit": "2.0.1", + "date-fns": "^2.29.3", + "flat": "^5.0.2", + "jw-paginate": "^1.0.4", + "lodash": "^4.17.21", + "polished": "^4.2.2", + "react-currency-input-field": "^3.6.10", + "react-datepicker": "^4.10.0", + "react-feather": "^2.0.10", + "react-phone-input-2": "^2.15.1", + "react-select": "^5.7.2", + "react-text-mask": "^5.5.0", + "styled-components": "5.3.9", + "styled-system": "^5.1.5", + "text-mask-addons": "^3.8.0" + }, + "peerDependencies": { + "react": "^18.1.0", + "react-dom": "^18.1.0" + } + }, + "node_modules/@adminjs/sequelize": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@adminjs/sequelize/-/sequelize-4.1.1.tgz", + "integrity": "sha512-HKOuuFn79tvW6xKP+v7FvKc6V7vERlmdEu9oAAR3gz6SE3T+V7Uz8N+trwngFhOpTWVcuws2FchFvKG3Xrm9iw==", + "dependencies": { + "escape-regexp": "0.0.1" + }, + "peerDependencies": { + "adminjs": "^7.0.0", + "sequelize": ">=6" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.15", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.2", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.9", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.9", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.10", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.10", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.10", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.15", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-typescript": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/register": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "find-cache-dir": "^2.0.0", + "make-dir": "^2.1.0", + "pirates": "^4.0.5", + "source-map-support": "^0.5.16" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT OR Apache-2.0", + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT OR Apache-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@databases/connection-pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@databases/connection-pool/-/connection-pool-1.1.0.tgz", + "integrity": "sha512-/12/SNgl0V77mJTo5SX3yGPz4c9XGQwAlCfA0vlfs/0HcaErNpYXpmhj0StET07w6TmTJTnaUgX2EPcQK9ez5A==", + "dependencies": { + "@databases/queue": "^1.0.0", + "is-promise": "^4.0.0" + } + }, + "node_modules/@databases/escape-identifier": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@databases/escape-identifier/-/escape-identifier-1.0.3.tgz", + "integrity": "sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==", + "dependencies": { + "@databases/validate-unicode": "^1.0.0" + } + }, + "node_modules/@databases/lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@databases/lock/-/lock-2.1.0.tgz", + "integrity": "sha512-ReWnFE5qeCuO2SA5h5fDh/hE/vMolA+Epe6xkAQP1FL2nhnsTCYwN2JACk/kWctR4OQoh0njBjPZ0yfIptclcA==", + "dependencies": { + "@databases/queue": "^1.0.0" + } + }, + "node_modules/@databases/pg": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@databases/pg/-/pg-5.5.0.tgz", + "integrity": "sha512-WIojK9AYIlNi5YRfc5YUOow3PQ82ClmwT9HG3nEsKLUERYieoVmHMYDQLS0ry6FjgJx+2yFs7LCw4kZpWu1TBw==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "@databases/escape-identifier": "^1.0.3", + "@databases/pg-config": "^3.2.0", + "@databases/pg-connection-string": "^1.0.0", + "@databases/pg-data-type-id": "^3.0.0", + "@databases/pg-errors": "^1.0.0", + "@databases/push-to-async-iterable": "^3.0.0", + "@databases/shared": "^3.1.0", + "@databases/split-sql-query": "^1.0.4", + "@databases/sql": "^3.3.0", + "assert-never": "^1.2.1", + "pg": "^8.4.2", + "pg-cursor": "^2.4.2" + } + }, + "node_modules/@databases/pg-bulk": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-bulk/-/pg-bulk-1.2.0.tgz", + "integrity": "sha512-GdzwFIllgOtuKbro4r6QBe0+4LipaUwb8+N7+z9QP+wg3XozGLnojnMFQlBrrc70jycw4aCM1O30w4vYtVlR/Q==", + "peerDependencies": { + "@databases/pg": "*" + } + }, + "node_modules/@databases/pg-config": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-config/-/pg-config-3.2.0.tgz", + "integrity": "sha512-hoPAK/F8gLcLgEJ8mLSnNvRlKqShwx5+GglDHIIfQhKF+Zz6M6QceiOefckS4WSjA0x2HClPvpercnXp9i24ag==", + "dependencies": { + "cosmiconfig": "^8.1.0", + "funtypes": "^4.1.0" + } + }, + "node_modules/@databases/pg-config/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@databases/pg-connection-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-connection-string/-/pg-connection-string-1.0.0.tgz", + "integrity": "sha512-8czOF9jlv7PlS7BPjnL82ynpDs1t8cu+C2jvdtMr37e8daPKMS7n1KfNE9xtr2Gq4QYKjynep097eYa5yIwcLA==" + }, + "node_modules/@databases/pg-data-type-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-data-type-id/-/pg-data-type-id-3.0.0.tgz", + "integrity": "sha512-VqW1csN8pRsWJxjPsGIC9FQ8wyenfmGv0P//BaeDMAu/giM3IXKxKM8fkScUSQ00uqFK/L1iHS5g6dgodF3XzA==" + }, + "node_modules/@databases/pg-errors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/pg-errors/-/pg-errors-1.0.0.tgz", + "integrity": "sha512-Yz3exbptZwOn4ZD/MSwY6z++XVyOFsMh5DERvSw3awRwJFnfdaqdeiIxxX0MVjM6KPihF0xxp8lPO7vTc5ydpw==" + }, + "node_modules/@databases/pg-schema-cli": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-cli/-/pg-schema-cli-4.4.0.tgz", + "integrity": "sha512-pwLEjFrPl8Gk+7KmSbHHW9kYnUIWN9/V8DCb9Gwee7hXRkZeEZg9thdprG/ngxIdf983MfHyA/8np78IyNyhqg==", + "dependencies": { + "@databases/pg-config": "^3.2.0", + "@databases/pg-schema-introspect": "^4.2.0", + "@databases/pg-schema-print-types": "^4.5.0", + "chalk": "^4.1.0", + "interrogator": "^2.0.0", + "is-interactive": "^1.0.0", + "parameter-reducers": "^2.0.0" + }, + "bin": { + "pg-schema": "lib/cli.js" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@databases/pg-schema-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@databases/pg-schema-introspect": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-introspect/-/pg-schema-introspect-4.2.0.tgz", + "integrity": "sha512-WaN79kbMwiQCS78XlCVOPE+Q6Go2gF3FNqatGWUZHnbHn+NR8I/5/1uC7T8HTruC5UfTe3CcCNPUglVad2YoVg==", + "dependencies": { + "@databases/pg": "^5.5.0" + } + }, + "node_modules/@databases/pg-schema-print-types": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@databases/pg-schema-print-types/-/pg-schema-print-types-4.5.0.tgz", + "integrity": "sha512-HlCHVPuu+qm1oNgkp+v3exdvmeJxflZnDTL6D6eSr3yMSClMQ7JBzCthymazWyZ9s4qsHO6gXfNhgUgjUz6LFw==", + "dependencies": { + "@databases/pg-config": "^3.2.0", + "@databases/pg-data-type-id": "^3.0.0", + "@databases/shared-print-types": "^1.2.0", + "assert-never": "^1.2.1" + }, + "peerDependencies": { + "@databases/pg-schema-introspect": "*" + } + }, + "node_modules/@databases/pg-typed": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@databases/pg-typed/-/pg-typed-4.4.1.tgz", + "integrity": "sha512-7UU7RzVKsB3WUfDm3rMI0x0lw79oNtzGQLTG5tVrpSlUxvHBRaZWm4F6kiov3Wo/HVxtQA+d9trGHcvfGOh+dw==", + "dependencies": { + "@databases/pg-bulk": "^1.2.0" + }, + "peerDependencies": { + "@databases/pg": "*" + } + }, + "node_modules/@databases/push-to-async-iterable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@databases/push-to-async-iterable/-/push-to-async-iterable-3.0.0.tgz", + "integrity": "sha512-xwu/yNgINdMU+fn6UwFsxh+pa6UrVPafY+0qm0RK0/nKyjllfDqSbwK4gSmdmLEwPYxKwch9CAE3P8NxN1hPSg==", + "dependencies": { + "@databases/queue": "^1.0.0" + } + }, + "node_modules/@databases/queue": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@databases/queue/-/queue-1.0.1.tgz", + "integrity": "sha512-dqRU+/aQ4lhFzjPIkIhjB0+UEKMb76FoBgHOJUTcEblgatr/IhdhHliT3VVwcImXh35Mz297PAXE4yFM4eYWUQ==" + }, + "node_modules/@databases/shared": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@databases/shared/-/shared-3.1.0.tgz", + "integrity": "sha512-bO1DIYAYDiWOCqVPvBio1JqZQYh4dph2M1av2w/REeFT6WBd64mTrOFlcxKV0CUAYT0UiJsDfPqEfw0/APRzWg==", + "dependencies": { + "@databases/connection-pool": "^1.1.0", + "@databases/lock": "^2.1.0", + "@databases/queue": "^1.0.1", + "@databases/split-sql-query": "^1.0.4", + "@databases/sql": "^3.3.0" + } + }, + "node_modules/@databases/shared-print-types": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@databases/shared-print-types/-/shared-print-types-1.2.0.tgz", + "integrity": "sha512-/TLxh4s1nbMU6fcqZd0u7KXaBvs7/kBDW92kLhkfKqB53vvhdnszOVlrX8G07697qffvtZuF4jLZjKceQcEmDw==", + "dependencies": { + "camelcase": "^6.1.0", + "mkdirp": "^1.0.4", + "pluralize": "^8.0.0", + "uppercamelcase": "^3.0.0" + } + }, + "node_modules/@databases/shared-print-types/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@databases/split-sql-query": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@databases/split-sql-query/-/split-sql-query-1.0.4.tgz", + "integrity": "sha512-lDqDQvH34NNjLs0knaDvL6HKgPtishQlDYHfOkvbAd5VQOEhcDvvmG2zbBuFvS2HQAz5NsyLj5erGaxibkxhvQ==", + "peerDependencies": { + "@databases/sql": "*" + } + }, + "node_modules/@databases/sql": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@databases/sql/-/sql-3.3.0.tgz", + "integrity": "sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==" + }, + "node_modules/@databases/validate-unicode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@databases/validate-unicode/-/validate-unicode-1.0.0.tgz", + "integrity": "sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.10.tgz", + "integrity": "sha512-Q+mk96KJ+FZ30h9fsJl+67IjNJm3x2eX+GBWGmocAKgzp27cowCOOqSdscX80s0SpdFXZnIv/+1xD1EctFx96Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.10.tgz", + "integrity": "sha512-7W0bK7qfkw1fc2viBfrtAEkDKHatYfHzr/jKAHNr9BvkYDXPcC6bodtm8AyLJNNuqClLNaeTLuwURt4PRT9d7w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.10.tgz", + "integrity": "sha512-1X4CClKhDgC3by7k8aOWZeBXQX8dHT5QAMCAQDArCLaYfkppoARvh0fit3X2Qs+MXDngKcHv6XXyQCpY0hkK1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.10.tgz", + "integrity": "sha512-O/nO/g+/7NlitUxETkUv/IvADKuZXyH4BHf/g/7laqKC4i/7whLpB0gvpPc2zpF0q9Q6FXS3TS75QHac9MvVWw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.10.tgz", + "integrity": "sha512-YSRRs2zOpwypck+6GL3wGXx2gNP7DXzetmo5pHXLrY/VIMsS59yKfjPizQ4lLt5vEI80M41gjm2BxrGZ5U+VMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.10.tgz", + "integrity": "sha512-alfGtT+IEICKtNE54hbvPg13xGBe4GkVxyGWtzr+yHO7HIiRJppPDhOKq3zstTcVf8msXb/t4eavW3jCDpMSmA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.10.tgz", + "integrity": "sha512-dMtk1wc7FSH8CCkE854GyGuNKCewlh+7heYP/sclpOG6Cectzk14qdUIY5CrKDbkA/OczXq9WesqnPl09mj5dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.10.tgz", + "integrity": "sha512-G5UPPspryHu1T3uX8WiOEUa6q6OlQh6gNl4CO4Iw5PS+Kg5bVggVFehzXBJY6X6RSOMS8iXDv2330VzaObm4Ag==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.10.tgz", + "integrity": "sha512-j6gUW5aAaPgD416Hk9FHxn27On28H4eVI9rJ4az7oCGTFW48+LcgNDBN+9f8rKZz7EEowo889CPKyeaD0iw9Kg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.10.tgz", + "integrity": "sha512-QxaouHWZ+2KWEj7cGJmvTIHVALfhpGxo3WLmlYfJ+dA5fJB6lDEIg+oe/0//FuyVHuS3l79/wyBxbHr0NgtxJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.10.tgz", + "integrity": "sha512-4ub1YwXxYjj9h1UIZs2hYbnTZBtenPw5NfXCRgEkGb0b6OJ2gpkMvDqRDYIDRjRdWSe/TBiZltm3Y3Q8SN1xNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.10.tgz", + "integrity": "sha512-lo3I9k+mbEKoxtoIbM0yC/MZ1i2wM0cIeOejlVdZ3D86LAcFXFRdeuZmh91QJvUTW51bOK5W2BznGNIl4+mDaA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.10.tgz", + "integrity": "sha512-J4gH3zhHNbdZN0Bcr1QUGVNkHTdpijgx5VMxeetSk6ntdt+vR1DqGmHxQYHRmNb77tP6GVvD+K0NyO4xjd7y4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.10.tgz", + "integrity": "sha512-tgT/7u+QhV6ge8wFMzaklOY7KqiyitgT1AUHMApau32ZlvTB/+efeCtMk4eXS+uEymYK249JsoiklZN64xt6oQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.10.tgz", + "integrity": "sha512-0f/spw0PfBMZBNqtKe5FLzBDGo0SKZKvMl5PHYQr3+eiSscfJ96XEknCe+JoOayybWUFQbcJTrk946i3j9uYZA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.10.tgz", + "integrity": "sha512-pZFe0OeskMHzHa9U38g+z8Yx5FNCLFtUnJtQMpwhS+r4S566aK2ci3t4NCP4tjt6d5j5uo4h7tExZMjeKoehAA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.10.tgz", + "integrity": "sha512-SpYNEqg/6pZYoc+1zLCjVOYvxfZVZj6w0KROZ3Fje/QrM3nfvT2llI+wmKSrWuX6wmZeTapbarvuNNK/qepSgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.10.tgz", + "integrity": "sha512-ACbZ0vXy9zksNArWlk2c38NdKg25+L9pr/mVaj9SUq6lHZu/35nx2xnQVRGLrC1KKQqJKRIB0q8GspiHI3J80Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.10.tgz", + "integrity": "sha512-PxcgvjdSjtgPMiPQrM3pwSaG4kGphP+bLSb+cihuP0LYdZv1epbAIecHVl5sD3npkfYBZ0ZnOjR878I7MdJDFg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.10.tgz", + "integrity": "sha512-ZkIOtrRL8SEJjr+VHjmW0znkPs+oJXhlJbNwfI37rvgeMtk3sxOQevXPXjmAPZPigVTncvFqLMd+uV0IBSEzqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.10.tgz", + "integrity": "sha512-+Sa4oTDbpBfGpl3Hn3XiUe4f8TU2JF7aX8cOfqFYMMjXp6ma6NJDztl5FDG8Ezx0OjwGikIHw+iA54YLDNNVfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.10.tgz", + "integrity": "sha512-EOGVLK1oWMBXgfttJdPHDTiivYSjX6jDNaATeNOaCOFEVcfMjtbx7WVQwPSE1eIfCp/CaSF2nSrDtzc4I9f8TQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.10.tgz", + "integrity": "sha512-whqLG6Sc70AbU73fFYvuYzaE4MNMBIlR1Y/IrUeOXFrWHxBEjjbZaQ3IXIQS8wJdAzue2GwYZCjOrgrU1oUHoA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fastify/ajv-compiler": { + "version": "3.5.0", + "license": "MIT", + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/@fastify/deepmerge": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/@fastify/error": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", + "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "fast-json-stringify": "^5.7.0" + } + }, + "node_modules/@fastify/sensible": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@fastify/sensible/-/sensible-5.5.0.tgz", + "integrity": "sha512-D0zpl+nocsRXLceSbc4gasQaO3ZNQR4dy9Uu8Ym0mh8VUdrjpZ4g8Ca9O3pGXbBVOnPIGHUJNTV7Yf9dg/OYdg==", + "dependencies": { + "@lukeed/ms": "^2.0.1", + "fast-deep-equal": "^3.1.1", + "fastify-plugin": "^4.0.0", + "forwarded": "^0.2.0", + "http-errors": "^2.0.0", + "type-is": "^1.6.18", + "vary": "^1.1.2" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.4.1", + "@floating-ui/utils": "^0.1.1" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/@hello-pangea/dnd": { + "version": "16.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.22.5", + "css-box-model": "^1.2.1", + "memoize-one": "^6.0.0", + "raf-schd": "^4.0.3", + "react-redux": "^8.1.1", + "redux": "^4.2.1", + "use-memo-one": "^1.1.3" + }, + "peerDependencies": { + "react": "^16.8.5 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.5 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@hypnosphi/create-react-context": { + "version": "0.3.1", + "license": "MIT", + "dependencies": { + "gud": "^1.0.0", + "warning": "^4.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": ">=0.14.0" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.5.tgz", + "integrity": "sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@jsdoc/salty": { + "version": "0.2.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=v12.0.0" + } + }, + "node_modules/@lukeed/ms": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@lukeed/ms/-/ms-2.0.1.tgz", + "integrity": "sha512-Xs/4RZltsAL7pkvaNStUQt7netTkyxrS0K+RILcVr3TRMS/ToOg4I6uNfhB9SlGsnWBym4U+EaXq0f0cEMNkHA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@opentelemetry/api": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", + "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.52.1.tgz", + "integrity": "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==", + "dependencies": { + "@opentelemetry/api": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/context-async-hooks": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", + "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", + "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "dependencies": { + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz", + "integrity": "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==", + "dependencies": { + "@opentelemetry/api-logs": "0.52.1", + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "^1.8.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-connect": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.38.0.tgz", + "integrity": "sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/connect": "3.4.36" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-express": { + "version": "0.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-express/-/instrumentation-express-0.41.1.tgz", + "integrity": "sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fastify": { + "version": "0.38.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fastify/-/instrumentation-fastify-0.38.0.tgz", + "integrity": "sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-fs": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.14.0.tgz", + "integrity": "sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-graphql": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.42.0.tgz", + "integrity": "sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-hapi": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.40.0.tgz", + "integrity": "sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-http": { + "version": "0.52.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-http/-/instrumentation-http-0.52.1.tgz", + "integrity": "sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/instrumentation": "0.52.1", + "@opentelemetry/semantic-conventions": "1.25.1", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-ioredis": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.42.0.tgz", + "integrity": "sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-koa": { + "version": "0.42.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.42.0.tgz", + "integrity": "sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongodb": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.46.0.tgz", + "integrity": "sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/sdk-metrics": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mongoose": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.40.0.tgz", + "integrity": "sha512-niRi5ZUnkgzRhIGMOozTyoZIvJKNJyhijQI4nF4iFSb+FUx2v5fngfR+8XLmdQAO7xmsD8E5vEGdDVYVtKbZew==", + "dependencies": { + "@opentelemetry/core": "^1.8.0", + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.40.0.tgz", + "integrity": "sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@types/mysql": "2.15.22" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-mysql2": { + "version": "0.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.40.0.tgz", + "integrity": "sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-nestjs-core": { + "version": "0.39.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-nestjs-core/-/instrumentation-nestjs-core-0.39.0.tgz", + "integrity": "sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.23.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg": { + "version": "0.43.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.43.0.tgz", + "integrity": "sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/semantic-conventions": "^1.22.0", + "@opentelemetry/sql-common": "^0.40.1", + "@types/pg": "8.6.1", + "@types/pg-pool": "2.0.4" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/@types/pg": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.6.1.tgz", + "integrity": "sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^2.2.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation-redis-4": { + "version": "0.41.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.41.0.tgz", + "integrity": "sha512-H7IfGTqW2reLXqput4yzAe8YpDC0fmVNal95GHMLOrS89W+qWUKIqxolSh63hJyfmwPSFwXASzj7wpSk8Az+Dg==", + "dependencies": { + "@opentelemetry/instrumentation": "^0.52.0", + "@opentelemetry/redis-common": "^0.36.2", + "@opentelemetry/semantic-conventions": "^1.22.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/redis-common": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz", + "integrity": "sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", + "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-metrics": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", + "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "lodash.merge": "^4.6.2" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", + "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "dependencies": { + "@opentelemetry/core": "1.25.1", + "@opentelemetry/resources": "1.25.1", + "@opentelemetry/semantic-conventions": "1.25.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.25.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", + "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@opentelemetry/sql-common": { + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz", + "integrity": "sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==", + "dependencies": { + "@opentelemetry/core": "^1.1.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@prisma/instrumentation": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/@prisma/instrumentation/-/instrumentation-5.17.0.tgz", + "integrity": "sha512-c1Sle4ji8aasMcYfBBHFM56We4ljfenVtRmS8aY06BllS7SoU6SmJBwG7vil+GHiR0Yrh+t9iBwt4AY0Jr4KNQ==", + "dependencies": { + "@opentelemetry/api": "^1.8", + "@opentelemetry/instrumentation": "^0.49 || ^0.50 || ^0.51 || ^0.52.0", + "@opentelemetry/sdk-trace-base": "^1.22" + } + }, + "node_modules/@redux-devtools/extension": { + "version": "3.2.5", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.7", + "immutable": "^4.2.2" + }, + "peerDependencies": { + "redux": "^3.1.0 || ^4.0.0" + } + }, + "node_modules/@remirror/core-constants": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/@remirror/core-helpers": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "@remirror/types": "^1.0.1", + "@types/object.omit": "^3.0.0", + "@types/object.pick": "^1.3.2", + "@types/throttle-debounce": "^2.1.0", + "case-anything": "^2.1.13", + "dash-get": "^1.0.2", + "deepmerge": "^4.3.1", + "fast-deep-equal": "^3.1.3", + "make-error": "^1.3.6", + "object.omit": "^3.0.0", + "object.pick": "^1.3.0", + "throttle-debounce": "^3.0.1" + } + }, + "node_modules/@remirror/types": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "type-fest": "^2.19.0" + } + }, + "node_modules/@remirror/types/node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@remix-run/router": { + "version": "1.8.0", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.18.6", + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + }, + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "24.1.0", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { + "version": "0.27.0", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/plugin-inject": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-inject/node_modules/magic-string": { + "version": "0.27.0", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.1", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.27.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace/node_modules/magic-string": { + "version": "0.27.0", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.3", + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.x || ^3.x" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.0.4", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz", + "integrity": "sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz", + "integrity": "sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz", + "integrity": "sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz", + "integrity": "sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz", + "integrity": "sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz", + "integrity": "sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz", + "integrity": "sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz", + "integrity": "sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz", + "integrity": "sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz", + "integrity": "sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz", + "integrity": "sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz", + "integrity": "sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz", + "integrity": "sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz", + "integrity": "sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz", + "integrity": "sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz", + "integrity": "sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.88.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.88.0.tgz", + "integrity": "sha512-xXQdcYhsS+ourzJHjXNjZC9zakuc97udmpgaXRjEP7FjPYclIx+YXwgFBdHM2kzAwZLFOsEce5dr46GVXUDfZw==", + "dependencies": { + "@sentry/core": "7.88.0", + "@sentry/types": "7.88.0", + "@sentry/utils": "7.88.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/cli": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.23.1.tgz", + "integrity": "sha512-3Tg3qzrdNWQAkuRyXniVhT+aNAwucshw0UKr/J2hxQgA72vxzcZlK4G0+Im9gIFwmzuBaD8jSGVpkzATuCeoNA==", + "dev": true, + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.23.1", + "@sentry/cli-linux-arm": "2.23.1", + "@sentry/cli-linux-arm64": "2.23.1", + "@sentry/cli-linux-i686": "2.23.1", + "@sentry/cli-linux-x64": "2.23.1", + "@sentry/cli-win32-i686": "2.23.1", + "@sentry/cli-win32-x64": "2.23.1" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.23.1.tgz", + "integrity": "sha512-jSHORd9p/69BmKZRfJXFw4WFYODlw3mH1vBCi8LTWDimR9L3tthlCqYM1v5A26mUACqyNPI3s/6xvw5GOAsIhw==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.23.1.tgz", + "integrity": "sha512-ur7DFWwHXrLRJLa0+vL22Wkr8FC1NIQwo0mfKI+51Y9ijKsfo8R7pO5MPRCYQz0DKR12VPXkq05KPsCNq5AtZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.23.1.tgz", + "integrity": "sha512-f6e1x5zudglp8XdgN07hRhX8HVIeiY/dLAcvaV7qPNtZLd9pjsPgS2nyJlPPEC2WgG1FC439t3JmxIhRTjRA9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.23.1.tgz", + "integrity": "sha512-nm3iDgBwkwAZGkz2Oq44pdh0xdECOq/EumF8mAPA6YS2MKUWGsFQEb5/f6HLnqBULrd88RK1wrEW0eBIuIJs9Q==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-x64": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.23.1.tgz", + "integrity": "sha512-W8QWaxbkIOW2wpAQ1zUzA7+3bOX8lUu5bPxAfstGLobUtxZcTgydJ+58KCeyE6je/jhgzxu+fieat1bzTUrfdg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux", + "freebsd" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-i686": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.23.1.tgz", + "integrity": "sha512-h8u2OUH9SvWJpRc3f0halzXut7+/BpbLc5eiViPqrcSosmngDSuy0TOGNqwsDW4hpkqm7RcTXWIUhLJcKtFFdA==", + "cpu": [ + "x86", + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-win32-x64": { + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.23.1.tgz", + "integrity": "sha512-DG+oyQ1bsG5A7yd3c+gt2aD6V3IsR+mutV6h1QYQ9Y8PoloGhOWmt/fnZ5CT20/HyzejykMfASnscsJGHmXp4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/core": { + "version": "7.88.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.88.0.tgz", + "integrity": "sha512-Jzbb7dcwiCO7kI0a1w+32UzWxbEn2OcZWzp55QMEeAh6nZ/5CXhXwpuHi0tW7doPj+cJdmxMTMu9LqMVfdGkzQ==", + "dependencies": { + "@sentry/types": "7.88.0", + "@sentry/utils": "7.88.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.88.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.88.0.tgz", + "integrity": "sha512-X6Xyh7AEitnWqn1CHQrmsUqRn0GKj/6nPE5VC2DLQfHiFH1Fknrt+csFzDchQ/86awXYwuY4Le5ECEH//X/WzQ==", + "dependencies": { + "@sentry-internal/tracing": "7.88.0", + "@sentry/core": "7.88.0", + "@sentry/types": "7.88.0", + "@sentry/utils": "7.88.0", + "https-proxy-agent": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-8.26.0.tgz", + "integrity": "sha512-HBDheM/+ysfIz8R1OH4bBIxdgD7ZbQkKLJAUXkdAbBcfbpK/CTtwcplbauF5wY7Q+GYvwL/ShuDwvXRfW+gFyQ==", + "dependencies": { + "@sentry/core": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/opentelemetry/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/profiling-node": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@sentry/profiling-node/-/profiling-node-1.3.2.tgz", + "integrity": "sha512-Dm2FmR0+BYrTm3YSmbCxjeklAsXZecOwWarZQdrCQniPYlxS9GPgWv1P+J78+CrHZ4IpoIvnlRppGPMrJwPXkw==", + "hasInstallScript": true, + "dependencies": { + "detect-libc": "^2.0.2", + "node-abi": "^3.52.0" + }, + "bin": { + "sentry-prune-profiler-binaries": "scripts/prune-profiler-binaries.mjs" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "@sentry/node": "^7.44.1" + } + }, + "node_modules/@sentry/types": { + "version": "7.88.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.88.0.tgz", + "integrity": "sha512-FvwvmX1pWAZKicPj4EpKyho8Wm+C4+r5LiepbbBF8oKwSPJdD2QV1fo/LWxsrzNxWOllFIVIXF5Ed3nPYQWpTw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.88.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.88.0.tgz", + "integrity": "sha512-ukminfRmdBXTzk49orwJf3Lu3hR60ZRHjE2a4IXwYhyDT6JJgJqgsq1hzGXx0AyFfyS4WhfZ6QUBy7fu3BScZQ==", + "dependencies": { + "@sentry/types": "7.88.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@styled-system/background": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/border": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/color": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/core": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "object-assign": "^4.1.1" + } + }, + "node_modules/@styled-system/css": { + "version": "5.1.5", + "license": "MIT" + }, + "node_modules/@styled-system/flexbox": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/grid": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/layout": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/position": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/shadow": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/space": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/typography": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2" + } + }, + "node_modules/@styled-system/variant": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@styled-system/core": "^5.1.2", + "@styled-system/css": "^5.1.5" + } + }, + "node_modules/@tiptap/core": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-blockquote": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-bold": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-bullet-list": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-character-count": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-code": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-code-block": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-dropcursor": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "tippy.js": "^6.3.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-gapcursor": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-hard-break": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-heading": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-horizontal-rule": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-image": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-italic": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-link": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "linkifyjs": "^4.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-list-item": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-ordered-list": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-strike": { + "version": "2.1.8", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-cell": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-header": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-table-row": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-text-align": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/extension-typography": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.2.0", + "prosemirror-collab": "^1.3.0", + "prosemirror-commands": "^1.3.1", + "prosemirror-dropcursor": "^1.5.0", + "prosemirror-gapcursor": "^1.3.1", + "prosemirror-history": "^1.3.0", + "prosemirror-inputrules": "^1.2.0", + "prosemirror-keymap": "^1.2.0", + "prosemirror-markdown": "^1.10.1", + "prosemirror-menu": "^1.2.1", + "prosemirror-model": "^1.18.1", + "prosemirror-schema-basic": "^1.2.0", + "prosemirror-schema-list": "^1.2.2", + "prosemirror-state": "^1.4.1", + "prosemirror-tables": "^1.3.0", + "prosemirror-trailing-node": "^2.0.2", + "prosemirror-transform": "^1.7.0", + "prosemirror-view": "^1.28.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0" + } + }, + "node_modules/@tiptap/react": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@tiptap/extension-bubble-menu": "^2.0.1", + "@tiptap/extension-floating-menu": "^2.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "^2.0.0", + "@tiptap/pm": "^2.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tiptap/starter-kit": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@tiptap/core": "^2.0.1", + "@tiptap/extension-blockquote": "^2.0.1", + "@tiptap/extension-bold": "^2.0.1", + "@tiptap/extension-bullet-list": "^2.0.1", + "@tiptap/extension-code": "^2.0.1", + "@tiptap/extension-code-block": "^2.0.1", + "@tiptap/extension-document": "^2.0.1", + "@tiptap/extension-dropcursor": "^2.0.1", + "@tiptap/extension-gapcursor": "^2.0.1", + "@tiptap/extension-hard-break": "^2.0.1", + "@tiptap/extension-heading": "^2.0.1", + "@tiptap/extension-history": "^2.0.1", + "@tiptap/extension-horizontal-rule": "^2.0.1", + "@tiptap/extension-italic": "^2.0.1", + "@tiptap/extension-list-item": "^2.0.1", + "@tiptap/extension-ordered-list": "^2.0.1", + "@tiptap/extension-paragraph": "^2.0.1", + "@tiptap/extension-strike": "^2.0.1", + "@tiptap/extension-text": "^2.0.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tsconfig/node-lts": { + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/@tsconfig/node-lts/-/node-lts-20.1.0.tgz", + "integrity": "sha512-3w2D9MfGdqBL51pHB5nGFmGtXBn1gbO+n9xzwcGSvZPArtCn4tElk+6EeelLXispAeqv13GAgbzkgLNHtoxOCQ==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/@tsconfig/node20": { + "version": "20.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.8", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.2", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "3.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "12.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/linkify-it": "*", + "@types/mdurl": "*" + } + }, + "node_modules/@types/mdurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "license": "MIT" + }, + "node_modules/@types/mysql": { + "version": "2.15.22", + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.22.tgz", + "integrity": "sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.10.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz", + "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/object.omit": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/@types/object.pick": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/@types/pg": { + "version": "8.11.6", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", + "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "dependencies": { + "@types/node": "*", + "pg-protocol": "*", + "pg-types": "^4.0.1" + } + }, + "node_modules/@types/pg-pool": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/pg-pool/-/pg-pool-2.0.4.tgz", + "integrity": "sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==", + "dependencies": { + "@types/pg": "*" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.2.21", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "license": "MIT" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "dev": true + }, + "node_modules/@types/shimmer": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/shimmer/-/shimmer-1.2.0.tgz", + "integrity": "sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==" + }, + "node_modules/@types/sinon": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-17.0.2.tgz", + "integrity": "sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinon-chai": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-3.2.12.tgz", + "integrity": "sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==", + "dev": true, + "dependencies": { + "@types/chai": "*", + "@types/sinon": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/throttle-debounce": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.11.1", + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz", + "integrity": "sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/type-utils": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.15.0.tgz", + "integrity": "sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz", + "integrity": "sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz", + "integrity": "sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.15.0", + "@typescript-eslint/utils": "6.15.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.15.0.tgz", + "integrity": "sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz", + "integrity": "sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/visitor-keys": "6.15.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.15.0.tgz", + "integrity": "sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.15.0", + "@typescript-eslint/types": "6.15.0", + "@typescript-eslint/typescript-estree": "6.15.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz", + "integrity": "sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.15.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitest/coverage-v8": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.6.0.tgz", + "integrity": "sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.4", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.4", + "istanbul-reports": "^3.1.6", + "magic-string": "^0.30.5", + "magicast": "^0.3.3", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "test-exclude": "^6.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "1.6.0" + } + }, + "node_modules/@vitest/expect": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "dependencies": { + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "chai": "^4.3.10" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "dependencies": { + "@vitest/utils": "1.6.0", + "p-limit": "^5.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", + "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "dependencies": { + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "dependencies": { + "tinyspy": "^2.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "dependencies": { + "diff-sequences": "^29.6.3", + "estree-walker": "^3.0.3", + "loupe": "^2.3.7", + "pretty-format": "^29.7.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abstract-logging": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "optional": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/adminjs": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/adminjs/-/adminjs-7.5.2.tgz", + "integrity": "sha512-Gx80srhJSkxLp16BrLl+A3EdsOFmT7ewxw0DNWHchLs3MxV5JNgx69u5NtmFPKspAoKo86ouITpO5JzPyKBFPA==", + "dependencies": { + "@adminjs/design-system": "^4.0.0", + "@babel/core": "^7.21.0", + "@babel/parser": "^7.21.0", + "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-transform-runtime": "^7.21.0", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@babel/register": "^7.21.0", + "@hello-pangea/dnd": "^16.2.0", + "@redux-devtools/extension": "^3.2.5", + "@rollup/plugin-babel": "^6.0.3", + "@rollup/plugin-commonjs": "^24.0.1", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-node-resolve": "^15.0.1", + "@rollup/plugin-replace": "^5.0.2", + "@rollup/plugin-terser": "^0.4.0", + "axios": "^1.3.4", + "commander": "^10.0.0", + "flat": "^5.0.2", + "i18next": "^22.4.13", + "i18next-browser-languagedetector": "^7.0.1", + "i18next-http-backend": "^2.2.0", + "lodash": "^4.17.21", + "ora": "^6.2.0", + "prop-types": "^15.8.1", + "punycode": "^2.3.0", + "qs": "^6.11.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-feather": "^2.0.10", + "react-i18next": "^12.2.0", + "react-is": "^18.2.0", + "react-redux": "^8.0.5", + "react-router": "^6.9.0", + "react-router-dom": "^6.9.0", + "redux": "^4.2.1", + "rollup": "^3.15.0", + "rollup-plugin-polyfill-node": "^0.12.0", + "slash": "^5.0.0", + "uuid": "^9.0.0", + "xss": "^1.0.14" + }, + "bin": { + "admin": "cli.js" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/ansi-escapes": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.0.tgz", + "integrity": "sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==", + "dev": true, + "dependencies": { + "type-fest": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-ify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assert-never": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.3.0.tgz", + "integrity": "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==" + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/avvio": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-8.4.0.tgz", + "integrity": "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==", + "dependencies": { + "@fastify/error": "^3.3.0", + "fastq": "^1.17.1" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.5", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.2", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.51", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "dependencies": { + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelize": { + "version": "1.0.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001528", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/case-anything": { + "version": "2.1.13", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/catharsis": { + "version": "0.9.0", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.15" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==" + }, + "node_modules/classnames": { + "version": "2.3.2", + "license": "MIT" + }, + "node_modules/cli-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/common-tags": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/compare-func": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/conventional-changelog": { + "version": "3.1.25", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-changelog-angular": "^5.0.12", + "conventional-changelog-atom": "^2.0.8", + "conventional-changelog-codemirror": "^2.0.8", + "conventional-changelog-conventionalcommits": "^4.5.0", + "conventional-changelog-core": "^4.2.1", + "conventional-changelog-ember": "^2.0.9", + "conventional-changelog-eslint": "^3.0.9", + "conventional-changelog-express": "^2.0.6", + "conventional-changelog-jquery": "^3.0.11", + "conventional-changelog-jshint": "^2.0.9", + "conventional-changelog-preset-loader": "^2.3.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "2.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "2.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-config-spec": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "4.6.3", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core": { + "version": "4.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^5.0.0", + "conventional-commits-parser": "^3.2.0", + "dateformat": "^3.0.0", + "get-pkg-repo": "^4.0.0", + "git-raw-commits": "^2.0.8", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^4.1.1", + "lodash": "^4.17.15", + "normalize-package-data": "^3.0.0", + "q": "^1.5.1", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "2.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "3.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-express": { + "version": "2.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "3.0.11", + "dev": true, + "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "2.0.9", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "2.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "semver": "^6.0.0", + "split": "^1.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-writer/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/conventional-commits-filter": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-commits-parser/node_modules/split2": { + "version": "3.2.2", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.3.4", + "conventional-commits-filter": "^2.0.7", + "conventional-commits-parser": "^3.2.0", + "git-raw-commits": "^2.0.8", + "git-semver-tags": "^4.1.1", + "meow": "^8.0.0", + "q": "^1.5.1" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js-compat": { + "version": "3.32.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/crelt": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/cross-fetch": { + "version": "3.1.6", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.11" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-box-model": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/cssfilter": { + "version": "0.0.10", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.2", + "license": "MIT" + }, + "node_modules/dargs": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/dash-get": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "2.30.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dotgitignore": { + "version": "2.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "find-up": "^3.0.0", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotgitignore/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dotgitignore/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/dottie": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.510", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "3.0.1", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.10.tgz", + "integrity": "sha512-S1Y27QGt/snkNYrRcswgRFqZjaTG5a5xM3EQo97uNBnH505pdzSNe/HLBq1v0RO7iK/ngdbhJB6mDAp0OK+iUA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.19.10", + "@esbuild/android-arm": "0.19.10", + "@esbuild/android-arm64": "0.19.10", + "@esbuild/android-x64": "0.19.10", + "@esbuild/darwin-arm64": "0.19.10", + "@esbuild/darwin-x64": "0.19.10", + "@esbuild/freebsd-arm64": "0.19.10", + "@esbuild/freebsd-x64": "0.19.10", + "@esbuild/linux-arm": "0.19.10", + "@esbuild/linux-arm64": "0.19.10", + "@esbuild/linux-ia32": "0.19.10", + "@esbuild/linux-loong64": "0.19.10", + "@esbuild/linux-mips64el": "0.19.10", + "@esbuild/linux-ppc64": "0.19.10", + "@esbuild/linux-riscv64": "0.19.10", + "@esbuild/linux-s390x": "0.19.10", + "@esbuild/linux-x64": "0.19.10", + "@esbuild/netbsd-x64": "0.19.10", + "@esbuild/openbsd-x64": "0.19.10", + "@esbuild/sunos-x64": "0.19.10", + "@esbuild/win32-arm64": "0.19.10", + "@esbuild/win32-ia32": "0.19.10", + "@esbuild/win32-x64": "0.19.10" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-regexp": { + "version": "0.0.1" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.56.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.1.tgz", + "integrity": "sha512-WQpV3mSmIobb77s4qiCZu3dBrZZ0rj8ckSfBtRrgNK9Wnh2s3eiaxNTWloz1LJ1WtvqZES/PAI7PLvsrGt/CEA==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "5.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/external-editor/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-content-type-parse": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-1.1.0.tgz", + "integrity": "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==" + }, + "node_modules/fast-copy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", + "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" + }, + "node_modules/fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stringify": { + "version": "5.8.0", + "license": "MIT", + "dependencies": { + "@fastify/deepmerge": "^1.0.0", + "ajv": "^8.10.0", + "ajv-formats": "^2.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^2.1.0", + "rfdc": "^1.2.0" + } + }, + "node_modules/fast-json-stringify/node_modules/ajv": { + "version": "8.12.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fast-json-stringify/node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-querystring": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", + "dependencies": { + "fast-decode-uri-component": "^1.0.1" + } + }, + "node_modules/fast-redact": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "node_modules/fast-uri": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/fastify": { + "version": "4.28.1", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-4.28.1.tgz", + "integrity": "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "dependencies": { + "@fastify/ajv-compiler": "^3.5.0", + "@fastify/error": "^3.4.0", + "@fastify/fast-json-stringify-compiler": "^4.3.0", + "abstract-logging": "^2.0.1", + "avvio": "^8.3.0", + "fast-content-type-parse": "^1.1.0", + "fast-json-stringify": "^5.8.0", + "find-my-way": "^8.0.0", + "light-my-request": "^5.11.0", + "pino": "^9.0.0", + "process-warning": "^3.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.3.0", + "secure-json-parse": "^2.7.0", + "semver": "^7.5.4", + "toad-cache": "^3.3.0" + } + }, + "node_modules/fastify-plugin": { + "version": "4.5.1", + "license": "MIT" + }, + "node_modules/fastify/node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/fastify/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/fastify/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "node_modules/fastify/node_modules/pino/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, + "node_modules/fastify/node_modules/process-warning": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", + "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" + }, + "node_modules/fastify/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/fastify/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/fastify/node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/find-my-way": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-8.2.0.tgz", + "integrity": "sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-querystring": "^1.0.0", + "safe-regex2": "^3.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/funtypes": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/funtypes/-/funtypes-4.2.0.tgz", + "integrity": "sha512-DvOtjiKvkeuXGV0O8LQh9quUP3bSOTEQPGv537Sao8kDq2rDbg48UsSJ7wlBLPzR2Mn0pV7cyAiq5pYG1oUyCQ==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "dependencies": { + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/get-pkg-repo/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/get-pkg-repo/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/get-pkg-repo/node_modules/through2": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", + "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-raw-commits/node_modules/split2": { + "version": "3.2.2", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-semver-tags": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^8.0.0", + "semver": "^6.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-semver-tags/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "dev": true, + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.6", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gud": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/handlebars": { + "version": "4.7.8", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "dependencies": { + "get-intrinsic": "^1.2.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", + "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/husky": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "bin": { + "husky": "lib/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/i18next": { + "version": "22.5.1", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.6" + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.19.4" + } + }, + "node_modules/i18next-http-backend": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "cross-fetch": "3.1.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-in-the-middle": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.11.0.tgz", + "integrity": "sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==", + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflection": { + "version": "1.13.4", + "engines": [ + "node >= 0.4.0" + ], + "license": "MIT" + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/inquirer": { + "version": "9.3.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.3.6.tgz", + "integrity": "sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==", + "dependencies": { + "@inquirer/figures": "^1.0.3", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/inquirer/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/interrogator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/interrogator/-/interrogator-2.0.1.tgz", + "integrity": "sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==", + "dependencies": { + "inquirer": "^9.1.4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "license": "MIT", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-module": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.6", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/joycon": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", + "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js2xmlparser": { + "version": "4.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "xmlcreate": "^2.0.4" + } + }, + "node_modules/jsdoc": { + "version": "4.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@babel/parser": "^7.20.15", + "@jsdoc/salty": "^0.2.1", + "@types/markdown-it": "^12.2.3", + "bluebird": "^3.7.2", + "catharsis": "^0.9.0", + "escape-string-regexp": "^2.0.0", + "js2xmlparser": "^4.0.2", + "klaw": "^3.0.0", + "markdown-it": "^12.3.2", + "markdown-it-anchor": "^8.4.1", + "marked": "^4.0.10", + "mkdirp": "^1.0.4", + "requizzle": "^0.2.3", + "strip-json-comments": "^3.1.0", + "underscore": "~1.13.2" + }, + "bin": { + "jsdoc": "jsdoc.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdoc/node_modules/entities": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/jsdoc/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdoc/node_modules/linkify-it": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/jsdoc/node_modules/markdown-it": { + "version": "12.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jw-paginate": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/light-my-request": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-5.11.0.tgz", + "integrity": "sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==", + "dependencies": { + "cookie": "^0.5.0", + "process-warning": "^2.0.0", + "set-cookie-parser": "^2.4.1" + } + }, + "node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/linkifyjs": { + "version": "4.1.1", + "license": "MIT" + }, + "node_modules/lint-staged": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.0.tgz", + "integrity": "sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==", + "dev": true, + "dependencies": { + "chalk": "5.3.0", + "commander": "11.1.0", + "debug": "4.3.4", + "execa": "8.0.1", + "lilconfig": "3.0.0", + "listr2": "8.0.0", + "micromatch": "4.0.5", + "pidtree": "0.6.0", + "string-argv": "0.3.2", + "yaml": "2.3.4" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", + "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/listr2": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.0.tgz", + "integrity": "sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.0.0", + "rfdc": "^1.3.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/local-pkg": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", + "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", + "dependencies": { + "mlly": "^1.4.2", + "pkg-types": "^1.0.3" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "license": "MIT" + }, + "node_modules/lodash.startswith": { + "version": "4.2.1", + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-update": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.0.0.tgz", + "integrity": "sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==", + "dev": true, + "dependencies": { + "ansi-escapes": "^6.2.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^7.0.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", + "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.0.0.tgz", + "integrity": "sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/loglevel": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-colored-level-prefix": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^1.1.3", + "loglevel": "^1.4.1" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/chalk": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/magicast": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.4.tgz", + "integrity": "sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-it": { + "version": "13.0.1", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it-anchor": { + "version": "8.6.7", + "dev": true, + "license": "Unlicense", + "peerDependencies": { + "@types/markdown-it": "*", + "markdown-it": "*" + } + }, + "node_modules/marked": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/mdurl": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "license": "MIT" + }, + "node_modules/meow": { + "version": "8.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mlly": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz", + "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==", + "dependencies": { + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/module-details-from-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==" + }, + "node_modules/moment": { + "version": "2.29.4", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.43", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.66.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.66.0.tgz", + "integrity": "sha512-J3ygyG8cTcn5TVzpHYEBE6zHN4uVoj6wKMS946b19VYGhVpGgR5mB3OK2oBTe0l3Bpsj5/h+TAblq0K8Ec9cRQ==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.omit": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "is-extendable": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-exit-leak-free": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/opentelemetry-instrumentation-fetch-node/-/opentelemetry-instrumentation-fetch-node-1.2.3.tgz", + "integrity": "sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==", + "optional": true, + "dependencies": { + "@opentelemetry/instrumentation": "^0.46.0", + "@opentelemetry/semantic-conventions": "^1.17.0" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.6.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/@opentelemetry/instrumentation": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.46.0.tgz", + "integrity": "sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==", + "optional": true, + "dependencies": { + "@types/shimmer": "^1.0.2", + "import-in-the-middle": "1.7.1", + "require-in-the-middle": "^7.1.1", + "semver": "^7.5.2", + "shimmer": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/opentelemetry-instrumentation-fetch-node/node_modules/import-in-the-middle": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-1.7.1.tgz", + "integrity": "sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==", + "optional": true, + "dependencies": { + "acorn": "^8.8.2", + "acorn-import-assertions": "^1.9.0", + "cjs-module-lexer": "^1.2.2", + "module-details-from-path": "^1.0.3" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "6.3.1", + "license": "MIT", + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "license": "MIT" + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/parameter-reducers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/parameter-reducers/-/parameter-reducers-2.1.0.tgz", + "integrity": "sha512-aj9V6DUnNbj4YEmVxloPLX9duhklIC+SIOVUrVdaT3WfgEownET+TYg/JsjANQUNGe46dmOCHEKiuycL36cOnw==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pg": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.12.0.tgz", + "integrity": "sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==", + "dependencies": { + "pg-connection-string": "^2.6.4", + "pg-pool": "^3.6.2", + "pg-protocol": "^1.6.1", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.4.tgz", + "integrity": "sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==" + }, + "node_modules/pg-cursor": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/pg-cursor/-/pg-cursor-2.11.0.tgz", + "integrity": "sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==", + "peerDependencies": { + "pg": "^8" + } + }, + "node_modules/pg-hstore": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/pg-hstore/-/pg-hstore-2.3.4.tgz", + "integrity": "sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==", + "dependencies": { + "underscore": "^1.13.1" + }, + "engines": { + "node": ">= 0.8.x" + } + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-numeric": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pg-numeric/-/pg-numeric-1.0.2.tgz", + "integrity": "sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg-pool": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.2.tgz", + "integrity": "sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.1.tgz", + "integrity": "sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==" + }, + "node_modules/pg-types": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-4.0.2.tgz", + "integrity": "sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==", + "dependencies": { + "pg-int8": "1.0.1", + "pg-numeric": "1.0.2", + "postgres-array": "~3.0.1", + "postgres-bytea": "~3.0.0", + "postgres-date": "~2.1.0", + "postgres-interval": "^3.0.0", + "postgres-range": "^1.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pg/node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/pg/node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pg/node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pino": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.17.1.tgz", + "integrity": "sha512-YoN7/NJgnsJ+fkADZqjhRt96iepWBndQHeClmSBH0sQWCb8zGD74t00SK4eOtKFi/f8TUmQnfmgglEhd2kI1RQ==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "v1.1.0", + "pino-std-serializers": "^6.0.0", + "process-warning": "^2.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^3.7.0", + "thread-stream": "^2.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", + "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "node_modules/pino-abstract-transport/node_modules/readable-stream": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", + "integrity": "sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", + "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "dependencies": { + "colorette": "^2.0.7", + "dateformat": "^4.6.3", + "fast-copy": "^3.0.2", + "fast-safe-stringify": "^2.1.1", + "help-me": "^5.0.0", + "joycon": "^3.1.1", + "minimist": "^1.2.6", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.0.0", + "pump": "^3.0.0", + "readable-stream": "^4.0.0", + "secure-json-parse": "^2.4.0", + "sonic-boom": "^4.0.1", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "pino-pretty": "bin.js" + } + }, + "node_modules/pino-pretty/node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "engines": { + "node": "*" + } + }, + "node_modules/pino-pretty/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/pino-pretty/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "6.2.2", + "license": "MIT" + }, + "node_modules/pirates": { + "version": "4.0.6", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/polished": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss": { + "version": "8.4.41", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", + "integrity": "sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postgres-array": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-3.0.2.tgz", + "integrity": "sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-bytea": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-3.0.0.tgz", + "integrity": "sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==", + "dependencies": { + "obuf": "~1.1.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postgres-date": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-2.1.0.tgz", + "integrity": "sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-interval": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-3.0.0.tgz", + "integrity": "sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/postgres-range": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/postgres-range/-/postgres-range-1.1.4.tgz", + "integrity": "sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.1.1.tgz", + "integrity": "sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-eslint": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-16.2.0.tgz", + "integrity": "sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==", + "dev": true, + "dependencies": { + "@typescript-eslint/parser": "^6.7.5", + "common-tags": "^1.4.0", + "dlv": "^1.1.0", + "eslint": "^8.7.0", + "indent-string": "^4.0.0", + "lodash.merge": "^4.6.0", + "loglevel-colored-level-prefix": "^1.0.0", + "prettier": "^3.0.1", + "pretty-format": "^29.7.0", + "require-relative": "^0.8.7", + "typescript": "^5.2.2", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.10.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/process-warning": { + "version": "2.2.0", + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/prosemirror-changeset": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-collab": { + "version": "1.3.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.5.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.0.0", + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "^1.0.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.11.2", + "license": "MIT", + "dependencies": { + "markdown-it": "^13.0.1", + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-menu": { + "version": "1.2.4", + "license": "MIT", + "dependencies": { + "crelt": "^1.0.0", + "prosemirror-commands": "^1.0.0", + "prosemirror-history": "^1.0.0", + "prosemirror-state": "^1.0.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.19.3", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-basic": { + "version": "1.2.2", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.19.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.3", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.3.4", + "license": "MIT", + "dependencies": { + "prosemirror-keymap": "^1.1.2", + "prosemirror-model": "^1.8.1", + "prosemirror-state": "^1.3.1", + "prosemirror-transform": "^1.2.1", + "prosemirror-view": "^1.13.3" + } + }, + "node_modules/prosemirror-trailing-node": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "@remirror/core-constants": "^2.0.2", + "@remirror/core-helpers": "^3.0.0", + "escape-string-regexp": "^4.0.0" + }, + "peerDependencies": { + "prosemirror-model": "^1.19.0", + "prosemirror-state": "^1.4.2", + "prosemirror-view": "^1.31.2" + } + }, + "node_modules/prosemirror-trailing-node/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.7.5", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.31.7", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.16.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/raf-schd": { + "version": "4.0.3", + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-currency-input-field": { + "version": "3.6.11", + "license": "MIT", + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-datepicker": { + "version": "4.16.0", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.11.8", + "classnames": "^2.2.6", + "date-fns": "^2.30.0", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.12.2", + "react-popper": "^2.3.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-feather": { + "version": "2.0.10", + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/react-i18next": { + "version": "12.3.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.20.6", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 19.0.0", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "license": "MIT" + }, + "node_modules/react-onclickoutside": { + "version": "6.13.0", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-phone-input-2": { + "version": "2.15.1", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.6", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.reduce": "^4.6.0", + "lodash.startswith": "^4.2.1", + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0", + "react-dom": "^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0" + } + }, + "node_modules/react-popper": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-redux": { + "version": "8.1.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.15.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.8.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.15.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.8.0", + "react-router": "6.15.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-select": { + "version": "5.7.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-text-mask": { + "version": "5.5.0", + "license": "Unlicense", + "dependencies": { + "prop-types": "^15.5.6" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-try": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/real-require": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-in-the-middle": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz", + "integrity": "sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3", + "resolve": "^1.22.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/require-in-the-middle/node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/require-relative": { + "version": "0.8.7", + "dev": true, + "license": "MIT" + }, + "node_modules/requizzle": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ret": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.4.3.tgz", + "integrity": "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry-as-promised": { + "version": "7.0.4", + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "dev": true, + "dependencies": { + "glob": "^10.3.7" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.0", + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-polyfill-node": { + "version": "0.12.0", + "license": "MIT", + "dependencies": { + "@rollup/plugin-inject": "^5.0.1" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "license": "MIT" + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rusty-motors-cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/rusty-motors-database": { + "resolved": "packages/database", + "link": true + }, + "node_modules/rusty-motors-gateway": { + "resolved": "packages/gateway", + "link": true + }, + "node_modules/rusty-motors-mcots": { + "resolved": "packages/mcots", + "link": true + }, + "node_modules/rusty-motors-nps": { + "resolved": "packages/nps", + "link": true + }, + "node_modules/rusty-motors-patch": { + "resolved": "packages/patch", + "link": true + }, + "node_modules/rusty-motors-shard": { + "resolved": "packages/shard", + "link": true + }, + "node_modules/rusty-motors-shared": { + "resolved": "packages/shared", + "link": true + }, + "node_modules/rusty-motors-shared-packets": { + "resolved": "packages/shared-packets", + "link": true + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-regex2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-3.1.0.tgz", + "integrity": "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==", + "dependencies": { + "ret": "~0.4.0" + } + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/secure-json-parse": { + "version": "2.7.0", + "license": "BSD-3-Clause" + }, + "node_modules/semver": { + "version": "7.5.4", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/sequelize": { + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/sequelize" + } + ], + "dependencies": { + "@types/debug": "^4.1.8", + "@types/validator": "^13.7.17", + "debug": "^4.3.4", + "dottie": "^2.0.6", + "inflection": "^1.13.4", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "moment-timezone": "^0.5.43", + "pg-connection-string": "^2.6.1", + "retry-as-promised": "^7.0.4", + "semver": "^7.5.4", + "sequelize-pool": "^7.1.0", + "toposort-class": "^1.0.1", + "uuid": "^8.3.2", + "validator": "^13.9.0", + "wkx": "^0.5.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependenciesMeta": { + "ibm_db": { + "optional": true + }, + "mariadb": { + "optional": true + }, + "mysql2": { + "optional": true + }, + "oracledb": { + "optional": true + }, + "pg": { + "optional": true + }, + "pg-hstore": { + "optional": true + }, + "snowflake-sdk": { + "optional": true + }, + "sqlite3": { + "optional": true + }, + "tedious": { + "optional": true + } + } + }, + "node_modules/sequelize-pool": { + "version": "7.1.0", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/sequelize/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shimmer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" + }, + "node_modules/short-unique-id": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/short-unique-id/-/short-unique-id-5.2.0.tgz", + "integrity": "sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==", + "bin": { + "short-unique-id": "bin/short-unique-id", + "suid": "bin/short-unique-id" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/slash": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smob": { + "version": "1.4.0", + "license": "MIT" + }, + "node_modules/sonic-boom": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.7.0.tgz", + "integrity": "sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/split": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/sqlite": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/sqlite/-/sqlite-5.1.1.tgz", + "integrity": "sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==" + }, + "node_modules/stackback": { + "version": "0.0.2", + "license": "MIT" + }, + "node_modules/standard-version": { + "version": "9.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "chalk": "^2.4.2", + "conventional-changelog": "3.1.25", + "conventional-changelog-config-spec": "2.1.0", + "conventional-changelog-conventionalcommits": "4.6.3", + "conventional-recommended-bump": "6.1.0", + "detect-indent": "^6.0.0", + "detect-newline": "^3.1.0", + "dotgitignore": "^2.1.0", + "figures": "^3.1.0", + "find-up": "^5.0.0", + "git-semver-tags": "^4.0.0", + "semver": "^7.1.1", + "stringify-package": "^1.0.1", + "yargs": "^16.0.0" + }, + "bin": { + "standard-version": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", + "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==" + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-package": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", + "dependencies": { + "js-tokens": "^9.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==" + }, + "node_modules/styled-components": { + "version": "5.3.9", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/@emotion/unitless": { + "version": "0.7.5", + "license": "MIT" + }, + "node_modules/styled-system": { + "version": "5.1.5", + "license": "MIT", + "dependencies": { + "@styled-system/background": "^5.1.2", + "@styled-system/border": "^5.1.5", + "@styled-system/color": "^5.1.2", + "@styled-system/core": "^5.1.2", + "@styled-system/flexbox": "^5.1.2", + "@styled-system/grid": "^5.1.2", + "@styled-system/layout": "^5.1.2", + "@styled-system/position": "^5.1.2", + "@styled-system/shadow": "^5.1.2", + "@styled-system/space": "^5.1.2", + "@styled-system/typography": "^5.1.2", + "@styled-system/variant": "^5.1.5", + "object-assign": "^4.1.1" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/terser": { + "version": "5.19.4", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-mask-addons": { + "version": "3.8.0", + "license": "Unlicense" + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/thread-stream": { + "version": "2.4.0", + "license": "MIT", + "dependencies": { + "real-require": "^0.2.0" + } + }, + "node_modules/throttle-debounce": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/tinybench": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.1.tgz", + "integrity": "sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==" + }, + "node_modules/tinypool": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", + "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", + "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toad-cache": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", + "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/toposort-class": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.7.0.tgz", + "integrity": "sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==", + "dev": true, + "dependencies": { + "esbuild": "~0.19.10", + "get-tsconfig": "^4.7.2" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint-language-service": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@typescript-eslint/parser": ">= 5.0.0", + "eslint": ">= 8.0.0", + "typescript": ">= 4.0.0" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==" + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uppercamelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/uppercamelcase/-/uppercamelcase-3.0.0.tgz", + "integrity": "sha512-zTWmRiOJACCdFGWjzye3L5cjSuVdZ/c8C0iHIwVbfORFD8IhGNAO6BOWkZ+fj+SI6/aFbdjGXE6gwPG780H4gQ==", + "dependencies": { + "camelcase": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/uppercamelcase/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-memo-one": { + "version": "1.1.3", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validator": { + "version": "13.11.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.1.tgz", + "integrity": "sha512-1oE6yuNXssjrZdblI9AfBbHCC41nnyoVoEZxQnID6yvQZAFBzxxkqoFLtHUMkYunL8hwOLEjgTuxpkRxvba3kA==", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.41", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.21.0.tgz", + "integrity": "sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==", + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.21.0", + "@rollup/rollup-android-arm64": "4.21.0", + "@rollup/rollup-darwin-arm64": "4.21.0", + "@rollup/rollup-darwin-x64": "4.21.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.21.0", + "@rollup/rollup-linux-arm-musleabihf": "4.21.0", + "@rollup/rollup-linux-arm64-gnu": "4.21.0", + "@rollup/rollup-linux-arm64-musl": "4.21.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.21.0", + "@rollup/rollup-linux-riscv64-gnu": "4.21.0", + "@rollup/rollup-linux-s390x-gnu": "4.21.0", + "@rollup/rollup-linux-x64-gnu": "4.21.0", + "@rollup/rollup-linux-x64-musl": "4.21.0", + "@rollup/rollup-win32-arm64-msvc": "4.21.0", + "@rollup/rollup-win32-ia32-msvc": "4.21.0", + "@rollup/rollup-win32-x64-msvc": "4.21.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/vitest": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", + "acorn-walk": "^8.3.2", + "chai": "^4.3.10", + "debug": "^4.3.4", + "execa": "^8.0.1", + "local-pkg": "^0.5.0", + "magic-string": "^0.30.5", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.5.0", + "strip-literal": "^2.0.0", + "tinybench": "^2.5.1", + "tinypool": "^0.8.3", + "vite": "^5.0.0", + "vite-node": "1.6.0", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz", + "integrity": "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/warning": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wkx": { + "version": "0.5.0", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/xmlcreate": { + "version": "2.0.4", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/xss": { + "version": "1.0.14", + "license": "MIT", + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli": { + "name": "rusty-motors-cli", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "rusty-motors-shared": "^1.0.0", + "rusty-motors-shared-packets": "^1.0.0" + }, + "devDependencies": { + "@vitest/coverage-v8": "1.6.0" + } + }, + "packages/connection": { + "name": "rusty-motors-connection", + "version": "1.0.0", + "extraneous": true, + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "vitest": "^1.6.0" + } + }, + "packages/database": { + "name": "rusty-motors-database", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@databases/pg": "^5.5.0", + "@databases/pg-schema-cli": "^4.4.0", + "@databases/pg-typed": "^4.4.1", + "@sentry/node": "^8.0.0", + "@types/pg": "^8.11.6", + "pg": "^8.11.5", + "pg-hstore": "^2.3.4", + "vitest": "^1.6.0" + } + }, + "packages/database/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/database/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/database/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/database/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway": { + "name": "rusty-motors-gateway", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2", + "vitest": "^1.6.0" + } + }, + "packages/gateway/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/gateway/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/gateway/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots": { + "name": "rusty-motors-mcots", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + } + }, + "packages/mcots/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/mcots/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/mcots/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/nps": { + "name": "rusty-motors-nps", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + } + }, + "packages/nps/node_modules/@sentry/core": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.26.0.tgz", + "integrity": "sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==", + "dependencies": { + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/nps/node_modules/@sentry/node": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-8.26.0.tgz", + "integrity": "sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==", + "dependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/context-async-hooks": "^1.25.1", + "@opentelemetry/core": "^1.25.1", + "@opentelemetry/instrumentation": "^0.52.1", + "@opentelemetry/instrumentation-connect": "0.38.0", + "@opentelemetry/instrumentation-express": "0.41.1", + "@opentelemetry/instrumentation-fastify": "0.38.0", + "@opentelemetry/instrumentation-fs": "0.14.0", + "@opentelemetry/instrumentation-graphql": "0.42.0", + "@opentelemetry/instrumentation-hapi": "0.40.0", + "@opentelemetry/instrumentation-http": "0.52.1", + "@opentelemetry/instrumentation-ioredis": "0.42.0", + "@opentelemetry/instrumentation-koa": "0.42.0", + "@opentelemetry/instrumentation-mongodb": "0.46.0", + "@opentelemetry/instrumentation-mongoose": "0.40.0", + "@opentelemetry/instrumentation-mysql": "0.40.0", + "@opentelemetry/instrumentation-mysql2": "0.40.0", + "@opentelemetry/instrumentation-nestjs-core": "0.39.0", + "@opentelemetry/instrumentation-pg": "0.43.0", + "@opentelemetry/instrumentation-redis-4": "0.41.0", + "@opentelemetry/resources": "^1.25.1", + "@opentelemetry/sdk-trace-base": "^1.25.1", + "@opentelemetry/semantic-conventions": "^1.25.1", + "@prisma/instrumentation": "5.17.0", + "@sentry/core": "8.26.0", + "@sentry/opentelemetry": "8.26.0", + "@sentry/types": "8.26.0", + "@sentry/utils": "8.26.0", + "import-in-the-middle": "^1.11.0" + }, + "engines": { + "node": ">=14.18" + }, + "optionalDependencies": { + "opentelemetry-instrumentation-fetch-node": "1.2.3" + } + }, + "packages/nps/node_modules/@sentry/types": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.26.0.tgz", + "integrity": "sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==", + "engines": { + "node": ">=14.18" + } + }, + "packages/nps/node_modules/@sentry/utils": { + "version": "8.26.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.26.0.tgz", + "integrity": "sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==", + "dependencies": { + "@sentry/types": "8.26.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "packages/patch": { + "name": "rusty-motors-patch", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + } + }, + "packages/shard": { + "name": "rusty-motors-shard", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + } + }, + "packages/shared": { + "name": "rusty-motors-shared", + "version": "1.0.0", + "license": "AGPL-3.0", + "dependencies": { + "fastify": "^4.27.0", + "pino": "^9.0.0", + "pino-pretty": "^11.0.0", + "vitest": "^1.6.0" + } + }, + "packages/shared-packets": { + "name": "rusty-motors-shared-packets", + "version": "1.0.0", + "license": "AGPL-3.0" + }, + "packages/shared/node_modules/pino": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.3.2.tgz", + "integrity": "sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.1.1", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^1.2.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^4.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" + }, + "bin": { + "pino": "bin.js" + } + }, + "packages/shared/node_modules/pino-abstract-transport": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", + "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "dependencies": { + "readable-stream": "^4.0.0", + "split2": "^4.0.0" + } + }, + "packages/shared/node_modules/pino-std-serializers": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz", + "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==" + }, + "packages/shared/node_modules/process-warning": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz", + "integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==" + }, + "packages/shared/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "packages/shared/node_modules/sonic-boom": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.0.1.tgz", + "integrity": "sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "packages/shared/node_modules/thread-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz", + "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==", + "dependencies": { + "real-require": "^0.2.0" + } + } + } } diff --git a/package.json b/package.json index 9fa068a09..4d7d13d9c 100644 --- a/package.json +++ b/package.json @@ -1,102 +1,92 @@ { - "name": "mcos", - "version": "1.0.0", - "description": "a server", - "author": "Drazi Crendraven ", - "license": "AGPL-3.0", - "private": true, - "repository": { - "type": "git", - "url": "git@github.com:drazisil/mcos.git" - }, - "scripts": { - "clean": "rm --verbose -rf **/node_modules node_modules", - "start": "tsx --openssl-legacy-provider --env-file=.env ./apps/main/server.ts", - "test": "npm run test:all", - "test:all": "npm run test --workspaces --if-present", - "start:dev": "tsx --openssl-legacy-provider server.ts", - "types:db": "npm --workspace rusty-motors-database run types:db", - "migrate": "pg-migrations apply --directory migrations " - }, - "files": [ - "README.md", - "CHANGELOG.md", - "AUTHORS" - ], - "type": "module", - "dependencies": { - "@adminjs/sequelize": "^4.1.1", - "@fastify/sensible": "^5.5.0", - "@sentry/node": "7.88", - "@sentry/profiling-node": "^1.3.2", - "adminjs": "^7.5.2", - "fastify": "^4.25.1", - "moment": "^2.29.4", - "pino": "^8.17.1", - "sequelize": "^6.35.2", - "sqlite": "^5.1.1", - "ts-node": "10.9.2" - }, - "workspaces": [ - "apps/main", - "packages/cli", - "packages/connection", - "packages/database", - "packages/gateway", - "packages/mcots", - "packages/nps", - "packages/patch", - "packages/shard", - "packages/shared", - "packages/shared-packets" - ], - "devDependencies": { - "@sentry/cli": "^2.23.1", - "@tsconfig/node-lts": "^20.1.0", - "@tsconfig/node20": "^20.1.2", - "@types/chai": "4.3.11", - "@types/node": "^20.10.5", - "@types/sinon": "17.0.2", - "@types/sinon-chai": "3.2.12", - "@typescript-eslint/eslint-plugin": "^6.15.0", - "@typescript-eslint/parser": "^6.15.0", - "@vitest/coverage-v8": "^1.1.0", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "5.1.1", - "husky": "^8.0.3", - "jsdoc": "^4.0.2", - "lint-staged": "^15.2.0", - "prettier": "3.1.1", - "prettier-eslint": "16.2.0", - "rimraf": "^5.0.5", - "standard-version": "^9.5.0", - "tsx": "4.7.0", - "typescript": "^5.3.3", - "typescript-eslint-language-service": "^5.0.5", - "vitest": "^1.1.0" - }, - "c8": { - "all": true, - "reporter": [ - "text", - "cobertura", - "html", - "lcov" - ], - "exclude": [ - "coverage", - "**/*.test.m{j,t}s", - "docs", - "docs2" - ] - }, - "lint-staged": { - "**/*.js": "eslint" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - } + "name": "mcos", + "version": "1.0.0", + "description": "a server", + "author": "Drazi Crendraven ", + "license": "AGPL-3.0", + "private": true, + "repository": { + "type": "git", + "url": "git@github.com:drazisil/mcos.git" + }, + "scripts": { + "clean": "rm --verbose -rf **/node_modules node_modules", + "start": "make start", + "check:all": "npm run check --workspaces --if-present", + "lint:all": "npm run lint --workspaces --if-present", + "format:all": "npm run format --workspaces --if-present", + "test": "npm run test:all", + "test:all": "npm run test --workspaces --if-present", + "start:dev": "tsx --openssl-legacy-provider server.ts", + "types:db": "npm --workspace rusty-motors-database run types:db", + "migrate": "pg-migrations apply --directory migrations " + }, + "files": ["README.md", "CHANGELOG.md", "AUTHORS"], + "type": "module", + "dependencies": { + "@adminjs/sequelize": "^4.1.1", + "@fastify/sensible": "^5.5.0", + "@sentry/node": "7.88", + "@sentry/profiling-node": "^1.3.2", + "adminjs": "^7.5.2", + "fastify": "^4.25.1", + "moment": "^2.29.4", + "pino": "^8.17.1", + "sequelize": "^6.35.2", + "sqlite": "^5.1.1", + "ts-node": "10.9.2" + }, + "workspaces": [ + "apps/main", + "packages/cli", + "packages/connection", + "packages/database", + "packages/gateway", + "packages/mcots", + "packages/nps", + "packages/patch", + "packages/shard", + "packages/shared", + "packages/shared-packets" + ], + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@sentry/cli": "^2.23.1", + "@tsconfig/node-lts": "^20.1.0", + "@tsconfig/node20": "^20.1.2", + "@types/chai": "4.3.11", + "@types/node": "^20.10.5", + "@types/sinon": "17.0.2", + "@types/sinon-chai": "3.2.12", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "@typescript-eslint/parser": "^6.15.0", + "@vitest/coverage-v8": "^1.1.0", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "5.1.1", + "husky": "^8.0.3", + "jsdoc": "^4.0.2", + "lint-staged": "^15.2.0", + "prettier": "3.1.1", + "prettier-eslint": "16.2.0", + "rimraf": "^5.0.5", + "standard-version": "^9.5.0", + "tsx": "4.7.0", + "typescript": "^5.3.3", + "typescript-eslint-language-service": "^5.0.5", + "vitest": "^1.1.0" + }, + "c8": { + "all": true, + "reporter": ["text", "cobertura", "html", "lcov"], + "exclude": ["coverage", "**/*.test.m{j,t}s", "docs", "docs2"] + }, + "lint-staged": { + "**/*.js": "eslint" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + } } diff --git a/packages/cli/ConsoleThread.ts b/packages/cli/ConsoleThread.ts index 7d50f4943..283e0620e 100644 --- a/packages/cli/ConsoleThread.ts +++ b/packages/cli/ConsoleThread.ts @@ -1,7 +1,7 @@ import { emitKeypressEvents } from "node:readline"; -import { SubThread } from "../shared/SubThread.js"; // eslint-disable-next-line no-unused-vars import { Gateway } from "../gateway/src/GatewayServer.js"; +import { SubThread } from "../shared/SubThread.js"; import { ServerError } from "../shared/errors/ServerError.js"; /** @@ -12,71 +12,71 @@ import { ServerError } from "../shared/errors/ServerError.js"; * Console thread */ export class ConsoleThread extends SubThread { - parentThread: Gateway; - /** - * @param {object} options - * @param {Gateway} options.parentThread The parent thread - * @param {import("pino").Logger} options.log The logger - */ - constructor({ - parentThread, - log, - }: { - parentThread: Gateway; - log: import("pino").Logger; - }) { - super("ReadInput", log, 100); - if (parentThread === undefined) { - throw new ServerError( - "parentThread is undefined when creating ReadInput", - ); - } - this.parentThread = parentThread; - } + parentThread: Gateway; + /** + * @param {object} options + * @param {Gateway} options.parentThread The parent thread + * @param {import("pino").Logger} options.log The logger + */ + constructor({ + parentThread, + log, + }: { + parentThread: Gateway; + log: import("pino").Logger; + }) { + super("ReadInput", log, 100); + if (parentThread === undefined) { + throw new ServerError( + "parentThread is undefined when creating ReadInput", + ); + } + this.parentThread = parentThread; + } - /** @param {import("../interfaces/index.js").KeypressEvent} key */ - handleKeypressEvent(key: import("../interfaces/index.js").KeypressEvent) { - const keyString = key.sequence; + /** @param {import("../interfaces/index.js").KeypressEvent} key */ + handleKeypressEvent(key: import("../interfaces/index.js").KeypressEvent) { + const keyString = key.sequence; - if (keyString === "x") { - this.emit("userExit"); - } + if (keyString === "x") { + this.emit("userExit"); + } - if (keyString === "r") { - this.emit("userRestart"); - } + if (keyString === "r") { + this.emit("userRestart"); + } - if (keyString === "?") { - this.emit("userHelp"); - } - } + if (keyString === "?") { + this.emit("userHelp"); + } + } - override init() { - super.init(); - emitKeypressEvents(process.stdin); - if (process.stdin.isTTY) { - process.stdin.setRawMode(true); - } + override init() { + super.init(); + emitKeypressEvents(process.stdin); + if (process.stdin.isTTY) { + process.stdin.setRawMode(true); + } - this.log.info("GatewayServer started"); - this.log.info("Press x to quit"); + this.log.info("GatewayServer started"); + this.log.info("Press x to quit"); - process.stdin.resume(); - process.stdin.on("keypress", (str, key) => { - if (key !== undefined) { - this.handleKeypressEvent(key); - } - }); - } + process.stdin.resume(); + process.stdin.on("keypress", (str, key) => { + if (key !== undefined) { + this.handleKeypressEvent(key); + } + }); + } - override run() { - // Intentionally left blank - } + override run() { + // Intentionally left blank + } - stop() { - // Remove all listeners from stdin, preventing further input - process.stdin.removeAllListeners("keypress"); - process.stdin.pause(); - super.shutdown(); - } + stop() { + // Remove all listeners from stdin, preventing further input + process.stdin.removeAllListeners("keypress"); + process.stdin.pause(); + super.shutdown(); + } } diff --git a/packages/cli/package.json b/packages/cli/package.json index e38ca8108..8a4bf912d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,28 +1,28 @@ { - "name": "rusty-motors-cli", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "devDependencies": { - "@vitest/coverage-v8": "1.6.0" - }, - "dependencies": { - "rusty-motors-shared": "^1.0.0", - "rusty-motors-shared-packets": "^1.0.0" - }, - "description": "" + "name": "rusty-motors-cli", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npx prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "devDependencies": { + "@vitest/coverage-v8": "1.6.0" + }, + "dependencies": { + "rusty-motors-shared": "^1.0.0", + "rusty-motors-shared-packets": "^1.0.0" + }, + "description": "" } diff --git a/packages/cli/test/index.test.ts b/packages/cli/test/index.test.ts index f01d2f75d..1b1ba700e 100644 --- a/packages/cli/test/index.test.ts +++ b/packages/cli/test/index.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; describe("example", () => { - it("should pass", () => { - expect(true).toBe(true); - }); + it("should pass", () => { + expect(true).toBe(true); + }); }); diff --git a/packages/cli/vite.config.ts b/packages/cli/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/cli/vite.config.ts +++ b/packages/cli/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/core/src/serializationHelpers.test.ts b/packages/core/src/serializationHelpers.test.ts index ea8b97b6a..2fe247f86 100644 --- a/packages/core/src/serializationHelpers.test.ts +++ b/packages/core/src/serializationHelpers.test.ts @@ -1,337 +1,335 @@ -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; import { - serializeBool, - serializeByte, - serializeWord, - serializeDWord, - serializeFloat, - serializeString, - deserializeBool, - deserializeByte, - deserializeWord, - deserializeDWord, - deserializeFloat, - deserializeString, - sizeOfBool, - sizeOfByte, - sizeOfWord, - sizeOfDWord, - sizeOfFloat, - sizeOfString, - clamp16, - clamp32, + clamp16, + clamp32, + deserializeBool, + deserializeByte, + deserializeDWord, + deserializeFloat, + deserializeString, + deserializeWord, + serializeBool, + serializeByte, + serializeDWord, + serializeFloat, + serializeString, + serializeWord, + sizeOfBool, + sizeOfByte, + sizeOfDWord, + sizeOfFloat, + sizeOfString, + sizeOfWord, } from "./serializationHelpers.js"; describe("serializationHelpers", () => { - describe("serializeBool()", () => { - it("should serialize a boolean value", () => { - // Arrange - const input = true; - const expected = Buffer.from([1]); - - // Act - const actual = serializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should serialize a boolean value", () => { - // Arrange - const input = false; - const expected = Buffer.from([0]); - - // Act - const actual = serializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeBool()", () => { - it("should deserialize a boolean value", () => { - // Arrange - const input = Buffer.from([1]); - const expected = true; - - // Act - const actual = deserializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should deserialize a boolean value", () => { - // Arrange - const input = Buffer.from([0]); - const expected = false; - - // Act - const actual = deserializeBool(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfBool()", () => { - it("should return the size of a boolean value", () => { - // Arrange - const expected = 1; - - // Act - const actual = sizeOfBool(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeByte()", () => { - it("should serialize a byte value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([1]); - - // Act - const actual = serializeByte(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeByte()", () => { - it("should deserialize a byte value", () => { - // Arrange - const input = Buffer.from([1]); - const expected = 1; - - // Act - const actual = deserializeByte(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfByte()", () => { - it("should return the size of a byte value", () => { - // Arrange - const expected = 1; - - // Act - const actual = sizeOfByte(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeWord()", () => { - it("should serialize a word value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([0, 1]); - - // Act - const actual = serializeWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeWord()", () => { - it("should deserialize a word value", () => { - // Arrange - const input = Buffer.from([0, 1]); - const expected = 1; - - // Act - const actual = deserializeWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfWord()", () => { - it("should return the size of a word value", () => { - // Arrange - const expected = 2; - - // Act - const actual = sizeOfWord(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeDWord()", () => { - it("should serialize a dword value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([0, 0, 0, 1]); - - // Act - const actual = serializeDWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeDWord()", () => { - it("should deserialize a dword value", () => { - // Arrange - const input = Buffer.from([0, 0, 0, 1]); - const expected = 1; - - // Act - const actual = deserializeDWord(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfDWord()", () => { - it("should return the size of a dword value", () => { - // Arrange - const expected = 4; - - // Act - const actual = sizeOfDWord(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeFloat()", () => { - it("should serialize a float value", () => { - // Arrange - const input = 1; - const expected = Buffer.from([63, 128, 0, 0]); - - // Act - const actual = serializeFloat(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeFloat()", () => { - it("should deserialize a float value", () => { - // Arrange - const input = Buffer.from([63, 128, 0, 0]); - const expected = 1; - - // Act - const actual = deserializeFloat(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("sizeOfFloat()", () => { - it("should return the size of a float value", () => { - // Arrange - const expected = 4; - - // Act - const actual = sizeOfFloat(); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("serializeString()", () => { - it("should serialize a string value", () => { - // Arrange - const input = "test"; - const expected = Buffer.from([0, 4, 116, 101, 115, 116]); - - // Act - const actual = serializeString(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); - - describe("deserializeString()", () => { - it("should deserialize a string value", () => { - // Arrange - const input = Buffer.from([0, 4, 116, 101, 115, 116]); - const expected = "test"; - - // Act - const actual = deserializeString(input); - - // Assert - expect(actual).toEqual(expected); - }); - - it("should throw an error if the size is bigger than the buffer length - 2", () => { - // Arrange - const input = Buffer.from([0, 5, 116, 101, 115, 116]); - - // Act - const actual = () => deserializeString(input); - - // Assert - expect(actual).toThrowError( - "Size is bigger than the buffer length - 2", - ); - }); - }); - - describe("sizeOfString()", () => { - it("should return the size of a string value", () => { - // Arrange - const input = "test"; - const expected = 6; - - // Act - const actual = sizeOfString(input); - - // Assert - expect(actual).toEqual(expected); - }); - }); + describe("serializeBool()", () => { + it("should serialize a boolean value", () => { + // Arrange + const input = true; + const expected = Buffer.from([1]); + + // Act + const actual = serializeBool(input); + + // Assert + expect(actual).toEqual(expected); + }); + + it("should serialize a boolean value", () => { + // Arrange + const input = false; + const expected = Buffer.from([0]); + + // Act + const actual = serializeBool(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeBool()", () => { + it("should deserialize a boolean value", () => { + // Arrange + const input = Buffer.from([1]); + const expected = true; + + // Act + const actual = deserializeBool(input); + + // Assert + expect(actual).toEqual(expected); + }); + + it("should deserialize a boolean value", () => { + // Arrange + const input = Buffer.from([0]); + const expected = false; + + // Act + const actual = deserializeBool(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("sizeOfBool()", () => { + it("should return the size of a boolean value", () => { + // Arrange + const expected = 1; + + // Act + const actual = sizeOfBool(); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("serializeByte()", () => { + it("should serialize a byte value", () => { + // Arrange + const input = 1; + const expected = Buffer.from([1]); + + // Act + const actual = serializeByte(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeByte()", () => { + it("should deserialize a byte value", () => { + // Arrange + const input = Buffer.from([1]); + const expected = 1; + + // Act + const actual = deserializeByte(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("sizeOfByte()", () => { + it("should return the size of a byte value", () => { + // Arrange + const expected = 1; + + // Act + const actual = sizeOfByte(); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("serializeWord()", () => { + it("should serialize a word value", () => { + // Arrange + const input = 1; + const expected = Buffer.from([0, 1]); + + // Act + const actual = serializeWord(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeWord()", () => { + it("should deserialize a word value", () => { + // Arrange + const input = Buffer.from([0, 1]); + const expected = 1; + + // Act + const actual = deserializeWord(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("sizeOfWord()", () => { + it("should return the size of a word value", () => { + // Arrange + const expected = 2; + + // Act + const actual = sizeOfWord(); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("serializeDWord()", () => { + it("should serialize a dword value", () => { + // Arrange + const input = 1; + const expected = Buffer.from([0, 0, 0, 1]); + + // Act + const actual = serializeDWord(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeDWord()", () => { + it("should deserialize a dword value", () => { + // Arrange + const input = Buffer.from([0, 0, 0, 1]); + const expected = 1; + + // Act + const actual = deserializeDWord(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("sizeOfDWord()", () => { + it("should return the size of a dword value", () => { + // Arrange + const expected = 4; + + // Act + const actual = sizeOfDWord(); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("serializeFloat()", () => { + it("should serialize a float value", () => { + // Arrange + const input = 1; + const expected = Buffer.from([63, 128, 0, 0]); + + // Act + const actual = serializeFloat(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeFloat()", () => { + it("should deserialize a float value", () => { + // Arrange + const input = Buffer.from([63, 128, 0, 0]); + const expected = 1; + + // Act + const actual = deserializeFloat(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("sizeOfFloat()", () => { + it("should return the size of a float value", () => { + // Arrange + const expected = 4; + + // Act + const actual = sizeOfFloat(); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("serializeString()", () => { + it("should serialize a string value", () => { + // Arrange + const input = "test"; + const expected = Buffer.from([0, 4, 116, 101, 115, 116]); + + // Act + const actual = serializeString(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); + + describe("deserializeString()", () => { + it("should deserialize a string value", () => { + // Arrange + const input = Buffer.from([0, 4, 116, 101, 115, 116]); + const expected = "test"; + + // Act + const actual = deserializeString(input); + + // Assert + expect(actual).toEqual(expected); + }); + + it("should throw an error if the size is bigger than the buffer length - 2", () => { + // Arrange + const input = Buffer.from([0, 5, 116, 101, 115, 116]); + + // Act + const actual = () => deserializeString(input); + + // Assert + expect(actual).toThrowError("Size is bigger than the buffer length - 2"); + }); + }); + + describe("sizeOfString()", () => { + it("should return the size of a string value", () => { + // Arrange + const input = "test"; + const expected = 6; + + // Act + const actual = sizeOfString(input); + + // Assert + expect(actual).toEqual(expected); + }); + }); }); describe("clamp16()", () => { - it("should clamp a value between 0 and 65535", () => { - // Arrange - const input = 65536; - const expected = 65535; + it("should clamp a value between 0 and 65535", () => { + // Arrange + const input = 65536; + const expected = 65535; - // Act - const actual = clamp16(input); + // Act + const actual = clamp16(input); - // Assert - expect(actual).toEqual(expected); - }); + // Assert + expect(actual).toEqual(expected); + }); }); describe("clamp32()", () => { - it("should clamp a value between 0 and 4294967295", () => { - // Arrange - const input = 4294967296; - const expected = 4294967295; + it("should clamp a value between 0 and 4294967295", () => { + // Arrange + const input = 4294967296; + const expected = 4294967295; - // Act - const actual = clamp32(input); + // Act + const actual = clamp32(input); - // Assert - expect(actual).toEqual(expected); - }); + // Assert + expect(actual).toEqual(expected); + }); }); diff --git a/packages/core/src/serializationHelpers.ts b/packages/core/src/serializationHelpers.ts index 7d06b8247..b2b276835 100644 --- a/packages/core/src/serializationHelpers.ts +++ b/packages/core/src/serializationHelpers.ts @@ -6,7 +6,7 @@ import { ServerError } from "../../shared/errors/ServerError.js"; * @returns {number} */ export function clamp16(value: number): number { - return Math.max(0, Math.min(65535, value)); + return Math.max(0, Math.min(65535, value)); } /** @@ -15,7 +15,7 @@ export function clamp16(value: number): number { * @returns {number} */ export function clamp32(value: number): number { - return Math.max(0, Math.min(4294967295, value)); + return Math.max(0, Math.min(4294967295, value)); } /** @@ -24,11 +24,11 @@ export function clamp32(value: number): number { * @returns {Buffer} */ export function serializeBool(bool: boolean): Buffer { - const buf = Buffer.alloc(1); + const buf = Buffer.alloc(1); - buf.writeUInt8(bool ? 1 : 0); + buf.writeUInt8(bool ? 1 : 0); - return buf; + return buf; } /** @@ -37,11 +37,11 @@ export function serializeBool(bool: boolean): Buffer { * @returns {Buffer} */ export function serializeByte(byte: number): Buffer { - const buf = Buffer.alloc(1); + const buf = Buffer.alloc(1); - buf.writeUInt8(byte); + buf.writeUInt8(byte); - return buf; + return buf; } /** @@ -50,11 +50,11 @@ export function serializeByte(byte: number): Buffer { * @returns {Buffer} */ export function serializeWord(word: number): Buffer { - const buf = Buffer.alloc(2); + const buf = Buffer.alloc(2); - buf.writeUInt16BE(word); + buf.writeUInt16BE(word); - return buf; + return buf; } /** @@ -63,11 +63,11 @@ export function serializeWord(word: number): Buffer { * @returns {Buffer} */ export function serializeDWord(dword: number): Buffer { - const buf = Buffer.alloc(4); + const buf = Buffer.alloc(4); - buf.writeUInt32BE(dword); + buf.writeUInt32BE(dword); - return buf; + return buf; } /** @@ -76,11 +76,11 @@ export function serializeDWord(dword: number): Buffer { * @returns {Buffer} */ export function serializeFloat(f: number): Buffer { - const buf = Buffer.alloc(4); + const buf = Buffer.alloc(4); - buf.writeFloatBE(f); + buf.writeFloatBE(f); - return buf; + return buf; } /** @@ -89,12 +89,12 @@ export function serializeFloat(f: number): Buffer { * @returns {Buffer} */ export function serializeString(str: string): Buffer { - const buf = Buffer.alloc(str.length + 2); + const buf = Buffer.alloc(str.length + 2); - buf.writeUInt16BE(str.length); - buf.write(str, 2); + buf.writeUInt16BE(str.length); + buf.write(str, 2); - return buf; + return buf; } /** @@ -103,7 +103,7 @@ export function serializeString(str: string): Buffer { * @returns {boolean} */ export function deserializeBool(buff: Buffer): boolean { - return buff.readUInt8() === 1; + return buff.readUInt8() === 1; } /** @@ -112,7 +112,7 @@ export function deserializeBool(buff: Buffer): boolean { * @returns {number} */ export function deserializeByte(buff: Buffer): number { - return buff.readUInt8(); + return buff.readUInt8(); } /** @@ -121,7 +121,7 @@ export function deserializeByte(buff: Buffer): number { * @returns {number} */ export function deserializeWord(buff: Buffer): number { - return buff.readUInt16BE(); + return buff.readUInt16BE(); } /** @@ -130,7 +130,7 @@ export function deserializeWord(buff: Buffer): number { * @returns {number} */ export function deserializeDWord(buff: Buffer): number { - return buff.readUInt32BE(); + return buff.readUInt32BE(); } /** @@ -139,7 +139,7 @@ export function deserializeDWord(buff: Buffer): number { * @returns {number} */ export function deserializeFloat(buff: Buffer): number { - return buff.readFloatBE(); + return buff.readFloatBE(); } /** @@ -148,33 +148,33 @@ export function deserializeFloat(buff: Buffer): number { * @returns {string} */ export function deserializeString(buf: Buffer): string { - const size = buf.readUInt16BE(); - if (size > buf.length - 2) { - throw new ServerError("Size is bigger than the buffer length - 2"); - } - const str = buf.subarray(2, size + 2).toString("utf8"); + const size = buf.readUInt16BE(); + if (size > buf.length - 2) { + throw new ServerError("Size is bigger than the buffer length - 2"); + } + const str = buf.subarray(2, size + 2).toString("utf8"); - return str; + return str; } export function sizeOfBool() { - return 1; + return 1; } export function sizeOfByte() { - return 1; + return 1; } export function sizeOfWord() { - return 2; + return 2; } export function sizeOfDWord() { - return 4; + return 4; } export function sizeOfFloat() { - return 4; + return 4; } /** @@ -183,5 +183,5 @@ export function sizeOfFloat() { * @returns {number} */ export function sizeOfString(string: string): number { - return string.length + 2; + return string.length + 2; } diff --git a/packages/database/package.json b/packages/database/package.json index 69ffaf927..c56ff0eb4 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,35 +1,35 @@ { - "name": "rusty-motors-database", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage", - "types:db": "npx @databases/pg-schema-cli --directory src/__generated__" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@databases/pg": "^5.5.0", - "@databases/pg-schema-cli": "^4.4.0", - "@databases/pg-typed": "^4.4.1", - "@sentry/node": "^8.0.0", - "@types/pg": "^8.11.6", - "pg": "^8.11.5", - "pg-hstore": "^2.3.4", - "vitest": "^1.6.0" - }, - "directories": { - "test": "test" - }, - "description": "" + "name": "rusty-motors-database", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage", + "types:db": "npx @databases/pg-schema-cli --directory src/__generated__" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@databases/pg": "^5.5.0", + "@databases/pg-schema-cli": "^4.4.0", + "@databases/pg-typed": "^4.4.1", + "@sentry/node": "^8.0.0", + "@types/pg": "^8.11.6", + "pg": "^8.11.5", + "pg-hstore": "^2.3.4", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" } diff --git a/packages/database/src/DatabaseManager.ts b/packages/database/src/DatabaseManager.ts index e6aabf4e9..7f1fbd023 100644 --- a/packages/database/src/DatabaseManager.ts +++ b/packages/database/src/DatabaseManager.ts @@ -3,144 +3,144 @@ * @see {@link getDatabaseServer()} to get a singleton instance */ -import { getServerLogger } from "../../shared/log.js"; import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../shared/log.js"; /** * @module Database */ export class Database { - updateUser(user: { userId: number; userData: Buffer }) { - try { - this._users.set(user.userId, user.userData); - } catch (error) { - this._log.error(error); - } - } - static instance: Database | undefined; - private _log: import("pino").Logger; - private _sessions: interfaces.ConnectionRecord[]; - private _lobbies: interfaces.RaceLobbyRecord[][]; - private _users: Map; + updateUser(user: { userId: number; userData: Buffer }) { + try { + this._users.set(user.userId, user.userData); + } catch (error) { + this._log.error(error); + } + } + static instance: Database | undefined; + private _log: import("pino").Logger; + private _sessions: interfaces.ConnectionRecord[]; + private _lobbies: interfaces.RaceLobbyRecord[][]; + private _users: Map; - /** - * Creates an instance of Database. - * - * @param {interfaces.external.pino.Logger} [log=getServerLogger({ module: "database" })] - */ - constructor( - log: interfaces.external.pino.Logger = getServerLogger({ - module: "database", - }), - ) { - this._log = log; - this._sessions = []; - /** - * @private - * @type {interfaces.RaceLobbyRecord[]} - */ - this._lobbies = []; - this._users = new Map(); - } + /** + * Creates an instance of Database. + * + * @param {interfaces.external.pino.Logger} [log=getServerLogger({ module: "database" })] + */ + constructor( + log: interfaces.external.pino.Logger = getServerLogger({ + module: "database", + }), + ) { + this._log = log; + this._sessions = []; + /** + * @private + * @type {interfaces.RaceLobbyRecord[]} + */ + this._lobbies = []; + this._users = new Map(); + } - /** - * Return the singleton instance of the DatabaseManager class - * - * @static - * @param {import("pino").Logger} log - * @returns {Database} - */ - static getInstance(log: import("pino").Logger): Database { - if (!Database.instance) { - Database.instance = new Database(log); - } - const self = Database.instance; - return self; - } + /** + * Return the singleton instance of the DatabaseManager class + * + * @static + * @param {import("pino").Logger} log + * @returns {Database} + */ + static getInstance(log: import("pino").Logger): Database { + if (!Database.instance) { + Database.instance = new Database(log); + } + const self = Database.instance; + return self; + } - /** - * Locate customer session encryption key in the database - * - * @param {number} customerId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async fetchSessionKeyByCustomerId( - customerId: number, - ): Promise { - const record = this._sessions.find((session) => { - return session.customerId === customerId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - `Session key not found for customer ${customerId}`, - ); - throw err; - } - return record; - } + /** + * Locate customer session encryption key in the database + * + * @param {number} customerId + * @returns {Promise} + * @throws {Error} If the session key is not found + */ + async fetchSessionKeyByCustomerId( + customerId: number, + ): Promise { + const record = this._sessions.find((session) => { + return session.customerId === customerId; + }); + if (typeof record === "undefined") { + const err = new ServerError( + `Session key not found for customer ${customerId}`, + ); + throw err; + } + return record; + } - /** - * Locate customer session encryption key in the database - * - * @param {string} connectionId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async fetchSessionKeyByConnectionId( - connectionId: string, - ): Promise { - const record = this._sessions.find((session) => { - return session.connectionId === connectionId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - `Session key not found for connection ${connectionId}`, - ); - throw err; - } - return record; - } + /** + * Locate customer session encryption key in the database + * + * @param {string} connectionId + * @returns {Promise} + * @throws {Error} If the session key is not found + */ + async fetchSessionKeyByConnectionId( + connectionId: string, + ): Promise { + const record = this._sessions.find((session) => { + return session.connectionId === connectionId; + }); + if (typeof record === "undefined") { + const err = new ServerError( + `Session key not found for connection ${connectionId}`, + ); + throw err; + } + return record; + } - /** - * Create or overwrite a customer's session key record - * - * @param {number} customerId - * @param {string} sessionKey - * @param {string} contextId - * @param {string} connectionId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async updateSessionKey( - customerId: number, - sessionKey: string, - contextId: string, - connectionId: string, - ): Promise { - const sKey = sessionKey.slice(0, 16); + /** + * Create or overwrite a customer's session key record + * + * @param {number} customerId + * @param {string} sessionKey + * @param {string} contextId + * @param {string} connectionId + * @returns {Promise} + * @throws {Error} If the session key is not found + */ + async updateSessionKey( + customerId: number, + sessionKey: string, + contextId: string, + connectionId: string, + ): Promise { + const sKey = sessionKey.slice(0, 16); - const updatedSession: import("../../interfaces/index.js").ConnectionRecord = - { - customerId, - sessionKey, - sKey, - contextId, - connectionId, - }; + const updatedSession: import("../../interfaces/index.js").ConnectionRecord = + { + customerId, + sessionKey, + sKey, + contextId, + connectionId, + }; - const record = this._sessions.findIndex((session) => { - return session.customerId === customerId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - "Error updating session key: existing key not found", - ); - throw err; - } - this._sessions.splice(record, 1, updatedSession); - } + const record = this._sessions.findIndex((session) => { + return session.customerId === customerId; + }); + if (typeof record === "undefined") { + const err = new ServerError( + "Error updating session key: existing key not found", + ); + throw err; + } + this._sessions.splice(record, 1, updatedSession); + } } /** @@ -152,14 +152,14 @@ export class Database { */ export function getDatabaseServer( - option = { - log: getServerLogger({ - module: "database", - }), - }, + option = { + log: getServerLogger({ + module: "database", + }), + }, ): Database { - if (!Database.instance) { - Database.instance = new Database(option.log); - } - return Database.getInstance(option.log); + if (!Database.instance) { + Database.instance = new Database(option.log); + } + return Database.getInstance(option.log); } diff --git a/packages/database/src/models/Lobby.ts b/packages/database/src/models/Lobby.ts index 91108253f..6065c61f5 100644 --- a/packages/database/src/models/Lobby.ts +++ b/packages/database/src/models/Lobby.ts @@ -2,17 +2,17 @@ import { ServerError } from "../../../shared/errors/ServerError.js"; import { SerializedBuffer } from "../../../shared/messageFactory.js"; export class LobbyModel extends SerializedBuffer { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - deserialize(_inputBuffer: Buffer): LobbyModel { - throw new ServerError("Method not implemented."); - } - override serialize(): Buffer { - throw new ServerError("Method not implemented."); - } - serializeSize(): number { - throw new ServerError("Method not implemented."); - } - static schema = `CREATE TABLE IF NOT EXISTS "lobbies" + // eslint-disable-next-line @typescript-eslint/no-unused-vars + deserialize(_inputBuffer: Buffer): LobbyModel { + throw new ServerError("Method not implemented."); + } + override serialize(): Buffer { + throw new ServerError("Method not implemented."); + } + serializeSize(): number { + throw new ServerError("Method not implemented."); + } + static schema = `CREATE TABLE IF NOT EXISTS "lobbies" ( "lobyID" integer NOT NULL, "raceTypeID" integer NOT NULL, diff --git a/packages/database/src/models/Player.ts b/packages/database/src/models/Player.ts index 04fab0e04..3f50c285d 100644 --- a/packages/database/src/models/Player.ts +++ b/packages/database/src/models/Player.ts @@ -2,14 +2,14 @@ import { ServerError } from "../../../shared/errors/ServerError.js"; import { SerializedBuffer } from "../../../shared/messageFactory.js"; export class PlayerModel extends SerializedBuffer { - override serialize(): Buffer { - throw new ServerError("Method not implemented."); - } - serializeSize(): number { - throw new ServerError("Method not implemented."); - } + override serialize(): Buffer { + throw new ServerError("Method not implemented."); + } + serializeSize(): number { + throw new ServerError("Method not implemented."); + } - static schema = `CREATE TABLE Player ( + static schema = `CREATE TABLE Player ( PlayerID int NOT NULL, CustomerID int NOT NULL, PlayerTypeID int NOT NULL, diff --git a/packages/database/test/Database.test.ts b/packages/database/test/Database.test.ts index 70bdd0949..fcb7a25f3 100644 --- a/packages/database/test/Database.test.ts +++ b/packages/database/test/Database.test.ts @@ -1,85 +1,83 @@ +import { describe, expect, it, vi } from "vitest"; import { P } from "vitest/dist/reporters-5f784f42.js"; +import { mockPino } from "../../../test/factoryMocks.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; import { Database } from "../src/DatabaseManager.js"; -import { describe, it, expect, vi } from "vitest"; -import { ServerError } from "../../shared/errors/ServerError.js"; -import { mockPino } from "../../../test/factoryMocks.js"; describe("Database", () => { - it("returns the same instance", () => { - // arrange - vi.mock("pino", async () => { - const actual = await vi.importActual("pino"); - return { - ...(actual as P), - }; - }); - const log = getServerLogger({}); - // act - const instance1 = Database.getInstance(log); - const instance2 = Database.getInstance(log); - // assert - expect(instance1).toEqual(instance2); - }); + it("returns the same instance", () => { + // arrange + vi.mock("pino", async () => { + const actual = await vi.importActual("pino"); + return { + ...(actual as P), + }; + }); + const log = getServerLogger({}); + // act + const instance1 = Database.getInstance(log); + const instance2 = Database.getInstance(log); + // assert + expect(instance1).toEqual(instance2); + }); - describe("fetchSessionKeyByCustomerId", () => { - it("throws when session key is not found", async () => { - // arrange - mockPino(); - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const customerId = 1234; - // act - try { - await instance.fetchSessionKeyByCustomerId(customerId); - } catch (error) { - // assert - expect(error).toEqual( - new ServerError( - `Session key not found for customer ${customerId}`, - ), - ); - } - }); - }); + describe("fetchSessionKeyByCustomerId", () => { + it("throws when session key is not found", async () => { + // arrange + mockPino(); + const log = getServerLogger({}); + const instance = Database.getInstance(log); + const customerId = 1234; + // act + try { + await instance.fetchSessionKeyByCustomerId(customerId); + } catch (error) { + // assert + expect(error).toEqual( + new ServerError(`Session key not found for customer ${customerId}`), + ); + } + }); + }); - describe("fetchSessionKeyByConnectionId", () => { - it("throws when session key is not found", async () => { - // arrange - mockPino(); - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const connectionId = "1234"; - // act - try { - await instance.fetchSessionKeyByConnectionId(connectionId); - } catch (error) { - // assert - expect(error).toEqual( - new ServerError( - `Session key not found for connection ${connectionId}`, - ), - ); - } - }); - }); + describe("fetchSessionKeyByConnectionId", () => { + it("throws when session key is not found", async () => { + // arrange + mockPino(); + const log = getServerLogger({}); + const instance = Database.getInstance(log); + const connectionId = "1234"; + // act + try { + await instance.fetchSessionKeyByConnectionId(connectionId); + } catch (error) { + // assert + expect(error).toEqual( + new ServerError( + `Session key not found for connection ${connectionId}`, + ), + ); + } + }); + }); - describe("updateUser", () => { - it("returns successfully when passed a valid user record", async () => { - // arrange - mockPino(); - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const userRecord = { - contextId: "1234", - customerId: 1234, - userId: 1234, - userData: Buffer.from("1234"), - }; - // act + assert - expect(() => { - instance.updateUser(userRecord); - }).not.toThrow(); - }); - }); + describe("updateUser", () => { + it("returns successfully when passed a valid user record", async () => { + // arrange + mockPino(); + const log = getServerLogger({}); + const instance = Database.getInstance(log); + const userRecord = { + contextId: "1234", + customerId: 1234, + userId: 1234, + userData: Buffer.from("1234"), + }; + // act + assert + expect(() => { + instance.updateUser(userRecord); + }).not.toThrow(); + }); + }); }); diff --git a/packages/database/test/Player.test.ts b/packages/database/test/Player.test.ts index c7903b492..45c333938 100644 --- a/packages/database/test/Player.test.ts +++ b/packages/database/test/Player.test.ts @@ -1,8 +1,8 @@ -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; import { PlayerModel } from "../src/models/Player.js"; describe("Player model", function () { - it("should have a schema property", function () { - expect(PlayerModel.schema).not.equal(""); - }); + it("should have a schema property", function () { + expect(PlayerModel.schema).not.equal(""); + }); }); diff --git a/packages/database/vite.config.ts b/packages/database/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/database/vite.config.ts +++ b/packages/database/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/gateway/package.json b/packages/gateway/package.json index f71ce9586..5a45457ba 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -1,30 +1,30 @@ { - "name": "rusty-motors-gateway", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@fastify/sensible": "^5.5.0", - "@sentry/node": "^8.0.0", - "fastify": "^4.25.2", - "vitest": "^1.6.0" - }, - "directories": { - "test": "test" - }, - "description": "" + "name": "rusty-motors-gateway", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" } diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index db8d36e92..61ad35038 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -1,42 +1,42 @@ import { Socket, createServer as createSocketServer } from "node:net"; -import { onSocketConnection } from "./index.js"; +import FastifySensible from "@fastify/sensible"; +import fastify from "fastify"; +import { Logger } from "pino"; +import { ConsoleThread } from "../../cli/ConsoleThread.js"; +import { receiveLobbyData } from "../../lobby/src/internal.js"; +import { receiveLoginData } from "../../login/src/index.js"; +import { receivePersonaData } from "../../persona/src/internal.js"; import { - Configuration, - getServerConfiguration, + Configuration, + getServerConfiguration, } from "../../shared/Configuration.js"; -import { getServerLogger } from "../../shared/log.js"; -import fastify from "fastify"; import { - addOnDataHandler, - createInitialState, - fetchStateFromDatabase, + addOnDataHandler, + createInitialState, + fetchStateFromDatabase, } from "../../shared/State.js"; -import { ConsoleThread } from "../../cli/ConsoleThread.js"; -import { addWebRoutes } from "./web.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { receiveLoginData } from "../../login/src/index.js"; -import { receivePersonaData } from "../../persona/src/internal.js"; -import { receiveLobbyData } from "../../lobby/src/internal.js"; +import { getServerLogger } from "../../shared/log.js"; import { receiveTransactionsData } from "../../transactions/src/internal.js"; -import FastifySensible from "@fastify/sensible"; -import { Logger } from "pino"; +import { onSocketConnection } from "./index.js"; +import { addWebRoutes } from "./web.js"; /** * @module gateway */ type GatewayOptions = { - config?: import("/home/drazisil/mcos/packages/shared/Configuration.js").Configuration; - log?: Logger; - backlogAllowedCount?: number; - listeningPortList?: number[]; - socketConnectionHandler?: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; + config?: import("/home/drazisil/mcos/packages/shared/Configuration.js").Configuration; + log?: Logger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; }; /** @@ -44,267 +44,267 @@ type GatewayOptions = { * @see {@link getGatewayServer()} to get a singleton instance */ export class Gateway { - config: Configuration; - log: Logger; - timer: NodeJS.Timeout | null; - loopInterval: number; - status: string; - consoleEvents: string[]; - backlogAllowedCount: number; - listeningPortList: number[]; - servers: import("node:net").Server[]; - socketconnection: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; - static _instance: Gateway | undefined; - webServer: import("fastify").FastifyInstance | undefined; - readThread: ConsoleThread | undefined; - /** - * Creates an instance of GatewayServer. - * @param {GatewayOptions} options - */ - constructor({ - config = getServerConfiguration({}), - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList = [], - socketConnectionHandler = onSocketConnection, - }: GatewayOptions) { - log.debug("Creating GatewayServer instance"); - - this.config = config; - this.log = log; - /** @type {NodeJS.Timeout | null} */ - this.timer = null; - this.loopInterval = 0; - /** @type {"stopped" | "running" | "stopping" | "restarting"} */ - this.status = "stopped"; - this.consoleEvents = ["userExit", "userRestart", "userHelp"]; - this.backlogAllowedCount = backlogAllowedCount; - this.listeningPortList = listeningPortList; - /** @type {import("node:net").Server[]} */ - this.servers = []; - this.socketconnection = socketConnectionHandler; - - Gateway._instance = this; - } - - /** - * @return {import("fastify").FastifyInstance} - */ - getWebServer(): import("fastify").FastifyInstance { - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - return this.webServer; - } - - start() { - this.log.debug("Starting GatewayServer in start()"); - this.log.info("Server starting"); - - // Check if there are any listening ports specified - if (this.listeningPortList.length === 0) { - throw new ServerError("No listening ports specified"); - } - - // Mark the GatewayServer as running - this.log.debug("Marking GatewayServer as running"); - this.status = "running"; - - // Initialize the GatewayServer - this.init(); - - this.listeningPortList.forEach((port) => { - const server = createSocketServer((s) => { - this.socketconnection({ - incomingSocket: s, - log: this.log, - }); - }); - - server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { - this.log.debug(`Listening on port ${port}`); - }); - - // Add the server to the list of servers - this.servers.push(server); - }); - - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - - // Start the web server - addWebRoutes(this.webServer); - - this.webServer.listen( - { - host: "0.0.0.0", - port: 3000, - }, - (err, address) => { - if (err) { - this.log.error(err); - process.exit(1); - } - this.log.info(`Server listening at ${address}`); - }, - ); - } - - async restart() { - // Stop the GatewayServer - await this.stop(); - - console.log("=== Restarting... ==="); - - // Start the GatewayServer - this.start(); - } - - async exit() { - // Stop the GatewayServer - await this.stop(); - - // Exit the process - process.exit(0); - } - - async stop() { - // Mark the GatewayServer as stopping - this.log.debug("Marking GatewayServer as stopping"); - this.status = "stopping"; - - // Stop the servers - this.servers.forEach((server) => { - server.close(); - }); - - // Stop the read thread - if (this.readThread !== undefined) { - this.readThread.stop(); - } - - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - await this.webServer.close(); - - // Stop the timer - if (this.timer !== null) { - clearInterval(this.timer); - } - - // Mark the GatewayServer as stopped - this.log.debug("Marking GatewayServer as stopped"); - this.status = "stopped"; - - // Reset the global state - this.log.debug("Resetting the global state"); - createInitialState({}).save(); - } - - /** - * @param {string} event - */ - handleReadThreadEvent(event: string) { - if (event === "userExit") { - this.exit(); - } - if (event === "userRestart") { - this.restart(); - } - if (event === "userHelp") { - this.help(); - } - } - - init() { - // Create the read thread - this.readThread = new ConsoleThread({ - parentThread: this, - log: this.log, - }); - - // Register the read thread events - if (this.readThread === undefined) { - throw new ServerError("readThread is undefined"); - } - this.consoleEvents.forEach((event) => { - this.readThread?.on(event, () => { - this.handleReadThreadEvent(event); - }); - }); - - this.webServer = fastify({ - logger: true, - }); - this.webServer.register(FastifySensible); - - let state = fetchStateFromDatabase(); - - state = addOnDataHandler(state, 8226, receiveLoginData); - state = addOnDataHandler(state, 8228, receivePersonaData); - state = addOnDataHandler(state, 7003, receiveLobbyData); - state = addOnDataHandler(state, 43300, receiveTransactionsData); - - state.save(); - - this.log.debug("GatewayServer initialized"); - } - - help() { - console.log("=== Help ==="); - console.log("x: Exit"); - console.log("r: Restart"); - console.log("?: Help"); - console.log("============"); - } - run() { - // Intentionally left blank - } - - /** - * - * @param {GatewayOptions} options - * @returns {Gateway} - * @memberof Gateway - */ - static getInstance({ - config = undefined, - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList = [], - socketConnectionHandler = onSocketConnection, - }: GatewayOptions): Gateway { - if (Gateway._instance === undefined) { - Gateway._instance = new Gateway({ - config, - log, - backlogAllowedCount, - listeningPortList, - socketConnectionHandler, - }); - } - return Gateway._instance; - } - - shutdown() { - this.log.debug("Shutdown complete for GatewayServer"); - this.status = "stopped"; - this.log.info("Server stopped"); - - process.exit(0); - } + config: Configuration; + log: Logger; + timer: NodeJS.Timeout | null; + loopInterval: number; + status: string; + consoleEvents: string[]; + backlogAllowedCount: number; + listeningPortList: number[]; + servers: import("node:net").Server[]; + socketconnection: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; + static _instance: Gateway | undefined; + webServer: import("fastify").FastifyInstance | undefined; + readThread: ConsoleThread | undefined; + /** + * Creates an instance of GatewayServer. + * @param {GatewayOptions} options + */ + constructor({ + config = getServerConfiguration({}), + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList = [], + socketConnectionHandler = onSocketConnection, + }: GatewayOptions) { + log.debug("Creating GatewayServer instance"); + + this.config = config; + this.log = log; + /** @type {NodeJS.Timeout | null} */ + this.timer = null; + this.loopInterval = 0; + /** @type {"stopped" | "running" | "stopping" | "restarting"} */ + this.status = "stopped"; + this.consoleEvents = ["userExit", "userRestart", "userHelp"]; + this.backlogAllowedCount = backlogAllowedCount; + this.listeningPortList = listeningPortList; + /** @type {import("node:net").Server[]} */ + this.servers = []; + this.socketconnection = socketConnectionHandler; + + Gateway._instance = this; + } + + /** + * @return {import("fastify").FastifyInstance} + */ + getWebServer(): import("fastify").FastifyInstance { + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + return this.webServer; + } + + start() { + this.log.debug("Starting GatewayServer in start()"); + this.log.info("Server starting"); + + // Check if there are any listening ports specified + if (this.listeningPortList.length === 0) { + throw new ServerError("No listening ports specified"); + } + + // Mark the GatewayServer as running + this.log.debug("Marking GatewayServer as running"); + this.status = "running"; + + // Initialize the GatewayServer + this.init(); + + this.listeningPortList.forEach((port) => { + const server = createSocketServer((s) => { + this.socketconnection({ + incomingSocket: s, + log: this.log, + }); + }); + + server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { + this.log.debug(`Listening on port ${port}`); + }); + + // Add the server to the list of servers + this.servers.push(server); + }); + + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + + // Start the web server + addWebRoutes(this.webServer); + + this.webServer.listen( + { + host: "0.0.0.0", + port: 3000, + }, + (err, address) => { + if (err) { + this.log.error(err); + process.exit(1); + } + this.log.info(`Server listening at ${address}`); + }, + ); + } + + async restart() { + // Stop the GatewayServer + await this.stop(); + + console.log("=== Restarting... ==="); + + // Start the GatewayServer + this.start(); + } + + async exit() { + // Stop the GatewayServer + await this.stop(); + + // Exit the process + process.exit(0); + } + + async stop() { + // Mark the GatewayServer as stopping + this.log.debug("Marking GatewayServer as stopping"); + this.status = "stopping"; + + // Stop the servers + this.servers.forEach((server) => { + server.close(); + }); + + // Stop the read thread + if (this.readThread !== undefined) { + this.readThread.stop(); + } + + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + await this.webServer.close(); + + // Stop the timer + if (this.timer !== null) { + clearInterval(this.timer); + } + + // Mark the GatewayServer as stopped + this.log.debug("Marking GatewayServer as stopped"); + this.status = "stopped"; + + // Reset the global state + this.log.debug("Resetting the global state"); + createInitialState({}).save(); + } + + /** + * @param {string} event + */ + handleReadThreadEvent(event: string) { + if (event === "userExit") { + this.exit(); + } + if (event === "userRestart") { + this.restart(); + } + if (event === "userHelp") { + this.help(); + } + } + + init() { + // Create the read thread + this.readThread = new ConsoleThread({ + parentThread: this, + log: this.log, + }); + + // Register the read thread events + if (this.readThread === undefined) { + throw new ServerError("readThread is undefined"); + } + this.consoleEvents.forEach((event) => { + this.readThread?.on(event, () => { + this.handleReadThreadEvent(event); + }); + }); + + this.webServer = fastify({ + logger: true, + }); + this.webServer.register(FastifySensible); + + let state = fetchStateFromDatabase(); + + state = addOnDataHandler(state, 8226, receiveLoginData); + state = addOnDataHandler(state, 8228, receivePersonaData); + state = addOnDataHandler(state, 7003, receiveLobbyData); + state = addOnDataHandler(state, 43300, receiveTransactionsData); + + state.save(); + + this.log.debug("GatewayServer initialized"); + } + + help() { + console.log("=== Help ==="); + console.log("x: Exit"); + console.log("r: Restart"); + console.log("?: Help"); + console.log("============"); + } + run() { + // Intentionally left blank + } + + /** + * + * @param {GatewayOptions} options + * @returns {Gateway} + * @memberof Gateway + */ + static getInstance({ + config = undefined, + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList = [], + socketConnectionHandler = onSocketConnection, + }: GatewayOptions): Gateway { + if (Gateway._instance === undefined) { + Gateway._instance = new Gateway({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }); + } + return Gateway._instance; + } + + shutdown() { + this.log.debug("Shutdown complete for GatewayServer"); + this.status = "stopped"; + this.log.info("Server stopped"); + + process.exit(0); + } } /** @type {Gateway | undefined} */ @@ -317,31 +317,31 @@ Gateway._instance = undefined; * @returns {Gateway} */ export function getGatewayServer({ - config, - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList: listeningPortList = [], - socketConnectionHandler = onSocketConnection, + config, + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList: listeningPortList = [], + socketConnectionHandler = onSocketConnection, }: { - config?: Configuration; - log?: Logger; - backlogAllowedCount?: number; - listeningPortList?: number[]; - socketConnectionHandler?: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; + config?: Configuration; + log?: Logger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; }): Gateway { - return Gateway.getInstance({ - config, - log, - backlogAllowedCount, - listeningPortList, - socketConnectionHandler, - }); + return Gateway.getInstance({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }); } diff --git a/packages/gateway/src/encryption.ts b/packages/gateway/src/encryption.ts index 7c9f576a3..d8f1119a9 100644 --- a/packages/gateway/src/encryption.ts +++ b/packages/gateway/src/encryption.ts @@ -25,27 +25,27 @@ import { ServerError } from "../../shared/errors/ServerError.js"; * @returns {McosEncryptionPair} The encryption pair */ export function createCommandEncryptionPair(key: string): McosEncryptionPair { - if (key.length < 16) { - const err = new ServerError("Key too short"); - throw err; - } + if (key.length < 16) { + const err = new ServerError("Key too short"); + throw err; + } - const sKey = key.slice(0, 16); + const sKey = key.slice(0, 16); - // Deepcode ignore HardcodedSecret: This uses an empty IV - const desIV = Buffer.alloc(8); + // Deepcode ignore HardcodedSecret: This uses an empty IV + const desIV = Buffer.alloc(8); - const gsCipher = createCipheriv("des-cbc", Buffer.from(sKey, "hex"), desIV); - gsCipher.setAutoPadding(false); + const gsCipher = createCipheriv("des-cbc", Buffer.from(sKey, "hex"), desIV); + gsCipher.setAutoPadding(false); - const gsDecipher = createDecipheriv( - "des-cbc", - Buffer.from(sKey, "hex"), - desIV, - ); - gsDecipher.setAutoPadding(false); + const gsDecipher = createDecipheriv( + "des-cbc", + Buffer.from(sKey, "hex"), + desIV, + ); + gsDecipher.setAutoPadding(false); - return new McosEncryptionPair(gsCipher, gsDecipher); + return new McosEncryptionPair(gsCipher, gsDecipher); } /** @@ -56,18 +56,18 @@ export function createCommandEncryptionPair(key: string): McosEncryptionPair { * @throws Error if the key is too short */ export function createDataEncryptionPair(key: string): McosEncryptionPair { - if (key.length < 16) { - const err = new ServerError("Key too short"); - throw err; - } + if (key.length < 16) { + const err = new ServerError("Key too short"); + throw err; + } - const stringKey = Buffer.from(key, "hex"); + const stringKey = Buffer.from(key, "hex"); - // File deepcode ignore InsecureCipher: RC4 is the encryption algorithum used here, file deepcode ignore HardcodedSecret: A blank IV is used here - const tsCipher = createCipheriv("rc4", stringKey.subarray(0, 16), ""); - const tsDecipher = createDecipheriv("rc4", stringKey.subarray(0, 16), ""); + // File deepcode ignore InsecureCipher: RC4 is the encryption algorithum used here, file deepcode ignore HardcodedSecret: A blank IV is used here + const tsCipher = createCipheriv("rc4", stringKey.subarray(0, 16), ""); + const tsDecipher = createDecipheriv("rc4", stringKey.subarray(0, 16), ""); - return new McosEncryptionPair(tsCipher, tsDecipher); + return new McosEncryptionPair(tsCipher, tsDecipher); } /** @@ -77,13 +77,13 @@ export function createDataEncryptionPair(key: string): McosEncryptionPair { * @throws Error if the server does not support the legacy ciphers */ export function verifyLegacyCipherSupport() { - const cipherList = getCiphers(); - if (!cipherList.includes("des-cbc")) { - const err = new ServerError("DES-CBC cipher not available"); - throw err; - } - if (!cipherList.includes("rc4")) { - const err = new ServerError("RC4 cipher not available"); - throw err; - } + const cipherList = getCiphers(); + if (!cipherList.includes("des-cbc")) { + const err = new ServerError("DES-CBC cipher not available"); + throw err; + } + if (!cipherList.includes("rc4")) { + const err = new ServerError("RC4 cipher not available"); + throw err; + } } diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index e4dc63548..61d949083 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -15,21 +15,21 @@ // along with this program. If not, see . import { randomUUID } from "node:crypto"; -import { ServerError } from "../../shared/errors/ServerError.js"; import { - OnDataHandler, - addSocket, - fetchStateFromDatabase, - getOnDataHandler, - removeSocket, - wrapSocket, + OnDataHandler, + addSocket, + fetchStateFromDatabase, + getOnDataHandler, + removeSocket, + wrapSocket, } from "../../shared/State.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; -import { getGatewayServer } from "./GatewayServer.js"; -import { SerializedBuffer } from "../../shared/messageFactory.js"; import { Socket } from "node:net"; import { Logger } from "pino"; +import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { getGatewayServer } from "./GatewayServer.js"; /** * @typedef {object} OnDataHandlerArgs @@ -56,24 +56,24 @@ import { Logger } from "pino"; * Handle socket errors */ export function socketErrorHandler({ - connectionId, - error, - log = getServerLogger({ - module: "socketErrorHandler", - }), + connectionId, + error, + log = getServerLogger({ + module: "socketErrorHandler", + }), }: { - connectionId: string; - error: NodeJS.ErrnoException; - log?: Logger; + connectionId: string; + error: NodeJS.ErrnoException; + log?: Logger; }) { - // Handle socket errors - if (error.code == "ECONNRESET") { - log.debug(`Connection ${connectionId} reset`); - return; - } - throw new ServerError( - `Socket error: ${error.message} on connection ${connectionId}`, - ); + // Handle socket errors + if (error.code == "ECONNRESET") { + log.debug(`Connection ${connectionId} reset`); + return; + } + throw new ServerError( + `Socket error: ${error.message} on connection ${connectionId}`, + ); } /** @@ -84,18 +84,18 @@ export function socketErrorHandler({ * @param {import("pino").Logger} [options.log=getServerLogger({ module: "socketEndHandler" })] The logger to use */ export function socketEndHandler({ - connectionId, - log = getServerLogger({ - module: "socketEndHandler", - }), + connectionId, + log = getServerLogger({ + module: "socketEndHandler", + }), }: { - connectionId: string; - log?: import("pino").Logger; + connectionId: string; + log?: import("pino").Logger; }) { - log.debug(`Connection ${connectionId} ended`); + log.debug(`Connection ${connectionId} ended`); - // Remove the socket from the global state - removeSocket(fetchStateFromDatabase(), connectionId).save(); + // Remove the socket from the global state + removeSocket(fetchStateFromDatabase(), connectionId).save(); } /** @@ -107,109 +107,105 @@ export function socketEndHandler({ * */ export function onSocketConnection({ - incomingSocket, - log = getServerLogger({ - module: "onDataHandler", - }), + incomingSocket, + log = getServerLogger({ + module: "onDataHandler", + }), }: { - incomingSocket: Socket; - log?: import("pino").Logger; + incomingSocket: Socket; + log?: import("pino").Logger; }) { - // Get the local port and remote address - const { localPort, remoteAddress } = incomingSocket; - - if (localPort === undefined || remoteAddress === undefined) { - throw new ServerError("localPort or remoteAddress is undefined"); - } - - // This is a new connection so generate a new connection ID - const newConnectionId = randomUUID(); - - // Wrap the socket and add it to the global state - const wrappedSocket = wrapSocket(incomingSocket, newConnectionId); - - // Add the socket to the global state - addSocket(fetchStateFromDatabase(), wrappedSocket).save(); - - // This is a new TCP socket, so it's probably not using HTTP - // Let's look for a port onData handler - /** @type {OnDataHandler | undefined} */ - const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( - fetchStateFromDatabase(), - localPort, - ); - - // Throw an error if there is no onData handler - if (!portOnDataHandler) { - log.warn(`No onData handler for port ${localPort}`); - return; - } - - incomingSocket.on("error", (error) => - socketErrorHandler({ connectionId: newConnectionId, error }), - ); - - // Add the data handler to the socket - incomingSocket.on( - "data", - (/** @type {Buffer} */ incomingDataAsBuffer: Buffer) => { - log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); - - // Deserialize the raw message - const rawMessage = new SerializedBuffer()._doDeserialize( - incomingDataAsBuffer, - ); - - // Log the raw message - log.trace(`Raw message: ${rawMessage.toString()}`); - - log.debug("Calling onData handler"); - - portOnDataHandler({ - connectionId: newConnectionId, - message: rawMessage, - }) - .then( - ( - /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, - ) => { - log.debug("onData handler returned"); - const { messages } = response; - - // Log the messages - log.trace( - `Messages: ${messages.map((m) => m.toString())}`, - ); - - // Serialize the messages - const serializedMessages = messages.map((m) => - m.serialize(), - ); - - try { - // Send the messages - serializedMessages.forEach((m) => { - incomingSocket.write(m); - log.trace(`Sent data: ${m.toString("hex")}`); - }); - } catch (error) { - log.error(`Error sending data: ${String(error)}`); - } - }, - ) - .catch((/** @type {Error} */ error: Error) => { - log.error(`Error handling data: ${String(error)}`); - - // Call server shutdown - getGatewayServer({}).shutdown(); - }); - }, - ); - - log.debug(`Client ${remoteAddress} connected to port ${localPort}`); - - if (localPort === 7003) { - // Sent ok to login packet - incomingSocket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); - } + // Get the local port and remote address + const { localPort, remoteAddress } = incomingSocket; + + if (localPort === undefined || remoteAddress === undefined) { + throw new ServerError("localPort or remoteAddress is undefined"); + } + + // This is a new connection so generate a new connection ID + const newConnectionId = randomUUID(); + + // Wrap the socket and add it to the global state + const wrappedSocket = wrapSocket(incomingSocket, newConnectionId); + + // Add the socket to the global state + addSocket(fetchStateFromDatabase(), wrappedSocket).save(); + + // This is a new TCP socket, so it's probably not using HTTP + // Let's look for a port onData handler + /** @type {OnDataHandler | undefined} */ + const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( + fetchStateFromDatabase(), + localPort, + ); + + // Throw an error if there is no onData handler + if (!portOnDataHandler) { + log.warn(`No onData handler for port ${localPort}`); + return; + } + + incomingSocket.on("error", (error) => + socketErrorHandler({ connectionId: newConnectionId, error }), + ); + + // Add the data handler to the socket + incomingSocket.on( + "data", + (/** @type {Buffer} */ incomingDataAsBuffer: Buffer) => { + log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); + + // Deserialize the raw message + const rawMessage = new SerializedBuffer()._doDeserialize( + incomingDataAsBuffer, + ); + + // Log the raw message + log.trace(`Raw message: ${rawMessage.toString()}`); + + log.debug("Calling onData handler"); + + portOnDataHandler({ + connectionId: newConnectionId, + message: rawMessage, + }) + .then( + ( + /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, + ) => { + log.debug("onData handler returned"); + const { messages } = response; + + // Log the messages + log.trace(`Messages: ${messages.map((m) => m.toString())}`); + + // Serialize the messages + const serializedMessages = messages.map((m) => m.serialize()); + + try { + // Send the messages + serializedMessages.forEach((m) => { + incomingSocket.write(m); + log.trace(`Sent data: ${m.toString("hex")}`); + }); + } catch (error) { + log.error(`Error sending data: ${String(error)}`); + } + }, + ) + .catch((/** @type {Error} */ error: Error) => { + log.error(`Error handling data: ${String(error)}`); + + // Call server shutdown + getGatewayServer({}).shutdown(); + }); + }, + ); + + log.debug(`Client ${remoteAddress} connected to port ${localPort}`); + + if (localPort === 7003) { + // Sent ok to login packet + incomingSocket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); + } } diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index 9ae785724..0b261a0a8 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -14,15 +14,15 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerError } from "../../shared/errors/ServerError.js"; import { CastanetResponse } from "../../patch/src/PatchServer.js"; import { generateShardList } from "../../shard/src/ShardServer.js"; -import { getServerConfiguration } from "../../shared/Configuration.js"; import { - handleGetCert, - handleGetKey, - handleGetRegistry, + handleGetCert, + handleGetKey, + handleGetRegistry, } from "../../shard/src/index.js"; +import { getServerConfiguration } from "../../shared/Configuration.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; /** * Add web routes to the web server @@ -30,97 +30,95 @@ import { * @param {import("fastify").FastifyInstance} webServer The web server */ export function addWebRoutes(webServer: import("fastify").FastifyInstance) { - webServer.addContentTypeParser("*", function (request, payload, done) { - let data = ""; - payload.on("data", (chunk) => { - data += chunk; - }); - payload.on("end", () => { - done(null, data); - }); - }); - - webServer.get("/", async (_request, reply) => { - return reply.send("Hello, world!"); - }); - - webServer.post( - "/games/EA_Seattle/MotorCity/UpdateInfo", - (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }, - ); - - webServer.post("/games/EA_Seattle/MotorCity/NPS", (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }); - - webServer.post("/games/EA_Seattle/MotorCity/MCO", (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }); - - interface IQuerystring { - username: string; - password: string; - } - - interface IHeaders {} - - interface IReply {} - - webServer.get<{ - Querystring: IQuerystring; - Headers: IHeaders; - Reply: IReply; - }>("/AuthLogin", async (request, reply) => { - const username = request.query.username; - - if (username === "new") { - return reply.send( - "Valid=TRUE\nTicket=5213dee3a6bcdb133373b2d4f3b9962758", - ); - } - - return reply.send( - "Valid=TRUE\nTicket=d316cd2dd6bf870893dfbaaf17f965884e", - ); - }); - - webServer.get("/ShardList/", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(generateShardList(config.host)); - }); - - webServer.get("/cert", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetCert(config)); - }); - - webServer.get("/key", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetKey(config)); - }); - - webServer.get("/registry", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetRegistry(config)); - }); + webServer.addContentTypeParser("*", (_request, payload, done) => { + let data = ""; + payload.on("data", (chunk) => { + data += chunk; + }); + payload.on("end", () => { + done(null, data); + }); + }); + + webServer.get("/", async (_request, reply) => { + return reply.send("Hello, world!"); + }); + + webServer.post( + "/games/EA_Seattle/MotorCity/UpdateInfo", + (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }, + ); + + webServer.post("/games/EA_Seattle/MotorCity/NPS", (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }); + + webServer.post("/games/EA_Seattle/MotorCity/MCO", (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }); + + interface IQuerystring { + username: string; + password: string; + } + + interface IHeaders {} + + interface IReply {} + + webServer.get<{ + Querystring: IQuerystring; + Headers: IHeaders; + Reply: IReply; + }>("/AuthLogin", async (request, reply) => { + const username = request.query.username; + + if (username === "new") { + return reply.send( + "Valid=TRUE\nTicket=5213dee3a6bcdb133373b2d4f3b9962758", + ); + } + + return reply.send("Valid=TRUE\nTicket=d316cd2dd6bf870893dfbaaf17f965884e"); + }); + + webServer.get("/ShardList/", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(generateShardList(config.host)); + }); + + webServer.get("/cert", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetCert(config)); + }); + + webServer.get("/key", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetKey(config)); + }); + + webServer.get("/registry", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetRegistry(config)); + }); } diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index 697cac4c1..2c465e6c8 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -1,19 +1,19 @@ -import { beforeAll, beforeEach, describe, expect, it, test, vi } from "vitest"; -import { - createCommandEncryptionPair, - createDataEncryptionPair, -} from "../src/encryption.js"; +import { randomUUID } from "node:crypto"; import { Socket } from "node:net"; +import { beforeAll, beforeEach, describe, expect, it, test, vi } from "vitest"; +import { mockPino } from "../../../test/factoryMocks.js"; import { - McosEncryption, - State, - addEncryption, - createInitialState, - getEncryption, + McosEncryption, + State, + addEncryption, + createInitialState, + getEncryption, } from "../../shared/State.js"; -import { randomUUID } from "node:crypto"; -import { mockPino } from "../../../test/factoryMocks.js"; import { ServerError } from "../../shared/errors/ServerError.js"; +import { + createCommandEncryptionPair, + createDataEncryptionPair, +} from "../src/encryption.js"; let testSave: (state: State) => void; let testState: State; @@ -21,167 +21,166 @@ let testSocket1: Socket; let testSocket2: Socket; describe("Encryption", () => { - beforeAll(() => { - mockPino(); - testSave = (state?: State) => { - if (typeof state === "undefined") { - throw new ServerError("State not defined"); - } - testState = state; - }; - testState = createInitialState({ - saveFunction: testSave, - }); - testSocket1 = new Socket(); - testSocket1.write = vi.fn().mockImplementation(() => { - // Do nothing - }); - testSocket2 = new Socket(); - testSocket2.write = vi.fn().mockImplementation(() => { - // Do nothing - }); - }); + beforeAll(() => { + mockPino(); + testSave = (state?: State) => { + if (typeof state === "undefined") { + throw new ServerError("State not defined"); + } + testState = state; + }; + testState = createInitialState({ + saveFunction: testSave, + }); + testSocket1 = new Socket(); + testSocket1.write = vi.fn().mockImplementation(() => { + // Do nothing + }); + testSocket2 = new Socket(); + testSocket2.write = vi.fn().mockImplementation(() => { + // Do nothing + }); + }); - beforeEach(() => { - testState = createInitialState({ - saveFunction: testSave, - }); - }); + beforeEach(() => { + testState = createInitialState({ + saveFunction: testSave, + }); + }); - it("should be able to encrypt and decrypt a command message", () => { - // Arrange + it("should be able to encrypt and decrypt a command message", () => { + // Arrange - const connectionId1 = randomUUID(); - const connectionId2 = randomUUID(); + const connectionId1 = randomUUID(); + const connectionId2 = randomUUID(); - const key = - "254a7a0703a3a2c4df687a3969d3577bb8350efc3950c1c22f76415227ac5f21"; + const key = + "254a7a0703a3a2c4df687a3969d3577bb8350efc3950c1c22f76415227ac5f21"; - const commandEncryptionPair = createCommandEncryptionPair(key); + const commandEncryptionPair = createCommandEncryptionPair(key); - const dataEncryptionPair = createDataEncryptionPair(key); + const dataEncryptionPair = createDataEncryptionPair(key); - const encryption1 = new McosEncryption({ - connectionId: connectionId1, - commandEncryptionPair, - dataEncryptionPair, - }); + const encryption1 = new McosEncryption({ + connectionId: connectionId1, + commandEncryptionPair, + dataEncryptionPair, + }); - const encryption2 = new McosEncryption({ - connectionId: connectionId2, - commandEncryptionPair, - dataEncryptionPair, - }); + const encryption2 = new McosEncryption({ + connectionId: connectionId2, + commandEncryptionPair, + dataEncryptionPair, + }); - // Act + Assert + // Act + Assert - const message = Buffer.from("test message1234"); + const message = Buffer.from("test message1234"); - let state = testState; + let state = testState; - state = addEncryption(state, encryption1); - state = addEncryption(state, encryption2); + state = addEncryption(state, encryption1); + state = addEncryption(state, encryption2); - const connectionEncryption1 = getEncryption(state, connectionId1); + const connectionEncryption1 = getEncryption(state, connectionId1); - expect(connectionEncryption1).toBeDefined(); + expect(connectionEncryption1).toBeDefined(); - const encryptedMessage = - connectionEncryption1?.commandEncryption.encrypt(message); + const encryptedMessage = + connectionEncryption1?.commandEncryption.encrypt(message); - expect(encryptedMessage).toBeDefined(); + expect(encryptedMessage).toBeDefined(); - const connectionEncryption2 = getEncryption(state, connectionId2); + const connectionEncryption2 = getEncryption(state, connectionId2); - expect(connectionEncryption2).toBeDefined(); + expect(connectionEncryption2).toBeDefined(); - const decryptedMessage = - connectionEncryption2?.commandEncryption.decrypt( - encryptedMessage as Buffer, - ); + const decryptedMessage = connectionEncryption2?.commandEncryption.decrypt( + encryptedMessage as Buffer, + ); - expect(decryptedMessage).toBeDefined(); + expect(decryptedMessage).toBeDefined(); - expect(decryptedMessage).toEqual(message); - }); + expect(decryptedMessage).toEqual(message); + }); - it("should be able to encrypt and decrypt a command message", () => { - // Arrange + it("should be able to encrypt and decrypt a command message", () => { + // Arrange - const connectionId1 = randomUUID(); - const connectionId2 = randomUUID(); + const connectionId1 = randomUUID(); + const connectionId2 = randomUUID(); - const key = - "254a7a0703a3a2c4df687a3969d3577bb8350efc3950c1c22f76415227ac5f21"; + const key = + "254a7a0703a3a2c4df687a3969d3577bb8350efc3950c1c22f76415227ac5f21"; - const commandEncryptionPair = createCommandEncryptionPair(key); + const commandEncryptionPair = createCommandEncryptionPair(key); - const dataEncryptionPair = createDataEncryptionPair(key); + const dataEncryptionPair = createDataEncryptionPair(key); - const encryption1 = new McosEncryption({ - connectionId: connectionId1, - commandEncryptionPair, - dataEncryptionPair, - }); + const encryption1 = new McosEncryption({ + connectionId: connectionId1, + commandEncryptionPair, + dataEncryptionPair, + }); - const encryption2 = new McosEncryption({ - connectionId: connectionId2, - commandEncryptionPair, - dataEncryptionPair, - }); + const encryption2 = new McosEncryption({ + connectionId: connectionId2, + commandEncryptionPair, + dataEncryptionPair, + }); - // Act + Assert + // Act + Assert - const message = Buffer.from("test message1234"); + const message = Buffer.from("test message1234"); - let state = testState; + let state = testState; - state = addEncryption(state, encryption1); - state = addEncryption(state, encryption2); + state = addEncryption(state, encryption1); + state = addEncryption(state, encryption2); - const connectionEncryption1 = getEncryption(state, connectionId1); + const connectionEncryption1 = getEncryption(state, connectionId1); - expect(connectionEncryption1).toBeDefined(); + expect(connectionEncryption1).toBeDefined(); - const encryptedMessage = - connectionEncryption1?.dataEncryption.encrypt(message); + const encryptedMessage = + connectionEncryption1?.dataEncryption.encrypt(message); - expect(encryptedMessage).toBeDefined(); + expect(encryptedMessage).toBeDefined(); - const connectionEncryption2 = getEncryption(state, connectionId2); + const connectionEncryption2 = getEncryption(state, connectionId2); - expect(connectionEncryption2).toBeDefined(); + expect(connectionEncryption2).toBeDefined(); - const decryptedMessage = connectionEncryption2?.dataEncryption.decrypt( - encryptedMessage as Buffer, - ); + const decryptedMessage = connectionEncryption2?.dataEncryption.decrypt( + encryptedMessage as Buffer, + ); - expect(decryptedMessage).toBeDefined(); + expect(decryptedMessage).toBeDefined(); - expect(decryptedMessage).toEqual(message); - }); + expect(decryptedMessage).toEqual(message); + }); - test("data should throw when the key is too short", () => { - // Arrange + test("data should throw when the key is too short", () => { + // Arrange - const key = "22c4df"; + const key = "22c4df"; - // Act + Assert + // Act + Assert - expect(() => { - createDataEncryptionPair(key); - }).toThrow("Key too short"); - }); + expect(() => { + createDataEncryptionPair(key); + }).toThrow("Key too short"); + }); - test("command should throw when the key is too short", () => { - // Arrange + test("command should throw when the key is too short", () => { + // Arrange - const key = "25"; + const key = "25"; - // Act + Assert + // Act + Assert - expect(() => { - createCommandEncryptionPair(key); - }).toThrow("Key too short"); - }); + expect(() => { + createCommandEncryptionPair(key); + }).toThrow("Key too short"); + }); }); diff --git a/packages/gateway/vite.config.ts b/packages/gateway/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/gateway/vite.config.ts +++ b/packages/gateway/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/interfaces/index.d.ts b/packages/interfaces/index.d.ts index 39298e102..abe04f64d 100644 --- a/packages/interfaces/index.d.ts +++ b/packages/interfaces/index.d.ts @@ -1,10 +1,10 @@ -import { Socket } from "node:net"; -import { ServerError } from "../shared/errors/ServerError.js"; import { Cipher, Decipher } from "node:crypto"; import { IncomingMessage, ServerResponse } from "node:http"; -import { SerializedBuffer } from "../shared/messageFactory.js"; -import { Configuration } from "../shared/Configuration.js"; +import { Socket } from "node:net"; import pino from "pino"; +import { Configuration } from "../shared/Configuration.js"; +import { ServerError } from "../shared/errors/ServerError.js"; +import { SerializedBuffer } from "../shared/messageFactory.js"; /** * @module interfaces @@ -13,9 +13,9 @@ import pino from "pino"; export as namespace interfaces; export namespace external { - export namespace pino { - export type Logger = pino.Logger; - } + export namespace pino { + export type Logger = pino.Logger; + } } export const name = "interfaces"; @@ -25,184 +25,184 @@ export const name = "interfaces"; * @interface */ interface SerializedObject { - serialize: () => Buffer; - serializeSize: () => number; + serialize: () => Buffer; + serializeSize: () => number; } export const SerializedObject = { - serialize() { - throw new ServerError("Not implemented"); - }, - serializeSize() { - throw new ServerError("Not implemented"); - }, + serialize() { + throw new ServerError("Not implemented"); + }, + serializeSize() { + throw new ServerError("Not implemented"); + }, }; interface EncryptionSession { - connectionId: string; - remoteAddress: string; - localPort: number; - sessionKey: string; - sKey: string; - gsCipher: Cipher; - gsDecipher: Decipher; - tsCipher: Cipher; - tsDecipher: Decipher; + connectionId: string; + remoteAddress: string; + localPort: number; + sessionKey: string; + sKey: string; + gsCipher: Cipher; + gsDecipher: Decipher; + tsCipher: Cipher; + tsDecipher: Decipher; } interface ClientConnection { - status: number; - appID: number; - id: string; - socket: Socket; - remoteAddress: string; - seq: number; - personaId: number; - lastMessageTimestamp: number; - inQueue: boolean; - encryptionSession: EncryptionSession; - useEncryption: boolean; - port: number; - ip: string; + status: number; + appID: number; + id: string; + socket: Socket; + remoteAddress: string; + seq: number; + personaId: number; + lastMessageTimestamp: number; + inQueue: boolean; + encryptionSession: EncryptionSession; + useEncryption: boolean; + port: number; + ip: string; } interface SocketWithConnectionInfo { - connectionId: string; - socket: Socket; - seq: number; - id: string; - remoteAddress: string; - localPort: number; - personaId: number; - lastMessageTimestamp: number; - inQueue: boolean; - encryptionSession: EncryptionSession; - useEncryption: boolean; + connectionId: string; + socket: Socket; + seq: number; + id: string; + remoteAddress: string; + localPort: number; + personaId: number; + lastMessageTimestamp: number; + inQueue: boolean; + encryptionSession: EncryptionSession; + useEncryption: boolean; } export interface DatabaseManager { - updateSessionKey: ( - arg0: number, - arg1: string, - arg2: string, - arg3: string, - ) => Promise; - fetchSessionKeyByCustomerId: (arg0: number) => Promise; + updateSessionKey: ( + arg0: number, + arg1: string, + arg2: string, + arg3: string, + ) => Promise; + fetchSessionKeyByCustomerId: (arg0: number) => Promise; } /** * @exports */ export interface ConnectionRecord { - customerId: number; - connectionId: string; - sessionKey: string; - sKey: string; - contextId: string; + customerId: number; + connectionId: string; + sessionKey: string; + sKey: string; + contextId: string; } interface SessionKeys { - sessionKey: string; - sKey: string; + sessionKey: string; + sKey: string; } interface TConnection { - connectionId: string; - localPort: number; - remoteAddress: string; - socket: Socket; - encryptionSession: EncryptionSession; - useEncryption: boolean; - inQueue: boolean; + connectionId: string; + localPort: number; + remoteAddress: string; + socket: Socket; + encryptionSession: EncryptionSession; + useEncryption: boolean; + inQueue: boolean; } interface JSONResponseOfGameMessage { - msgNo: number; - opCode: number | null; - msgLength: number; - msgVersion: number; - content: string; - contextId: string; - direction: "sent" | "received"; - sessionKey: string | null; - rawBuffer: string; + msgNo: number; + opCode: number | null; + msgLength: number; + msgVersion: number; + content: string; + contextId: string; + direction: "sent" | "received"; + sessionKey: string | null; + rawBuffer: string; } interface GameMessage { - serialize: () => Buffer; - deserialize: (arg0: Buffer) => void; - toJSON: () => JSONResponseOfGameMessage; - dumpPacket: () => string; + serialize: () => Buffer; + deserialize: (arg0: Buffer) => void; + toJSON: () => JSONResponseOfGameMessage; + dumpPacket: () => string; } export interface GameMessageOpCode { - name: string; - value: number; - module: "Lobby" | "Login"; + name: string; + value: number; + module: "Lobby" | "Login"; } interface BuiltinError { - code: number; - message: string; + code: number; + message: string; } export interface PersonaRecord { - customerId: number; - id: Buffer; - maxPersonas: Buffer; - name: Buffer; - personaCount: Buffer; - shardId: Buffer; + customerId: number; + id: Buffer; + maxPersonas: Buffer; + name: Buffer; + personaCount: Buffer; + shardId: Buffer; } export interface UserRecordMini { - contextId: string; - customerId: number; - userId: number; + contextId: string; + customerId: number; + userId: number; } interface WebJSONResponse { - code: number; - headers: - | import("http").OutgoingHttpHeaders - | import("http").OutgoingHttpHeader[] - | undefined; - body: { connectionId: string; remoteAddress: string; inQueue: boolean }[]; + code: number; + headers: + | import("http").OutgoingHttpHeaders + | import("http").OutgoingHttpHeader[] + | undefined; + body: { connectionId: string; remoteAddress: string; inQueue: boolean }[]; } type WebConnectionHandler = ( - req: IncomingMessage, - res: ServerResponse, - config: Configuration, - log: import("pino").Logger, + req: IncomingMessage, + res: ServerResponse, + config: Configuration, + log: import("pino").Logger, ) => void; /** * @exports */ export interface RaceLobbyRecord { - lobbyId: number; - raceTypeId: number; - turfId: number; - riffName: string; - eTurfName: string; + lobbyId: number; + raceTypeId: number; + turfId: number; + riffName: string; + eTurfName: string; } export interface ServiceArgs { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; } type Service = ( - args: ServiceArgs, + args: ServiceArgs, ) => Promise; export interface KeypressEvent { - sequence: string; - name: string; - ctrl: boolean; - meta: boolean; - shift: boolean; + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; } export as namespace interfaces; diff --git a/packages/lobby/src/LoginInfoMessage.ts b/packages/lobby/src/LoginInfoMessage.ts index fba950e03..f4a848d94 100644 --- a/packages/lobby/src/LoginInfoMessage.ts +++ b/packages/lobby/src/LoginInfoMessage.ts @@ -1,104 +1,104 @@ import { ServerError } from "../../shared/errors/ServerError.js"; import { - LegacyMessage, - deserializeString, - serializeString, + LegacyMessage, + deserializeString, + serializeString, } from "../../shared/messageFactory.js"; export class LoginInfoMessage extends LegacyMessage { - _userId: number; - _userName: string; - _userData: Buffer; - _customerId: number; - _flags: number; - _dllVersion: string; - _hostname: string; - _idAddress: string; - _hashKey: Buffer; - constructor() { - super(); - this._userId = 0; // 4 bytes - this._userName = ""; - this._userData = Buffer.alloc(64); - this._customerId = 0; // 4 bytes - this._flags = 0; // 4 bytes - this._dllVersion = ""; - this._hostname = ""; - this._idAddress = ""; - this._hashKey = Buffer.alloc(16); - } + _userId: number; + _userName: string; + _userData: Buffer; + _customerId: number; + _flags: number; + _dllVersion: string; + _hostname: string; + _idAddress: string; + _hashKey: Buffer; + constructor() { + super(); + this._userId = 0; // 4 bytes + this._userName = ""; + this._userData = Buffer.alloc(64); + this._customerId = 0; // 4 bytes + this._flags = 0; // 4 bytes + this._dllVersion = ""; + this._hostname = ""; + this._idAddress = ""; + this._hashKey = Buffer.alloc(16); + } - /** - * @param {Buffer} buffer - * @returns {LoginInfoMessage} - */ - override deserialize(buffer: Buffer): LoginInfoMessage { - try { - this._header._doDeserialize(buffer); - let offset = this._header._size; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length + 1; - buffer.copy(this._userData, 0, offset, offset + 64); - offset += 64; - this._customerId = buffer.readInt32BE(offset); - offset += 4; - this._flags = buffer.readInt32BE(offset); - offset += 4; - this._dllVersion = deserializeString(buffer.subarray(offset)); - offset += 4 + this._dllVersion.length + 1; - this._hostname = deserializeString(buffer.subarray(offset)); - offset += 4 + this._hostname.length + 1; - this._idAddress = deserializeString(buffer.subarray(offset)); - offset += 4 + this._idAddress.length + 1; - buffer.copy(this._hashKey, 0, offset, offset + 16); + /** + * @param {Buffer} buffer + * @returns {LoginInfoMessage} + */ + override deserialize(buffer: Buffer): LoginInfoMessage { + try { + this._header._doDeserialize(buffer); + let offset = this._header._size; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length + 1; + buffer.copy(this._userData, 0, offset, offset + 64); + offset += 64; + this._customerId = buffer.readInt32BE(offset); + offset += 4; + this._flags = buffer.readInt32BE(offset); + offset += 4; + this._dllVersion = deserializeString(buffer.subarray(offset)); + offset += 4 + this._dllVersion.length + 1; + this._hostname = deserializeString(buffer.subarray(offset)); + offset += 4 + this._hostname.length + 1; + this._idAddress = deserializeString(buffer.subarray(offset)); + offset += 4 + this._idAddress.length + 1; + buffer.copy(this._hashKey, 0, offset, offset + 16); - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing LoginInfoMessage", - ); - } - } + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing LoginInfoMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); - offset += 64; - buffer.writeInt32BE(this._customerId, offset); - offset += 4; - buffer.writeInt32BE(this._flags, offset); - offset += 4; - offset = serializeString(this._dllVersion, buffer, offset); + this._userData.copy(buffer, offset); + offset += 64; + buffer.writeInt32BE(this._customerId, offset); + offset += 4; + buffer.writeInt32BE(this._flags, offset); + offset += 4; + offset = serializeString(this._dllVersion, buffer, offset); - offset = serializeString(this._hostname, buffer, offset); + offset = serializeString(this._hostname, buffer, offset); - offset = serializeString(this._idAddress, buffer, offset); - offset += 4 + this._idAddress.length + 1; - this._hashKey.copy(buffer, offset); + offset = serializeString(this._idAddress, buffer, offset); + offset += 4 + this._idAddress.length + 1; + this._hashKey.copy(buffer, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - override toString() { - return `LoginInfoMessage: ${this._userName}`; - } + override toString() { + return `LoginInfoMessage: ${this._userName}`; + } } diff --git a/packages/lobby/src/MiniRiffMessage.js b/packages/lobby/src/MiniRiffMessage.js index dcdc3d0ff..00f8976d4 100644 --- a/packages/lobby/src/MiniRiffMessage.js +++ b/packages/lobby/src/MiniRiffMessage.js @@ -1,99 +1,96 @@ import { ServerError } from "../../shared/errors/ServerError.js"; import { - LegacyMessage, - serializeString, - SerializedBuffer, + LegacyMessage, + SerializedBuffer, + serializeString, } from "../../shared/messageFactory.js"; export class MiniRiffMessage extends LegacyMessage { - constructor() { - super(); - /** @type {MiniRiffInfo[]} */ - this._riffList = []; - } + constructor() { + super(); + /** @type {MiniRiffInfo[]} */ + this._riffList = []; + } - size() { - let size = 4; - for (const riff of this._riffList) { - size += riff.size(); - } - return size; - } + size() { + let size = 4; + for (const riff of this._riffList) { + size += riff.size(); + } + return size; + } - /** @param {MiniRiffInfo} riff */ - addRiff(riff) { - this._riffList.push(riff); - } + /** @param {MiniRiffInfo} riff */ + addRiff(riff) { + this._riffList.push(riff); + } - /** - * @returns {Buffer} - */ - serialize() { - try { - const neededSize = this.size(); - this._header.length = neededSize + 4; - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; // offset is 4 - buffer.writeUInt16BE(this._riffList.length, offset); - offset += 4; - for (const riff of this._riffList) { - riff.serialize().copy(buffer, offset); - offset += riff.size(); - } + /** + * @returns {Buffer} + */ + serialize() { + try { + const neededSize = this.size(); + this._header.length = neededSize + 4; + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; // offset is 4 + buffer.writeUInt16BE(this._riffList.length, offset); + offset += 4; + for (const riff of this._riffList) { + riff.serialize().copy(buffer, offset); + offset += riff.size(); + } - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing MiniRiffMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown(error, "Error serializing MiniRiffMessage"); + } + } - toString() { - return `MiniRiffMessage: ${this._riffList.length} riff(s)`; - } + toString() { + return `MiniRiffMessage: ${this._riffList.length} riff(s)`; + } } export class MiniRiffInfo extends SerializedBuffer { - constructor() { - super(); - this._riffName = ""; // max 32 bytes - this._riffId = 0; // 4 bytes - this._riffPopulation = 0; // 2 bytes - } + constructor() { + super(); + this._riffName = ""; // max 32 bytes + this._riffId = 0; // 4 bytes + this._riffPopulation = 0; // 2 bytes + } - size() { - return 4 + (4 + this._riffName.length + 1) + 4 + 2; - } + size() { + return 4 + (4 + this._riffName.length + 1) + 4 + 2; + } - /** - * @returns {Buffer} - */ - serialize() { - try { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - if (this._riffName.length > 32) { - throw new ServerError("Riff name is too long"); - } - offset = serializeString(this._riffName, buffer, offset); + /** + * @returns {Buffer} + */ + serialize() { + try { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + if (this._riffName.length > 32) { + throw new ServerError("Riff name is too long"); + } + offset = serializeString(this._riffName, buffer, offset); - buffer.writeUInt32BE(this._riffId, offset); - offset += 4; - buffer.writeUInt16BE(this._riffPopulation, offset); + buffer.writeUInt32BE(this._riffId, offset); + offset += 4; + buffer.writeUInt16BE(this._riffPopulation, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - toString() { - return `MiniRiffInfo: ${this._riffName} (${this._riffId}) - ${this._riffPopulation}`; - } + toString() { + return `MiniRiffInfo: ${this._riffName} (${this._riffId}) - ${this._riffPopulation}`; + } } diff --git a/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts index ca9ce169d..c677ed936 100644 --- a/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBYCLIENT_COMMANDS.ts @@ -8,49 +8,49 @@ import { GameMessageOpCode } from "../../interfaces/index.js"; export const NPS_LOBBYCLIENT_COMMANDS: GameMessageOpCode[] = [ - { name: "NPS_LOGIN", value: 256, module: "Lobby" }, - { name: "NPS_GET_USER_LIST", value: 257, module: "Lobby" }, - { name: "NPS_GET_MY_USER_DATA", value: 258, module: "Lobby" }, - { name: "NPS_SET_MY_USER_DATA", value: 259, module: "Lobby" }, - { name: "NPS_LOG_OFF_SERVER", value: 260, module: "Lobby" }, - { name: "NPS_CLOSE_COMM_CHANNEL", value: 261, module: "Lobby" }, - { name: "NPS_OPEN_COMM_CHANNEL", value: 262, module: "Lobby" }, - { name: "NPS_GET_CLIENT_COUNT", value: 263, module: "Lobby" }, - { name: "NPS_START_GAME", value: 264, module: "Lobby" }, - { name: "NPS_READY_FOR_GAME", value: 265, module: "Lobby" }, - { name: "NPS_START_GAME_SERVER", value: 266, module: "Lobby" }, - { name: "NPS_SET_SLEEP_STATE", value: 267, module: "Lobby" }, - { name: "NPS_GET_SERVER_INFO", value: 268, module: "Lobby" }, - { name: "NPS_SET_COMM_FLAGS", value: 269, module: "Lobby" }, - { name: "NPS_GET_READY_LIST", value: 270, module: "Lobby" }, - { name: "NPS_SEND_SERVER_LIST", value: 271, module: "Lobby" }, - { name: "NPS_SET_COMM_CHANNEL_RATE", value: 272, module: "Lobby" }, - { name: "NPS_SET_HEARTBEAT_TIMEOUT", value: 273, module: "Lobby" }, - { name: "NPS_GET_HEARTBEAT_TIMEOUT", value: 274, module: "Lobby" }, - { name: "NPS_SET_CHANNEL_DATA", value: 275, module: "Lobby" }, - { name: "NPS_FILE_START", value: 276, module: "Lobby" }, - { name: "NPS_FILE_DATA", value: 277, module: "Lobby" }, - { name: "NPS_FILE_COMPLETED", value: 278, module: "Lobby" }, - { name: "NPS_BOOT_USER_FROM_CHANNEL", value: 279, module: "Lobby" }, - { name: "NPS_LOCATE_USER", value: 280, module: "Lobby" }, - { name: "NPS_ENABLE_FILTER", value: 281, module: "Lobby" }, - { name: "NPS_DISABLE_FILTER", value: 282, module: "Lobby" }, - { name: "NPS_SLEEP_SERVER", value: 283, module: "Lobby" }, - { name: "NPS_WAKE_SERVER", value: 284, module: "Lobby" }, - { name: "NPS_TERMINATE_GAME_SERVER", value: 285, module: "Lobby" }, - { name: "NPS_SEND_SKU_REGISTRY", value: 286, module: "Lobby" }, - { name: "NPS_SET_READY_FOR_GAME", value: 287, module: "Lobby" }, - { name: "NPS_LOGIN_RESP", value: 288, module: "Lobby" }, - { name: "NPS_SOCKET_RECONNECT", value: 289, module: "Lobby" }, - { name: "NPS_SET_SLOT", value: 290, module: "Lobby" }, - { name: "NPS_GET_SLOT_LIST", value: 291, module: "Lobby" }, - { name: "NPS_SET_CHANNEL_CLOSED", value: 292, module: "Lobby" }, - { name: "NPS_UDP_STATUS", value: 293, module: "Lobby" }, - { name: "NPS_GET_USER_INFO", value: 294, module: "Lobby" }, - { name: "NPS_GET_MASTER_LIST", value: 295, module: "Lobby" }, - { name: "NPS_GET_MINI_USER_LIST", value: 296, module: "Lobby" }, - { name: "NPS_UDP_FAILURE", value: 297, module: "Lobby" }, - { name: "NPS_BUDDYLIST_REFRESH", value: 298, module: "Lobby" }, - { name: "NPS_BUDDYLIST_ADD_USERS", value: 299, module: "Lobby" }, - { name: "NPS_BUDDYLIST_REMOVE_USERS", value: 300, module: "Lobby" }, + { name: "NPS_LOGIN", value: 256, module: "Lobby" }, + { name: "NPS_GET_USER_LIST", value: 257, module: "Lobby" }, + { name: "NPS_GET_MY_USER_DATA", value: 258, module: "Lobby" }, + { name: "NPS_SET_MY_USER_DATA", value: 259, module: "Lobby" }, + { name: "NPS_LOG_OFF_SERVER", value: 260, module: "Lobby" }, + { name: "NPS_CLOSE_COMM_CHANNEL", value: 261, module: "Lobby" }, + { name: "NPS_OPEN_COMM_CHANNEL", value: 262, module: "Lobby" }, + { name: "NPS_GET_CLIENT_COUNT", value: 263, module: "Lobby" }, + { name: "NPS_START_GAME", value: 264, module: "Lobby" }, + { name: "NPS_READY_FOR_GAME", value: 265, module: "Lobby" }, + { name: "NPS_START_GAME_SERVER", value: 266, module: "Lobby" }, + { name: "NPS_SET_SLEEP_STATE", value: 267, module: "Lobby" }, + { name: "NPS_GET_SERVER_INFO", value: 268, module: "Lobby" }, + { name: "NPS_SET_COMM_FLAGS", value: 269, module: "Lobby" }, + { name: "NPS_GET_READY_LIST", value: 270, module: "Lobby" }, + { name: "NPS_SEND_SERVER_LIST", value: 271, module: "Lobby" }, + { name: "NPS_SET_COMM_CHANNEL_RATE", value: 272, module: "Lobby" }, + { name: "NPS_SET_HEARTBEAT_TIMEOUT", value: 273, module: "Lobby" }, + { name: "NPS_GET_HEARTBEAT_TIMEOUT", value: 274, module: "Lobby" }, + { name: "NPS_SET_CHANNEL_DATA", value: 275, module: "Lobby" }, + { name: "NPS_FILE_START", value: 276, module: "Lobby" }, + { name: "NPS_FILE_DATA", value: 277, module: "Lobby" }, + { name: "NPS_FILE_COMPLETED", value: 278, module: "Lobby" }, + { name: "NPS_BOOT_USER_FROM_CHANNEL", value: 279, module: "Lobby" }, + { name: "NPS_LOCATE_USER", value: 280, module: "Lobby" }, + { name: "NPS_ENABLE_FILTER", value: 281, module: "Lobby" }, + { name: "NPS_DISABLE_FILTER", value: 282, module: "Lobby" }, + { name: "NPS_SLEEP_SERVER", value: 283, module: "Lobby" }, + { name: "NPS_WAKE_SERVER", value: 284, module: "Lobby" }, + { name: "NPS_TERMINATE_GAME_SERVER", value: 285, module: "Lobby" }, + { name: "NPS_SEND_SKU_REGISTRY", value: 286, module: "Lobby" }, + { name: "NPS_SET_READY_FOR_GAME", value: 287, module: "Lobby" }, + { name: "NPS_LOGIN_RESP", value: 288, module: "Lobby" }, + { name: "NPS_SOCKET_RECONNECT", value: 289, module: "Lobby" }, + { name: "NPS_SET_SLOT", value: 290, module: "Lobby" }, + { name: "NPS_GET_SLOT_LIST", value: 291, module: "Lobby" }, + { name: "NPS_SET_CHANNEL_CLOSED", value: 292, module: "Lobby" }, + { name: "NPS_UDP_STATUS", value: 293, module: "Lobby" }, + { name: "NPS_GET_USER_INFO", value: 294, module: "Lobby" }, + { name: "NPS_GET_MASTER_LIST", value: 295, module: "Lobby" }, + { name: "NPS_GET_MINI_USER_LIST", value: 296, module: "Lobby" }, + { name: "NPS_UDP_FAILURE", value: 297, module: "Lobby" }, + { name: "NPS_BUDDYLIST_REFRESH", value: 298, module: "Lobby" }, + { name: "NPS_BUDDYLIST_ADD_USERS", value: 299, module: "Lobby" }, + { name: "NPS_BUDDYLIST_REMOVE_USERS", value: 300, module: "Lobby" }, ]; diff --git a/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts index 486a3a096..a7fe1f9a3 100644 --- a/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBYSERVER_COMMANDS.ts @@ -7,51 +7,51 @@ import { GameMessageOpCode } from "../../interfaces/index.js"; * @type {TNPS_COMMAND_MAP[]} */ export const NPS_LOBBYSERVER_COMMANDS: GameMessageOpCode[] = [ - { name: "NPS_FORCE_LOGOFF", value: 513, module: "Lobby" }, - { name: "NPS_USER_LEFT", value: 514, module: "Lobby" }, - { name: "NPS_USER_JOINED", value: 515, module: "Lobby" }, - { name: "NPS_USER_INFO", value: 516, module: "Lobby" }, - { name: "NPS_SYSTEM_ALERT", value: 517, module: "Lobby" }, - { name: "NPS_CLIENT_COUNT", value: 518, module: "Lobby" }, - { name: "NPS_ACK", value: 519, module: "Lobby" }, - { name: "NPS_USER_LEFT_CHANNEL", value: 520, module: "Lobby" }, - { name: "NPS_CHANNEL_CLOSED", value: 521, module: "Lobby" }, - { name: "NPS_DUP_USER", value: 522, module: "Lobby" }, - { name: "NPS_SERVER_FULL", value: 523, module: "Lobby" }, - { name: "NPS_USER_JOINED_CHANNEL", value: 524, module: "Lobby" }, - { name: "NPS_SERVER_INFO", value: 525, module: "Lobby" }, - { name: "NPS_CHANNEL_CREATED", value: 526, module: "Lobby" }, - { name: "NPS_CHANNEL_DELETED", value: 527, module: "Lobby" }, - { name: "NPS_READY_LIST", value: 528, module: "Lobby" }, - { name: "NPS_USER_LIST", value: 529, module: "Lobby" }, - { name: "NPS_SERVER_LIST", value: 530, module: "Lobby" }, - { name: "NPS_CHANNEL_DENIED", value: 531, module: "Lobby" }, - { name: "NPS_CHANNEL_GRANTED", value: 532, module: "Lobby" }, - { name: "NPS_CHANNEL_CONDITIONAL", value: 533, module: "Lobby" }, - { name: "NPS_SERVER_REDIRECT", value: 534, module: "Lobby" }, - { name: "NPS_HEARTBEAT", value: 535, module: "Lobby" }, - { name: "NPS_HEARTBEAT_TIMEOUT", value: 536, module: "Lobby" }, - { name: "NPS_CHANNEL_UPDATE", value: 537, module: "Lobby" }, - { name: "NPS_FORCE_LEAVE_CHANNEL", value: 538, module: "Lobby" }, - { name: "NPS_USER_LOCATION", value: 539, module: "Lobby" }, - { name: "NPS_GAME_SERVER_STARTED", value: 540, module: "Lobby" }, - { name: "NPS_GAME_SERVER_TERMINATED", value: 541, module: "Lobby" }, - { name: "NPS_VERSIONS_DIFFERENT", value: 542, module: "Lobby" }, - { name: "NPS_SEND_VERSION_STRING", value: 543, module: "Lobby" }, - { name: "NPS_GAME_SKU_REGISTRY_KEY", value: 544, module: "Lobby" }, - { name: "NPS_PLUGIN_ACK", value: 545, module: "Lobby" }, - { name: "NPS_SERVER_CRASHED", value: 546, module: "Lobby" }, - { name: "NPS_OPEN_COMM_CHANNEL_ACK", value: 547, module: "Lobby" }, - { name: "NPS_GAME_SERVER_STATE_CHANGE", value: 548, module: "Lobby" }, - { name: "NPS_SLOT_UPDATE", value: 549, module: "Lobby" }, - { name: "NPS_SLOT_LIST", value: 550, module: "Lobby" }, - { name: "NPS_CHANNEL_MASTER", value: 551, module: "Lobby" }, - { name: "NPS_CHANNEL_MASTER_LIST", value: 552, module: "Lobby" }, - { name: "NPS_MINI_USER_LIST", value: 553, module: "Lobby" }, - { name: "NPS_INVALID_KEY", value: 554, module: "Lobby" }, - { name: "NPS_NO_VALIDATION_SERVER", value: 555, module: "Lobby" }, - { name: "NPS_INC_MINI_USER_LIST", value: 556, module: "Lobby" }, - { name: "NPS_DEC_MINI_USER_LIST", value: 557, module: "Lobby" }, - { name: "NPS_BUDDY_LIST", value: 558, module: "Lobby" }, - { name: "NPS_BUDDYLIST_UPDATE", value: 559, module: "Lobby" }, + { name: "NPS_FORCE_LOGOFF", value: 513, module: "Lobby" }, + { name: "NPS_USER_LEFT", value: 514, module: "Lobby" }, + { name: "NPS_USER_JOINED", value: 515, module: "Lobby" }, + { name: "NPS_USER_INFO", value: 516, module: "Lobby" }, + { name: "NPS_SYSTEM_ALERT", value: 517, module: "Lobby" }, + { name: "NPS_CLIENT_COUNT", value: 518, module: "Lobby" }, + { name: "NPS_ACK", value: 519, module: "Lobby" }, + { name: "NPS_USER_LEFT_CHANNEL", value: 520, module: "Lobby" }, + { name: "NPS_CHANNEL_CLOSED", value: 521, module: "Lobby" }, + { name: "NPS_DUP_USER", value: 522, module: "Lobby" }, + { name: "NPS_SERVER_FULL", value: 523, module: "Lobby" }, + { name: "NPS_USER_JOINED_CHANNEL", value: 524, module: "Lobby" }, + { name: "NPS_SERVER_INFO", value: 525, module: "Lobby" }, + { name: "NPS_CHANNEL_CREATED", value: 526, module: "Lobby" }, + { name: "NPS_CHANNEL_DELETED", value: 527, module: "Lobby" }, + { name: "NPS_READY_LIST", value: 528, module: "Lobby" }, + { name: "NPS_USER_LIST", value: 529, module: "Lobby" }, + { name: "NPS_SERVER_LIST", value: 530, module: "Lobby" }, + { name: "NPS_CHANNEL_DENIED", value: 531, module: "Lobby" }, + { name: "NPS_CHANNEL_GRANTED", value: 532, module: "Lobby" }, + { name: "NPS_CHANNEL_CONDITIONAL", value: 533, module: "Lobby" }, + { name: "NPS_SERVER_REDIRECT", value: 534, module: "Lobby" }, + { name: "NPS_HEARTBEAT", value: 535, module: "Lobby" }, + { name: "NPS_HEARTBEAT_TIMEOUT", value: 536, module: "Lobby" }, + { name: "NPS_CHANNEL_UPDATE", value: 537, module: "Lobby" }, + { name: "NPS_FORCE_LEAVE_CHANNEL", value: 538, module: "Lobby" }, + { name: "NPS_USER_LOCATION", value: 539, module: "Lobby" }, + { name: "NPS_GAME_SERVER_STARTED", value: 540, module: "Lobby" }, + { name: "NPS_GAME_SERVER_TERMINATED", value: 541, module: "Lobby" }, + { name: "NPS_VERSIONS_DIFFERENT", value: 542, module: "Lobby" }, + { name: "NPS_SEND_VERSION_STRING", value: 543, module: "Lobby" }, + { name: "NPS_GAME_SKU_REGISTRY_KEY", value: 544, module: "Lobby" }, + { name: "NPS_PLUGIN_ACK", value: 545, module: "Lobby" }, + { name: "NPS_SERVER_CRASHED", value: 546, module: "Lobby" }, + { name: "NPS_OPEN_COMM_CHANNEL_ACK", value: 547, module: "Lobby" }, + { name: "NPS_GAME_SERVER_STATE_CHANGE", value: 548, module: "Lobby" }, + { name: "NPS_SLOT_UPDATE", value: 549, module: "Lobby" }, + { name: "NPS_SLOT_LIST", value: 550, module: "Lobby" }, + { name: "NPS_CHANNEL_MASTER", value: 551, module: "Lobby" }, + { name: "NPS_CHANNEL_MASTER_LIST", value: 552, module: "Lobby" }, + { name: "NPS_MINI_USER_LIST", value: 553, module: "Lobby" }, + { name: "NPS_INVALID_KEY", value: 554, module: "Lobby" }, + { name: "NPS_NO_VALIDATION_SERVER", value: 555, module: "Lobby" }, + { name: "NPS_INC_MINI_USER_LIST", value: 556, module: "Lobby" }, + { name: "NPS_DEC_MINI_USER_LIST", value: 557, module: "Lobby" }, + { name: "NPS_BUDDY_LIST", value: 558, module: "Lobby" }, + { name: "NPS_BUDDYLIST_UPDATE", value: 559, module: "Lobby" }, ]; diff --git a/packages/lobby/src/NPS_LOBBY_COMMANDS.ts b/packages/lobby/src/NPS_LOBBY_COMMANDS.ts index 1379582dc..29daac94c 100644 --- a/packages/lobby/src/NPS_LOBBY_COMMANDS.ts +++ b/packages/lobby/src/NPS_LOBBY_COMMANDS.ts @@ -8,6 +8,6 @@ import { NPS_LOBBYSERVER_COMMANDS } from "./NPS_LOBBYSERVER_COMMANDS.js"; * @type {NpsCommandMap[]} */ export const NPS_LOBBY_COMMANDS: GameMessageOpCode[] = [ - ...NPS_LOBBYCLIENT_COMMANDS, - ...NPS_LOBBYSERVER_COMMANDS, + ...NPS_LOBBYCLIENT_COMMANDS, + ...NPS_LOBBYSERVER_COMMANDS, ]; diff --git a/packages/lobby/src/UserInfoMessage.ts b/packages/lobby/src/UserInfoMessage.ts index 6ef0ea3f8..651185b46 100644 --- a/packages/lobby/src/UserInfoMessage.ts +++ b/packages/lobby/src/UserInfoMessage.ts @@ -1,131 +1,131 @@ import { ServerError } from "../../shared/errors/ServerError.js"; import { - LegacyMessage, - deserializeString, - serializeString, + LegacyMessage, + deserializeString, + serializeString, } from "../../shared/messageFactory.js"; // eslint-disable-next-line no-unused-vars import { LoginInfoMessage } from "./LoginInfoMessage.js"; export class UserInfo { - _userId: number; - _userName: string; - _userData: Buffer; - constructor() { - this._userId = 0; // 4 bytes - this._userName = ""; // 4 bytes + string + 1 byte - this._userData = Buffer.alloc(64); // 64 bytes - } + _userId: number; + _userName: string; + _userData: Buffer; + constructor() { + this._userId = 0; // 4 bytes + this._userName = ""; // 4 bytes + string + 1 byte + this._userData = Buffer.alloc(64); // 64 bytes + } - deserialize(buffer: Buffer) { - let offset = 0; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length; - buffer.copy(this._userData, 0, offset, offset + 64); - return this; - } + deserialize(buffer: Buffer) { + let offset = 0; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length; + buffer.copy(this._userData, 0, offset, offset + 64); + return this; + } - serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); - return buffer; - } + this._userData.copy(buffer, offset); + return buffer; + } - size() { - let size = 4; // userId - size += 4 + this._userName.length + 1; - size += this._userData.length; - return size; - } + size() { + let size = 4; // userId + size += 4 + this._userName.length + 1; + size += this._userData.length; + return size; + } } export class UserInfoMessage extends LegacyMessage { - _userId: number; - _userName: string; - _userData: Buffer; - constructor() { - super(); - this._userId = 0; // 4 bytes - this._userName = ""; // 4 bytes + string + 1 byte - this._userData = Buffer.alloc(64); // 64 bytes - } + _userId: number; + _userName: string; + _userData: Buffer; + constructor() { + super(); + this._userId = 0; // 4 bytes + this._userName = ""; // 4 bytes + string + 1 byte + this._userData = Buffer.alloc(64); // 64 bytes + } - /** - * @param {Buffer} buffer - * @returns {UserInfoMessage} - */ - override deserialize(buffer: Buffer): this { - try { - this._header._doDeserialize(buffer); - let offset = this._header._size; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length + 1; - buffer.copy(this._userData, 0, offset, offset + 64); + /** + * @param {Buffer} buffer + * @returns {UserInfoMessage} + */ + override deserialize(buffer: Buffer): this { + try { + this._header._doDeserialize(buffer); + let offset = this._header._size; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length + 1; + buffer.copy(this._userData, 0, offset, offset + 64); - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing LoginInfoMessage", - ); - } - } + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing LoginInfoMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); + this._userData.copy(buffer, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - /** - * @param {LoginInfoMessage} loginInfoMessage - */ - fromLoginInfoMessage(loginInfoMessage: LoginInfoMessage) { - this._userId = loginInfoMessage._userId; - this._userName = loginInfoMessage._userName; - this._userData = loginInfoMessage._userData; - this._header.length = this.calculateLength(); - return this; - } + /** + * @param {LoginInfoMessage} loginInfoMessage + */ + fromLoginInfoMessage(loginInfoMessage: LoginInfoMessage) { + this._userId = loginInfoMessage._userId; + this._userName = loginInfoMessage._userName; + this._userData = loginInfoMessage._userData; + this._header.length = this.calculateLength(); + return this; + } - calculateLength() { - this._header._size = 4 + 4 + 64; - this._header.length += 4 + this._userName.length + 1; - this._header.length += this._userData.length; - return this._header.length; - } + calculateLength() { + this._header._size = 4 + 4 + 64; + this._header.length += 4 + this._userName.length + 1; + this._header.length += this._userData.length; + return this._header.length; + } - override toString() { - return `UserInfoMessage: ${JSON.stringify({ - userId: this._userId, - userName: this._userName, - userData: this._userData.toString("hex"), - })}`; - } + override toString() { + return `UserInfoMessage: ${JSON.stringify({ + userId: this._userId, + userName: this._userName, + userData: this._userData.toString("hex"), + })}`; + } } diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 777e04787..2e1a6651a 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -1,58 +1,53 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; +import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../../shared/log.js"; import { LegacyMessage } from "../../../shared/messageFactory.js"; import { UserInfo } from "../UserInfoMessage.js"; -import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; export async function _setMyUserData({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; - - try { - log.debug("Handling NPS_SET_MY_USER_DATA"); - log.debug(`Received command: ${message.serialize().toString("hex")}`); - - const incomingMessage = new UserInfo(); - incomingMessage.deserialize(message.serialize()); - - log.debug(`User ID: ${incomingMessage._userId}`); - - // Get the database instance - const db = getDatabaseServer(); - - // Update the user's data - db.updateUser({ - userId: incomingMessage._userId, - userData: incomingMessage._userData, - }); - - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._header.id = 516; - packetResult.deserialize(incomingMessage.serialize()); - - log.debug( - `Sending response: ${packetResult.serialize().toString("hex")}`, - ); - - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error handling NPS_SET_MY_USER_DATA", - ); - } + log.level = getServerConfiguration({}).logLevel ?? "info"; + + try { + log.debug("Handling NPS_SET_MY_USER_DATA"); + log.debug(`Received command: ${message.serialize().toString("hex")}`); + + const incomingMessage = new UserInfo(); + incomingMessage.deserialize(message.serialize()); + + log.debug(`User ID: ${incomingMessage._userId}`); + + // Get the database instance + const db = getDatabaseServer(); + + // Update the user's data + db.updateUser({ + userId: incomingMessage._userId, + userData: incomingMessage._userData, + }); + + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._header.id = 516; + packetResult.deserialize(incomingMessage.serialize()); + + log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); + + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown(error, "Error handling NPS_SET_MY_USER_DATA"); + } } diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index 10b9fd451..e008f3c1b 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -1,19 +1,19 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getServerConfiguration } from "../../../shared/Configuration.js"; import { - fetchStateFromDatabase, - getEncryption, - updateEncryption, + fetchStateFromDatabase, + getEncryption, + updateEncryption, } from "../../../shared/State.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../../shared/log.js"; import { - LegacyMessage, - MessageBuffer, - SerializedBuffer, + LegacyMessage, + MessageBuffer, + SerializedBuffer, } from "../../../shared/messageFactory.js"; -import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; -import { handleGetMiniUserList } from "./handleGetMiniUserList.js"; import { _setMyUserData } from "./_setMyUserData.js"; +import { handleGetMiniUserList } from "./handleGetMiniUserList.js"; +import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; // eslint-disable-next-line no-unused-vars /** @@ -32,16 +32,16 @@ import { _setMyUserData } from "./_setMyUserData.js"; * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = []; /** @@ -57,41 +57,41 @@ export const messageHandlers: { * }>} */ async function encryptCmd({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage | MessageBuffer; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage | MessageBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: LegacyMessage | MessageBuffer; + connectionId: string; + message: LegacyMessage | MessageBuffer; }> { - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const encryption = getEncryption(state, connectionId); + const encryption = getEncryption(state, connectionId); - if (typeof encryption === "undefined") { - throw new ServerError( - `Unable to locate encryption session for connection id ${connectionId}`, - ); - } + if (typeof encryption === "undefined") { + throw new ServerError( + `Unable to locate encryption session for connection id ${connectionId}`, + ); + } - const result = encryption.commandEncryption.encrypt(message.data); + const result = encryption.commandEncryption.encrypt(message.data); - updateEncryption(state, encryption).save(); + updateEncryption(state, encryption).save(); - log.debug(`[ciphered Cmd: ${result.toString("hex")}`); + log.debug(`[ciphered Cmd: ${result.toString("hex")}`); - message.setBuffer(result); + message.setBuffer(result); - return { - connectionId, - message, - }; + return { + connectionId, + message, + }; } /** @@ -107,72 +107,72 @@ async function encryptCmd({ * }>} */ async function decryptCmd({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: LegacyMessage; + connectionId: string; + message: LegacyMessage; }> { - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const encryption = getEncryption(state, connectionId); + const encryption = getEncryption(state, connectionId); - if (typeof encryption === "undefined") { - throw new ServerError( - `Unable to locate encryption session for connection id ${connectionId}`, - ); - } + if (typeof encryption === "undefined") { + throw new ServerError( + `Unable to locate encryption session for connection id ${connectionId}`, + ); + } - const result = encryption.commandEncryption.decrypt(message.data); + const result = encryption.commandEncryption.decrypt(message.data); - updateEncryption(state, encryption).save(); + updateEncryption(state, encryption).save(); - log.debug(`[Deciphered Cmd: ${result.toString("hex")}`); + log.debug(`[Deciphered Cmd: ${result.toString("hex")}`); - message.setBuffer(result); + message.setBuffer(result); - return { - connectionId, - message, - }; + return { + connectionId, + message, + }; } export type NpsCommandHandler = { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: LegacyMessage; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - message: LegacyMessage; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + message: LegacyMessage; + }>; }; const npsCommandHandlers: NpsCommandHandler[] = [ - { - opCode: 0x128, - name: "NPS_GET_MINI_USER_LIST", - handler: handleGetMiniUserList, - }, - { - opCode: 0x30c, - name: "NPS_SEND_MINI_RIFF_LIST", - handler: handleSendMiniRiffList, - }, - { - opCode: 0x103, - name: "NPS_SET_MY_USER_DATA", - handler: _setMyUserData, - }, + { + opCode: 0x128, + name: "NPS_GET_MINI_USER_LIST", + handler: handleGetMiniUserList, + }, + { + opCode: 0x30c, + name: "NPS_SEND_MINI_RIFF_LIST", + handler: handleSendMiniRiffList, + }, + { + opCode: 0x103, + name: "NPS_SET_MY_USER_DATA", + handler: _setMyUserData, + }, ]; /** @@ -188,42 +188,42 @@ const npsCommandHandlers: NpsCommandHandler[] = [ * }>}} */ async function handleCommand({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: MessageBuffer | LegacyMessage; + connectionId: string; + message: MessageBuffer | LegacyMessage; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - const incommingRequest = message; + log.level = getServerConfiguration({}).logLevel ?? "info"; + const incommingRequest = message; - log.debug( - `Received command: ${incommingRequest._doSerialize().toString("hex")}`, - ); + log.debug( + `Received command: ${incommingRequest._doSerialize().toString("hex")}`, + ); - // What is the command? - const command = incommingRequest.data.readUInt16BE(0); + // What is the command? + const command = incommingRequest.data.readUInt16BE(0); - log.debug(`Command: ${command}`); + log.debug(`Command: ${command}`); - const handler = npsCommandHandlers.find((h) => h.opCode === command); + const handler = npsCommandHandlers.find((h) => h.opCode === command); - if (typeof handler === "undefined") { - throw new ServerError(`Unknown command: ${command}`); - } + if (typeof handler === "undefined") { + throw new ServerError(`Unknown command: ${command}`); + } - return handler.handler({ - connectionId, - message, - log, - }); + return handler.handler({ + connectionId, + message, + log, + }); } /** @@ -240,64 +240,64 @@ async function handleCommand({ */ export async function handleEncryptedNPSCommand({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - - const inboundMessage = new LegacyMessage(); - inboundMessage._doDeserialize(message.data); - - // Decipher - const decipheredMessage = decryptCmd({ - connectionId, - message: inboundMessage, - log, - }); - - const response = handleCommand({ - connectionId, - message: (await decipheredMessage).message, - log, - }); - - // Encipher - const encryptedResponse = encryptCmd({ - connectionId, - message: (await response).message, - log, - }); - - const outboundMessage = new SerializedBuffer(); - outboundMessage.setBuffer((await encryptedResponse).message.serialize()); - - return { - connectionId, - messages: [outboundMessage], - }; + log.level = getServerConfiguration({}).logLevel ?? "info"; + + const inboundMessage = new LegacyMessage(); + inboundMessage._doDeserialize(message.data); + + // Decipher + const decipheredMessage = decryptCmd({ + connectionId, + message: inboundMessage, + log, + }); + + const response = handleCommand({ + connectionId, + message: (await decipheredMessage).message, + log, + }); + + // Encipher + const encryptedResponse = encryptCmd({ + connectionId, + message: (await response).message, + log, + }); + + const outboundMessage = new SerializedBuffer(); + outboundMessage.setBuffer((await encryptedResponse).message.serialize()); + + return { + connectionId, + messages: [outboundMessage], + }; } export const channelRecordSize = 40; export const channels = [ - { - id: 0, - name: "Channel 1", - population: 1, - }, - { - id: 191, - name: "MCCHAT", - population: 0, - }, + { + id: 0, + name: "Channel 1", + population: 1, + }, + { + id: 191, + name: "MCCHAT", + population: 0, + }, ]; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index e91cfcd94..a7be8eef6 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -1,12 +1,12 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../../shared/log.js"; import { - GameMessage, - LegacyMessage, - serializeString, + GameMessage, + LegacyMessage, + serializeString, } from "../../../shared/messageFactory.js"; import { UserInfo } from "../UserInfoMessage.js"; -import { getServerConfiguration } from "../../../shared/Configuration.js"; import { channelRecordSize, channels } from "./encryptedCommand.js"; const user1 = new UserInfo(); @@ -20,65 +20,60 @@ user1._userName = "User 1"; */ export async function handleGetMiniUserList({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_GET_MINI_USER_LIST"); - log.debug(`Received command: ${message._doSerialize().toString("hex")}`); + log.debug("Handling NPS_GET_MINI_USER_LIST"); + log.debug(`Received command: ${message._doSerialize().toString("hex")}`); - const outgoingGameMessage = new GameMessage(553); + const outgoingGameMessage = new GameMessage(553); - const resultSize = channelRecordSize * channels.length - 12; + const resultSize = channelRecordSize * channels.length - 12; - const packetContent = Buffer.alloc(resultSize); + const packetContent = Buffer.alloc(resultSize); - let offset = 0; - try { - // Add the response code - packetContent.writeUInt32BE(17, offset); - offset += 4; // offset is 8 + let offset = 0; + try { + // Add the response code + packetContent.writeUInt32BE(17, offset); + offset += 4; // offset is 8 - packetContent.writeUInt32BE(1, offset); - offset += 4; // offset is 12 + packetContent.writeUInt32BE(1, offset); + offset += 4; // offset is 12 - // Write the count of users - packetContent.writeUInt32BE(1, offset); - offset += 4; // offset is 16 + // Write the count of users + packetContent.writeUInt32BE(1, offset); + offset += 4; // offset is 16 - // write the persona id - packetContent.writeUInt32BE(user1._userId, offset); - offset += 4; // offset is 20 + // write the persona id + packetContent.writeUInt32BE(user1._userId, offset); + offset += 4; // offset is 20 - // write the persona name - serializeString(user1._userName, packetContent, offset); + // write the persona name + serializeString(user1._userName, packetContent, offset); - outgoingGameMessage.setRecordData(packetContent); + outgoingGameMessage.setRecordData(packetContent); - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._doDeserialize(outgoingGameMessage.serialize()); + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._doDeserialize(outgoingGameMessage.serialize()); - log.debug( - `Sending response: ${packetResult.serialize().toString("hex")}`, - ); + log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error handling NPS_MINI_USER_LIST", - ); - } + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown(error, "Error handling NPS_MINI_USER_LIST"); + } } diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index ae03f6d0e..1a73f3656 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -1,11 +1,11 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../../shared/log.js"; import { - GameMessage, - LegacyMessage, - serializeString, + GameMessage, + LegacyMessage, + serializeString, } from "../../../shared/messageFactory.js"; -import { getServerConfiguration } from "../../../shared/Configuration.js"; import { channelRecordSize, channels } from "./encryptedCommand.js"; // const users = [user1]; @@ -16,60 +16,58 @@ import { channelRecordSize, channels } from "./encryptedCommand.js"; * @param {import("pino").Logger} [args.log=getServerLogger({ module: "Lobby" })] */ export async function handleSendMiniRiffList({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_SEND_MINI_RIFF_LIST"); - log.debug(`Received command: ${message._doSerialize().toString("hex")}`); + log.debug("Handling NPS_SEND_MINI_RIFF_LIST"); + log.debug(`Received command: ${message._doSerialize().toString("hex")}`); - const outgoingGameMessage = new GameMessage(1028); + const outgoingGameMessage = new GameMessage(1028); - const resultSize = channelRecordSize * channels.length - 12; + const resultSize = channelRecordSize * channels.length - 12; - const packetContent = Buffer.alloc(resultSize); + const packetContent = Buffer.alloc(resultSize); - let offset = 0; - try { - packetContent.writeUInt32BE(channels.length, offset); - offset += 4; // offset is 8 + let offset = 0; + try { + packetContent.writeUInt32BE(channels.length, offset); + offset += 4; // offset is 8 - // loop through the channels - for (const channel of channels) { - offset = serializeString(channel.name, packetContent, offset); + // loop through the channels + for (const channel of channels) { + offset = serializeString(channel.name, packetContent, offset); - packetContent.writeUInt32BE(channel.id, offset); - offset += 4; - packetContent.writeUInt16BE(channel.population, offset); - offset += 2; - } + packetContent.writeUInt32BE(channel.id, offset); + offset += 4; + packetContent.writeUInt16BE(channel.population, offset); + offset += 2; + } - outgoingGameMessage.setRecordData(packetContent); + outgoingGameMessage.setRecordData(packetContent); - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._doDeserialize(outgoingGameMessage.serialize()); + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._doDeserialize(outgoingGameMessage.serialize()); - log.debug( - `Sending response: ${packetResult.serialize().toString("hex")}`, - ); + log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error handling NPS_SEND_MINI_RIFF_LIST", - ); - } + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error handling NPS_SEND_MINI_RIFF_LIST", + ); + } } diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index 8fd082e68..95e634c6a 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -3,28 +3,28 @@ import { getServerLogger } from "../../../shared/log.js"; import { SerializedBuffer } from "../../../shared/messageFactory.js"; export async function handleTrackingPing({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_TRACKING_PING"); - log.debug(`Received command: ${message.toString()}`); + log.debug("Handling NPS_TRACKING_PING"); + log.debug(`Received command: ${message.toString()}`); - log.debug("Skipping response"); + log.debug("Skipping response"); - return { - connectionId, - messages: [], - }; + return { + connectionId, + messages: [], + }; } diff --git a/packages/lobby/src/handlers/heartbeat.js b/packages/lobby/src/handlers/heartbeat.js index 4fb628001..2f4dc4897 100644 --- a/packages/lobby/src/handlers/heartbeat.js +++ b/packages/lobby/src/handlers/heartbeat.js @@ -1,7 +1,7 @@ import { getServerLogger } from "../../../shared/log.js"; import { - NPSMessage, - SerializedBuffer, + NPSMessage, + SerializedBuffer, } from "../../../shared/messageFactory.js"; /** @@ -15,26 +15,26 @@ import { * }>} */ export async function _npsHeartbeat({ - connectionId, - // @ts-ignore - message, // eslint-disable-line no-unused-vars - log = getServerLogger({ - module: "_npsHeartbeat", - }), + connectionId, + // @ts-ignore + message, // eslint-disable-line no-unused-vars + log = getServerLogger({ + module: "_npsHeartbeat", + }), }) { - const packetContent = Buffer.alloc(8); - const packetResult = new NPSMessage(); - packetResult._header.id = 0x127; - packetResult.setBuffer(packetContent); + const packetContent = Buffer.alloc(8); + const packetResult = new NPSMessage(); + packetResult._header.id = 0x127; + packetResult.setBuffer(packetContent); - log.debug("Dumping packet..."); - log.debug(packetResult.toString()); + log.debug("Dumping packet..."); + log.debug(packetResult.toString()); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(packetResult.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(packetResult.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/lobby/src/handlers/index.js b/packages/lobby/src/handlers/index.js index 9452a5d82..32818b8a4 100644 --- a/packages/lobby/src/handlers/index.js +++ b/packages/lobby/src/handlers/index.js @@ -27,15 +27,15 @@ import { _npsRequestGameConnectServer } from "./requestConnectGameServer.js"; /** @type {GameMessageHandler[]} */ export const handlerMap = [ - { - opCode: 100, - name: "Connect game server", - handler: _npsRequestGameConnectServer, - }, - { opCode: 217, name: "Heartbeat", handler: _npsHeartbeat }, - { - opCode: 1101, - name: "Encrypted command", - handler: handleEncryptedNPSCommand, - }, + { + opCode: 100, + name: "Connect game server", + handler: _npsRequestGameConnectServer, + }, + { opCode: 217, name: "Heartbeat", handler: _npsHeartbeat }, + { + opCode: 1101, + name: "Encrypted command", + handler: handleEncryptedNPSCommand, + }, ]; diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index e30a2ca99..e691296d2 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -1,21 +1,21 @@ -import { getServerLogger } from "../../../shared/log.js"; -import { getPersonasByPersonaId } from "../../../persona/src/getPersonasByPersonaId.js"; import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; +import { getPersonasByPersonaId } from "../../../persona/src/getPersonasByPersonaId.js"; +import { getServerLogger } from "../../../shared/log.js"; import { LoginInfoMessage } from "../LoginInfoMessage.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; -import { UserInfoMessage } from "../UserInfoMessage.js"; import { - createCommandEncryptionPair, - createDataEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, } from "../../../gateway/src/encryption.js"; import { - McosEncryption, - addEncryption, - fetchStateFromDatabase, - getEncryption, + McosEncryption, + addEncryption, + fetchStateFromDatabase, + getEncryption, } from "../../../shared/State.js"; +import { ServerError } from "../../../shared/errors/ServerError.js"; import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { UserInfoMessage } from "../UserInfoMessage.js"; /** * Convert to zero padded hex @@ -25,12 +25,12 @@ import { SerializedBuffer } from "../../../shared/messageFactory.js"; * @return {string} */ export function toHex(data: Buffer): string { - /** @type {string[]} */ - const bytes: string[] = []; - data.forEach((b: number) => { - bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); - }); - return bytes.join(""); + /** @type {string[]} */ + const bytes: string[] = []; + data.forEach((b: number) => { + bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); + }); + return bytes.join(""); } /** @@ -44,95 +44,93 @@ export function toHex(data: Buffer): string { * }>} */ export async function _npsRequestGameConnectServer({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: import("../../../interfaces/index.js").ServiceArgs): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - // This is a NPS_LoginInfo packet - // As a legacy packet, it used the old NPSMessage format - // of a 4 byte header, followed by a 4 byte length, followed - // by the data payload. - - const inboundMessage = new LoginInfoMessage(); - inboundMessage.deserialize(message.data); - - log.debug(`LoginInfoMessage: ${inboundMessage.toString()}`); - - const personas = await getPersonasByPersonaId({ - id: inboundMessage._userId, - }); - if (typeof personas[0] === "undefined") { - const err = new ServerError("No personas found."); - throw err; - } - - const { customerId } = personas[0]; - - const state = fetchStateFromDatabase(); - - const existingEncryption = getEncryption(state, connectionId); - - if (!existingEncryption) { - // Set the encryption keys on the lobby connection - const databaseManager = getDatabaseServer({ log }); - const keys = await databaseManager - .fetchSessionKeyByCustomerId(customerId) - .catch((/** @type {unknown} */ error: unknown) => { - throw new ServerError( - `Unable to fetch session key for customerId ${customerId.toString()}: ${String( - error, - )}`, - ); - }); - if (keys === undefined) { - throw new ServerError("Error fetching session keys!"); - } - - // We have the session keys, set them on the connection - try { - const newCommandEncryptionPair = createCommandEncryptionPair( - keys.sessionKey, - ); - - const newDataEncryptionPair = createDataEncryptionPair( - keys.sessionKey, - ); - - const newEncryption = new McosEncryption({ - connectionId, - commandEncryptionPair: newCommandEncryptionPair, - dataEncryptionPair: newDataEncryptionPair, - }); - - addEncryption(state, newEncryption).save(); - } catch (error) { - throw new ServerError(`Error creating encryption: ${error}`); - } - } - - // We have a session, we are good to go! - // Send the response packet - - const responsePacket = new UserInfoMessage(); - responsePacket.fromLoginInfoMessage(inboundMessage); - - responsePacket._header.id = 0x120; - - // log the packet - log.debug( - `!!! outbound lobby login response packet: ${responsePacket.toString()}`, - ); - - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket.serialize()); - - return { - connectionId, - messages: [outboundMessage], - }; + // This is a NPS_LoginInfo packet + // As a legacy packet, it used the old NPSMessage format + // of a 4 byte header, followed by a 4 byte length, followed + // by the data payload. + + const inboundMessage = new LoginInfoMessage(); + inboundMessage.deserialize(message.data); + + log.debug(`LoginInfoMessage: ${inboundMessage.toString()}`); + + const personas = await getPersonasByPersonaId({ + id: inboundMessage._userId, + }); + if (typeof personas[0] === "undefined") { + const err = new ServerError("No personas found."); + throw err; + } + + const { customerId } = personas[0]; + + const state = fetchStateFromDatabase(); + + const existingEncryption = getEncryption(state, connectionId); + + if (!existingEncryption) { + // Set the encryption keys on the lobby connection + const databaseManager = getDatabaseServer({ log }); + const keys = await databaseManager + .fetchSessionKeyByCustomerId(customerId) + .catch((/** @type {unknown} */ error: unknown) => { + throw new ServerError( + `Unable to fetch session key for customerId ${customerId.toString()}: ${String( + error, + )}`, + ); + }); + if (keys === undefined) { + throw new ServerError("Error fetching session keys!"); + } + + // We have the session keys, set them on the connection + try { + const newCommandEncryptionPair = createCommandEncryptionPair( + keys.sessionKey, + ); + + const newDataEncryptionPair = createDataEncryptionPair(keys.sessionKey); + + const newEncryption = new McosEncryption({ + connectionId, + commandEncryptionPair: newCommandEncryptionPair, + dataEncryptionPair: newDataEncryptionPair, + }); + + addEncryption(state, newEncryption).save(); + } catch (error) { + throw new ServerError(`Error creating encryption: ${error}`); + } + } + + // We have a session, we are good to go! + // Send the response packet + + const responsePacket = new UserInfoMessage(); + responsePacket.fromLoginInfoMessage(inboundMessage); + + responsePacket._header.id = 0x120; + + // log the packet + log.debug( + `!!! outbound lobby login response packet: ${responsePacket.toString()}`, + ); + + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket.serialize()); + + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index bca479286..d5cf07d24 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -14,17 +14,17 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { _npsRequestGameConnectServer } from "./handlers/requestConnectGameServer.js"; -import { handleEncryptedNPSCommand } from "./handlers/encryptedCommand.js"; -import { getServerLogger } from "../../shared/log.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerConfiguration } from "../../shared/Configuration.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../shared/log.js"; import { - LegacyMessage, - NPSMessage, - SerializedBuffer, + LegacyMessage, + NPSMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; +import { handleEncryptedNPSCommand } from "./handlers/encryptedCommand.js"; import { handleTrackingPing } from "./handlers/handleTrackingPing.js"; +import { _npsRequestGameConnectServer } from "./handlers/requestConnectGameServer.js"; /** * Array of supported message handlers @@ -42,32 +42,32 @@ import { handleTrackingPing } from "./handlers/handleTrackingPing.js"; * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 256, // 0x100 - name: "User login", - handler: _npsRequestGameConnectServer, - }, - { - opCode: 4353, // 0x1101 - name: "Encrypted command", - handler: handleEncryptedNPSCommand, - }, - { - opCode: 535, // 0x0217 - name: "Tracking ping", - handler: handleTrackingPing, - }, + { + opCode: 256, // 0x100 + name: "User login", + handler: _npsRequestGameConnectServer, + }, + { + opCode: 4353, // 0x1101 + name: "Encrypted command", + handler: handleEncryptedNPSCommand, + }, + { + opCode: 535, // 0x0217 + name: "Tracking ping", + handler: handleTrackingPing, + }, ]; /** @@ -82,70 +82,70 @@ export const messageHandlers: { * @throws {Error} Unknown code was received */ export async function receiveLobbyData({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - /** @type {LegacyMessage | NPSMessage} */ - let inboundMessage: LegacyMessage | NPSMessage; + /** @type {LegacyMessage | NPSMessage} */ + let inboundMessage: LegacyMessage | NPSMessage; - // Check data length - const dataLength = message.data.length; + // Check data length + const dataLength = message.data.length; - if (dataLength < 4) { - throw new ServerError( - `Data length ${dataLength} is too short to deserialize`, - ); - } + if (dataLength < 4) { + throw new ServerError( + `Data length ${dataLength} is too short to deserialize`, + ); + } - if (dataLength > 12) { - inboundMessage = new NPSMessage(); - } else { - inboundMessage = new LegacyMessage(); - } + if (dataLength > 12) { + inboundMessage = new NPSMessage(); + } else { + inboundMessage = new LegacyMessage(); + } - inboundMessage._doDeserialize(message.data); + inboundMessage._doDeserialize(message.data); - const { data } = message; - log.debug( - `Received Lobby packet', + const { data } = message; + log.debug( + `Received Lobby packet', ${JSON.stringify({ - data: data.toString("hex"), - })}`, - ); + data: data.toString("hex"), + })}`, + ); - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } - try { - const result = await supportedHandler.handler({ - connectionId, - message, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving receiveLobbyData"); - return result; - } catch (error) { - throw new ServerError(`Error handling lobby data: ${String(error)}`); - } + try { + const result = await supportedHandler.handler({ + connectionId, + message, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving receiveLobbyData"); + return result; + } catch (error) { + throw new ServerError(`Error handling lobby data: ${String(error)}`); + } } diff --git a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts index 76c2445ee..27a4a9884 100644 --- a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts +++ b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts @@ -1,17 +1,17 @@ +import { describe, expect, it } from "vitest"; import { LegacyMessage } from "../../../shared/messageFactory.js"; import { handleSendMiniRiffList } from "../../src/handlers/handleSendMiniRiffList.js"; -import { describe, it, expect } from "vitest"; describe("handleSendMiniRiffList", () => { - it("should return a buffer", async () => { - // arrange - const incomingMessage = new LegacyMessage(); + it("should return a buffer", async () => { + // arrange + const incomingMessage = new LegacyMessage(); - const result = await handleSendMiniRiffList({ - connectionId: "test", - message: incomingMessage, - }); + const result = await handleSendMiniRiffList({ + connectionId: "test", + message: incomingMessage, + }); - expect(result.message).toBeInstanceOf(LegacyMessage); - }); + expect(result.message).toBeInstanceOf(LegacyMessage); + }); }); diff --git a/packages/login/src/NPSUserStatus.ts b/packages/login/src/NPSUserStatus.ts index 5f31d7975..2634ca949 100644 --- a/packages/login/src/NPSUserStatus.ts +++ b/packages/login/src/NPSUserStatus.ts @@ -1,10 +1,10 @@ import { privateDecrypt } from "node:crypto"; import { readFileSync } from "node:fs"; +import { Logger } from "pino"; +import { Configuration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { LegacyMessage } from "../../shared/messageFactory.js"; -import { Configuration } from "../../shared/Configuration.js"; -import { Logger } from "pino"; /** * @typedef {import("../../shared/Configuration.js").Configuration} Configuration @@ -32,109 +32,105 @@ import { Logger } from "pino"; */ export class NPSUserStatus extends LegacyMessage { - _config: Configuration; - log: Logger; - sessionKey: string; - opCode: number; - contextId: string; - buffer: Buffer; - /** - * - * @param {Buffer} packet - * @param {Configuration} config - * @param {import("pino").Logger} log - */ - constructor( - packet: Buffer, - config: Configuration, - log: import("pino").Logger, - ) { - super(); - this._config = config; - this.log = log; - log.debug("Constructing NPSUserStatus"); - this._header._doDeserialize(packet); - this.sessionKey = ""; + _config: Configuration; + log: Logger; + sessionKey: string; + opCode: number; + contextId: string; + buffer: Buffer; + /** + * + * @param {Buffer} packet + * @param {Configuration} config + * @param {import("pino").Logger} log + */ + constructor( + packet: Buffer, + config: Configuration, + log: import("pino").Logger, + ) { + super(); + this._config = config; + this.log = log; + log.debug("Constructing NPSUserStatus"); + this._header._doDeserialize(packet); + this.sessionKey = ""; - // Save the NPS opCode - this.opCode = packet.readInt16BE(0); + // Save the NPS opCode + this.opCode = packet.readInt16BE(0); - // Save the contextId - this.contextId = packet.subarray(14, 48).toString(); + // Save the contextId + this.contextId = packet.subarray(14, 48).toString(); - // Save the raw packet - this.buffer = packet; - } + // Save the raw packet + this.buffer = packet; + } - /** - * ExtractSessionKeyFromPacket - * - * Take 128 bytes - * They are the utf-8 of the hex bytes that are the key - * - * @param {Buffer} rawPacket - * @return {void} - */ - extractSessionKeyFromPacket(rawPacket: Buffer): void { - this.log.debug("Extracting key"); + /** + * ExtractSessionKeyFromPacket + * + * Take 128 bytes + * They are the utf-8 of the hex bytes that are the key + * + * @param {Buffer} rawPacket + * @return {void} + */ + extractSessionKeyFromPacket(rawPacket: Buffer): void { + this.log.debug("Extracting key"); - // Extract the session key which is 128 acsii characters (256 bytes) - const sessionKeyAsAscii = rawPacket.subarray(52, 308).toString("utf8"); - this.log.trace(`Session key: ${sessionKeyAsAscii}`); + // Extract the session key which is 128 acsii characters (256 bytes) + const sessionKeyAsAscii = rawPacket.subarray(52, 308).toString("utf8"); + this.log.trace(`Session key: ${sessionKeyAsAscii}`); - // length of the session key should be 128 bytes - const sessionkeyString = Buffer.from(sessionKeyAsAscii, "hex"); - // Decrypt the sessionkey - try { - if (!this._config.privateKeyFile) { - throw new ServerError("No private key file specified"); - } - const privatekeyContents = readFileSync( - this._config.privateKeyFile, - ); + // length of the session key should be 128 bytes + const sessionkeyString = Buffer.from(sessionKeyAsAscii, "hex"); + // Decrypt the sessionkey + try { + if (!this._config.privateKeyFile) { + throw new ServerError("No private key file specified"); + } + const privatekeyContents = readFileSync(this._config.privateKeyFile); - const decrypted = privateDecrypt( - { - key: privatekeyContents, - }, - sessionkeyString, - ); // length of decrypted should be 128 bytes - this.sessionKey = decrypted.subarray(2, -4).toString("hex"); // length of session key should be 12 bytes - } catch (error) { - this.log.trace(`Session key: ${sessionkeyString.toString("utf8")}`); // 128 bytes - this.log.trace(`decrypted: ${this.sessionKey}`); // 12 bytes - this.log.error(`Error decrypting session key: ${String(error)}`); - throw new ServerError( - `Unable to extract session key: ${String(error)}`, - ); - } - } + const decrypted = privateDecrypt( + { + key: privatekeyContents, + }, + sessionkeyString, + ); // length of decrypted should be 128 bytes + this.sessionKey = decrypted.subarray(2, -4).toString("hex"); // length of session key should be 12 bytes + } catch (error) { + this.log.trace(`Session key: ${sessionkeyString.toString("utf8")}`); // 128 bytes + this.log.trace(`decrypted: ${this.sessionKey}`); // 12 bytes + this.log.error(`Error decrypting session key: ${String(error)}`); + throw new ServerError(`Unable to extract session key: ${String(error)}`); + } + } - toJSON() { - this.log.debug("Returning as JSON"); - return { - msgNo: this._header.id, - msgLength: this._header.length, - content: this.data.toString("hex"), - contextId: this.contextId, - sessionKey: this.sessionKey, - rawBuffer: this.buffer.toString("hex"), - }; - } + toJSON() { + this.log.debug("Returning as JSON"); + return { + msgNo: this._header.id, + msgLength: this._header.length, + content: this.data.toString("hex"), + contextId: this.contextId, + sessionKey: this.sessionKey, + rawBuffer: this.buffer.toString("hex"), + }; + } - /** - * @return {string} - */ - dumpPacket(): string { - this.log.debug("Returning as string"); - let message = this._header.toString(); - message = message.concat( - `NPSUserStatus, + /** + * @return {string} + */ + dumpPacket(): string { + this.log.debug("Returning as string"); + let message = this._header.toString(); + message = message.concat( + `NPSUserStatus, ${JSON.stringify({ - contextId: this.contextId, - sessionkey: this.sessionKey, - })}`, - ); - return message; - } + contextId: this.contextId, + sessionkey: this.sessionKey, + })}`, + ); + return message; + } } diff --git a/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts index f0fa79993..ef0909fdb 100644 --- a/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts +++ b/packages/login/src/NPS_LOGINCLIENT_COMMANDS.ts @@ -8,48 +8,48 @@ import { GameMessageOpCode } from "../../interfaces/index.js"; export const NPS_LOGINCLIENT_COMMANDS: GameMessageOpCode[] = [ - { name: "NPS_USER_LOGIN", value: 1281, module: "Login" }, - { name: "NPS_GAME_LOGIN", value: 1282, module: "Login" }, - { name: "NPS_REGISTER_GAME_LOGIN", value: 1283, module: "Login" }, - { name: "NPS_SET_GAME_BLOB", value: 1284, module: "Login" }, - { name: "NPS_GET_NEXT_SERVER", value: 1285, module: "Login" }, - { name: "NPS_NEW_EA_ACCOUNT", value: 1286, module: "Login" }, - { name: "NPS_NEW_GAME_ACCOUNT", value: 1287, module: "Login" }, - { name: "NPS_UPDATE_EA_ACCOUNT", value: 1288, module: "Login" }, - { name: "NPS_UPDATE_GAME_ACCOUNT", value: 1289, module: "Login" }, - { name: "NPS_LOCATE_PLAYER", value: 1290, module: "Login" }, - { name: "NPS_GET_BUDDY_LIST", value: 1291, module: "Login" }, - { name: "NPS_ADD_BUDDY_LIST", value: 1292, module: "Login" }, - { name: "NPS_DELETE_BUDDY_LIST", value: 1293, module: "Login" }, - { name: "NPS_CLEAR_BUDDY_LIST", value: 1294, module: "Login" }, - { name: "NPS_REGISTER_GAME_LOGOUT", value: 1295, module: "Login" }, - { name: "NPS_GET_GENERIC_HS_DATA", value: 1296, module: "Login" }, - { name: "NPS_PUT_GENERIC_HS_DATA", value: 1297, module: "Login" }, - { name: "NPS_DELETE_GAME_PERSONA", value: 1298, module: "Login" }, - { name: "NPS_READ_SERVER_DATA_LIST", value: 1299, module: "Login" }, - { name: "NPS_DELETE GENERIC_HS_DATA", value: 1300, module: "Login" }, - { name: "NPS_GET_PLAYER_RANK", value: 1301, module: "Login" }, - { name: "NPS_GET_TOP_PLAYERS", value: 1302, module: "Login" }, - { name: "NPS_ADD_BUDDY_BY_NAME", value: 1303, module: "Login" }, - { name: "NPS_GET_BUDDY_INFO", value: 1304, module: "Login" }, - { name: "NPS_GET_PERSONA_INFO", value: 1305, module: "Login" }, - { name: "NPS_GET_LEADER_BOARD", value: 1306, module: "Login" }, - { name: "NPS_SRP_USERNAME", value: 1307, module: "Login" }, - { name: "NPS_SRP_NGS", value: 1308, module: "Login" }, - { name: "NPS_SRP_A", value: 1309, module: "Login" }, - { name: "NPS_SRP_B", value: 1310, module: "Login" }, - { name: "NPS_SRP_USER_VERIFY", value: 1311, module: "Login" }, - { name: "NPS_SRP_SERVER_VERIFY", value: 1312, module: "Login" }, - { name: "NPS_FILE_BUG_REPORT", value: 1313, module: "Login" }, - { name: "NPS_GET_GENERIC_FIELD_RANKING", value: 1314, module: "Login" }, - { name: "NPS_SEND_EMAIL", value: 1315, module: "Login" }, - { name: "NPS_RECEIVE_EMAIL", value: 1316, module: "Login" }, - { name: "NPS_DELETE_EMAILS", value: 1317, module: "Login" }, - { name: "NPS_LIST_EMAILS", value: 1318, module: "Login" }, - { name: "NPS_AAI_REQUEST", value: 1328, module: "Login" }, - { name: "NPS_AAI_CRACK", value: 1329, module: "Login" }, - { name: "NPS_GET_PERSONA_MAPS", value: 1330, module: "Login" }, - { name: "NPS_VALIDATE_PERSONA_NAME", value: 1331, module: "Login" }, - { name: "NPS_CHECK_TOKEN", value: 1332, module: "Login" }, - { name: "NPS_GET_USER_STATUS", value: 1333, module: "Login" }, + { name: "NPS_USER_LOGIN", value: 1281, module: "Login" }, + { name: "NPS_GAME_LOGIN", value: 1282, module: "Login" }, + { name: "NPS_REGISTER_GAME_LOGIN", value: 1283, module: "Login" }, + { name: "NPS_SET_GAME_BLOB", value: 1284, module: "Login" }, + { name: "NPS_GET_NEXT_SERVER", value: 1285, module: "Login" }, + { name: "NPS_NEW_EA_ACCOUNT", value: 1286, module: "Login" }, + { name: "NPS_NEW_GAME_ACCOUNT", value: 1287, module: "Login" }, + { name: "NPS_UPDATE_EA_ACCOUNT", value: 1288, module: "Login" }, + { name: "NPS_UPDATE_GAME_ACCOUNT", value: 1289, module: "Login" }, + { name: "NPS_LOCATE_PLAYER", value: 1290, module: "Login" }, + { name: "NPS_GET_BUDDY_LIST", value: 1291, module: "Login" }, + { name: "NPS_ADD_BUDDY_LIST", value: 1292, module: "Login" }, + { name: "NPS_DELETE_BUDDY_LIST", value: 1293, module: "Login" }, + { name: "NPS_CLEAR_BUDDY_LIST", value: 1294, module: "Login" }, + { name: "NPS_REGISTER_GAME_LOGOUT", value: 1295, module: "Login" }, + { name: "NPS_GET_GENERIC_HS_DATA", value: 1296, module: "Login" }, + { name: "NPS_PUT_GENERIC_HS_DATA", value: 1297, module: "Login" }, + { name: "NPS_DELETE_GAME_PERSONA", value: 1298, module: "Login" }, + { name: "NPS_READ_SERVER_DATA_LIST", value: 1299, module: "Login" }, + { name: "NPS_DELETE GENERIC_HS_DATA", value: 1300, module: "Login" }, + { name: "NPS_GET_PLAYER_RANK", value: 1301, module: "Login" }, + { name: "NPS_GET_TOP_PLAYERS", value: 1302, module: "Login" }, + { name: "NPS_ADD_BUDDY_BY_NAME", value: 1303, module: "Login" }, + { name: "NPS_GET_BUDDY_INFO", value: 1304, module: "Login" }, + { name: "NPS_GET_PERSONA_INFO", value: 1305, module: "Login" }, + { name: "NPS_GET_LEADER_BOARD", value: 1306, module: "Login" }, + { name: "NPS_SRP_USERNAME", value: 1307, module: "Login" }, + { name: "NPS_SRP_NGS", value: 1308, module: "Login" }, + { name: "NPS_SRP_A", value: 1309, module: "Login" }, + { name: "NPS_SRP_B", value: 1310, module: "Login" }, + { name: "NPS_SRP_USER_VERIFY", value: 1311, module: "Login" }, + { name: "NPS_SRP_SERVER_VERIFY", value: 1312, module: "Login" }, + { name: "NPS_FILE_BUG_REPORT", value: 1313, module: "Login" }, + { name: "NPS_GET_GENERIC_FIELD_RANKING", value: 1314, module: "Login" }, + { name: "NPS_SEND_EMAIL", value: 1315, module: "Login" }, + { name: "NPS_RECEIVE_EMAIL", value: 1316, module: "Login" }, + { name: "NPS_DELETE_EMAILS", value: 1317, module: "Login" }, + { name: "NPS_LIST_EMAILS", value: 1318, module: "Login" }, + { name: "NPS_AAI_REQUEST", value: 1328, module: "Login" }, + { name: "NPS_AAI_CRACK", value: 1329, module: "Login" }, + { name: "NPS_GET_PERSONA_MAPS", value: 1330, module: "Login" }, + { name: "NPS_VALIDATE_PERSONA_NAME", value: 1331, module: "Login" }, + { name: "NPS_CHECK_TOKEN", value: 1332, module: "Login" }, + { name: "NPS_GET_USER_STATUS", value: 1333, module: "Login" }, ]; diff --git a/packages/login/src/NPS_LOGIN_COMMANDS.ts b/packages/login/src/NPS_LOGIN_COMMANDS.ts index 407bc17ff..b49a697dc 100644 --- a/packages/login/src/NPS_LOGIN_COMMANDS.ts +++ b/packages/login/src/NPS_LOGIN_COMMANDS.ts @@ -8,5 +8,5 @@ import { NPS_LOGINCLIENT_COMMANDS } from "./NPS_LOGINCLIENT_COMMANDS.js"; */ export const NPS_LOGIN_COMMANDS: GameMessageOpCode[] = [ - ...NPS_LOGINCLIENT_COMMANDS, + ...NPS_LOGINCLIENT_COMMANDS, ]; diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index 7ab4c5dd7..d5f727f74 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -25,103 +25,101 @@ import { handleLoginData } from "./internal.js"; * Please use {@link LoginServer.getInstance()} */ export class LoginServer { - databaseManager: DatabaseManager; - _log: any; - static _instance: LoginServer | undefined; - /** - * Please use {@see LoginServer.getInstance} instead - * @param {object} options - * @param {import("../../interfaces/index.js").DatabaseManager} options.database - * @param {import("pino").Logger} [options.log=getServerLogger({ module: "LoginServer" })] - * @memberof LoginServer - */ - constructor({ - database = getDatabaseServer(), - log = getServerLogger({ - module: "LoginServer", - }), - }: { - database: import("../../interfaces/index.js").DatabaseManager; - log?: import("pino").Logger; - }) { - this.databaseManager = database; - this._log = log; - LoginServer._instance = this; - } + databaseManager: DatabaseManager; + _log: any; + static _instance: LoginServer | undefined; + /** + * Please use {@see LoginServer.getInstance} instead + * @param {object} options + * @param {import("../../interfaces/index.js").DatabaseManager} options.database + * @param {import("pino").Logger} [options.log=getServerLogger({ module: "LoginServer" })] + * @memberof LoginServer + */ + constructor({ + database = getDatabaseServer(), + log = getServerLogger({ + module: "LoginServer", + }), + }: { + database: import("../../interfaces/index.js").DatabaseManager; + log?: import("pino").Logger; + }) { + this.databaseManager = database; + this._log = log; + LoginServer._instance = this; + } - /** - * Get the single instance of the login server - * - * @static - * @param {import("../../interfaces/index.js").DatabaseManager} database - * @param {import("pino").Logger} log - * @return {LoginServer} - */ - static getInstance( - database: import("../../interfaces/index.js").DatabaseManager, - log: import("pino").Logger, - ): LoginServer { - if (typeof LoginServer._instance === "undefined") { - LoginServer._instance = new LoginServer({ - database, - log, - }); - } - return LoginServer._instance; - } + /** + * Get the single instance of the login server + * + * @static + * @param {import("../../interfaces/index.js").DatabaseManager} database + * @param {import("pino").Logger} log + * @return {LoginServer} + */ + static getInstance( + database: import("../../interfaces/index.js").DatabaseManager, + log: import("pino").Logger, + ): LoginServer { + if (typeof LoginServer._instance === "undefined") { + LoginServer._instance = new LoginServer({ + database, + log, + }); + } + return LoginServer._instance; + } - /** - * - * @param {string} contextId - * @return {import("../../interfaces/index.js").UserRecordMini} - */ - _npsGetCustomerIdByContextId( - contextId: string, - ): import("../../interfaces/index.js").UserRecordMini { - this._log.debug(">>> _npsGetCustomerIdByContextId"); - /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ - const users: import("../../interfaces/index.js").UserRecordMini[] = [ - { - contextId: "5213dee3a6bcdb133373b2d4f3b9962758", - customerId: 0x0012808b, - userId: 0x00000002, - }, - { - contextId: "d316cd2dd6bf870893dfbaaf17f965884e", - customerId: 0x0054b46c, - userId: 0x00000001, - }, - ]; - if (contextId.toString() === "") { - const err = new ServerError( - `Unknown contextId: ${contextId.toString()}`, - ); - throw err; - } + /** + * + * @param {string} contextId + * @return {import("../../interfaces/index.js").UserRecordMini} + */ + _npsGetCustomerIdByContextId( + contextId: string, + ): import("../../interfaces/index.js").UserRecordMini { + this._log.debug(">>> _npsGetCustomerIdByContextId"); + /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ + const users: import("../../interfaces/index.js").UserRecordMini[] = [ + { + contextId: "5213dee3a6bcdb133373b2d4f3b9962758", + customerId: 0x0012808b, + userId: 0x00000002, + }, + { + contextId: "d316cd2dd6bf870893dfbaaf17f965884e", + customerId: 0x0054b46c, + userId: 0x00000001, + }, + ]; + if (contextId.toString() === "") { + const err = new ServerError(`Unknown contextId: ${contextId.toString()}`); + throw err; + } - const userRecord = users.filter((user) => user.contextId === contextId); - if (typeof userRecord[0] === "undefined" || userRecord.length !== 1) { - this._log.debug( - `preparing to leave _npsGetCustomerIdByContextId after not finding record', + const userRecord = users.filter((user) => user.contextId === contextId); + if (typeof userRecord[0] === "undefined" || userRecord.length !== 1) { + this._log.debug( + `preparing to leave _npsGetCustomerIdByContextId after not finding record', ${JSON.stringify({ - contextId, - })}`, - ); - const err = new ServerError( - `Unable to locate user record matching contextId ${contextId}`, - ); - throw err; - } + contextId, + })}`, + ); + const err = new ServerError( + `Unable to locate user record matching contextId ${contextId}`, + ); + throw err; + } - this._log.debug( - `preparing to leave _npsGetCustomerIdByContextId after finding record', + this._log.debug( + `preparing to leave _npsGetCustomerIdByContextId after finding record', ${JSON.stringify({ - contextId, - userRecord, - })}`, - ); - return userRecord[0]; - } + contextId, + userRecord, + })}`, + ); + return userRecord[0]; + } } /** @type {LoginServer | undefined} */ @@ -139,30 +137,30 @@ LoginServer._instance = undefined; * @return {Promise} */ export async function receiveLoginData({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: { - connectionId: string; - message: NPSMessage; - log?: import("pino").Logger; + connectionId: string; + message: NPSMessage; + log?: import("pino").Logger; }): Promise { - try { - log.debug("Entering login module"); - const response = await handleLoginData({ - connectionId, - message, - log, - }); - log.debug(`There are ${response.messages.length} messages`); - log.debug("Exiting login module"); - return response; - } catch (error) { - const err = new ServerError( - `There was an error in the login service: ${String(error)}`, - ); - throw err; - } + try { + log.debug("Entering login module"); + const response = await handleLoginData({ + connectionId, + message, + log, + }); + log.debug(`There are ${response.messages.length} messages`); + log.debug("Exiting login module"); + return response; + } catch (error) { + const err = new ServerError( + `There was an error in the login service: ${String(error)}`, + ); + throw err; + } } diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index 2c14bb16c..2fb62af55 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -14,26 +14,26 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { getServerConfiguration } from "../../shared/Configuration.js"; -import { NPSUserStatus } from "./NPSUserStatus.js"; -import { getServerLogger } from "../../shared/log.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; +import { getServerLogger } from "../../shared/log.js"; import { NPSMessage, SerializedBuffer } from "../../shared/messageFactory.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; +import { NPSUserStatus } from "./NPSUserStatus.js"; /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ - { - contextId: "5213dee3a6bcdb133373b2d4f3b9962758", - customerId: 0x0012808b, - userId: 0x00000002, - }, - { - contextId: "d316cd2dd6bf870893dfbaaf17f965884e", - customerId: 0x0054b46c, - userId: 0x00000001, - }, + { + contextId: "5213dee3a6bcdb133373b2d4f3b9962758", + customerId: 0x0012808b, + userId: 0x00000002, + }, + { + contextId: "d316cd2dd6bf870893dfbaaf17f965884e", + customerId: 0x0054b46c, + userId: 0x00000001, + }, ]; /** @@ -49,113 +49,111 @@ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ * }>} */ async function login({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - const data = message.serialize(); + const data = message.serialize(); - log.debug(`Received login packet: ${connectionId}`); + log.debug(`Received login packet: ${connectionId}`); - log.debug("Requesting NPSUserStatus packet"); - const userStatus = new NPSUserStatus(data, getServerConfiguration({}), log); - log.debug("NPSUserStatus packet creation success"); + log.debug("Requesting NPSUserStatus packet"); + const userStatus = new NPSUserStatus(data, getServerConfiguration({}), log); + log.debug("NPSUserStatus packet creation success"); - log.debug("Requesting Key extraction"); - userStatus.extractSessionKeyFromPacket(data); - log.debug("Key extraction success"); + log.debug("Requesting Key extraction"); + userStatus.extractSessionKeyFromPacket(data); + log.debug("Key extraction success"); - const { contextId, sessionKey } = userStatus; + const { contextId, sessionKey } = userStatus; - log.debug( - `UserStatus object from _userLogin, + log.debug( + `UserStatus object from _userLogin, ${JSON.stringify({ - userStatus: userStatus.toJSON(), - })}`, - ); - userStatus.dumpPacket(); - - // Load the customer record by contextId - // TODO: #1175 Move customer records from being hard-coded to database records - const userRecord = userRecords.find((r) => { - return r.contextId === contextId; - }); - - if (typeof userRecord === "undefined") { - // We were not able to locate the user's record - const err = new ServerError( - `Unable to locate a user record for the context id: ${contextId}`, - ); - throw err; - } - - // Save sessionkey in database under customerId - log.debug("Preparing to update session key in db"); - await getDatabaseServer() - .updateSessionKey( - userRecord.customerId, - sessionKey ?? "", - contextId, - connectionId, - ) - .catch((error) => { - const err = new ServerError( - `Unable to update session key in the database: ${String( - error, - )}`, - ); - throw err; - }); - - log.debug("Session key updated"); - - const outboundMessage = new NetworkMessage(0x601); - - const dataBuffer = Buffer.alloc(26); - let offset = 0; - dataBuffer.writeInt32BE(userRecord.customerId, offset); - offset += 4; - dataBuffer.writeInt32BE(userRecord.userId, offset); - offset += 4; - dataBuffer.writeInt8(0, offset); // isCacheHit - offset += 1; - dataBuffer.writeInt8(0, offset); // ban - offset += 1; - dataBuffer.writeInt8(0, offset); // gag - offset += 1; - dataBuffer.write(sessionKey ?? "", offset, 12, "ascii"); - - const packetContent = dataBuffer; - - // Set the packet content in the outbound message - outboundMessage.data = packetContent; - - log.debug("Returning login response"); - log.debug(`Outbound message: ${outboundMessage.asHex()}`); - - const outboundMessage2 = new SerializedBuffer(); - outboundMessage2._doDeserialize(outboundMessage.serialize()); - - log.debug( - `Outbound message 2: ${outboundMessage2.serialize().toString("hex")}`, - ); - - // Update the data buffer - const response = { - connectionId, - messages: [outboundMessage2, outboundMessage2], - }; - log.debug("Leaving login"); - return response; + userStatus: userStatus.toJSON(), + })}`, + ); + userStatus.dumpPacket(); + + // Load the customer record by contextId + // TODO: #1175 Move customer records from being hard-coded to database records + const userRecord = userRecords.find((r) => { + return r.contextId === contextId; + }); + + if (typeof userRecord === "undefined") { + // We were not able to locate the user's record + const err = new ServerError( + `Unable to locate a user record for the context id: ${contextId}`, + ); + throw err; + } + + // Save sessionkey in database under customerId + log.debug("Preparing to update session key in db"); + await getDatabaseServer() + .updateSessionKey( + userRecord.customerId, + sessionKey ?? "", + contextId, + connectionId, + ) + .catch((error) => { + const err = new ServerError( + `Unable to update session key in the database: ${String(error)}`, + ); + throw err; + }); + + log.debug("Session key updated"); + + const outboundMessage = new NetworkMessage(0x601); + + const dataBuffer = Buffer.alloc(26); + let offset = 0; + dataBuffer.writeInt32BE(userRecord.customerId, offset); + offset += 4; + dataBuffer.writeInt32BE(userRecord.userId, offset); + offset += 4; + dataBuffer.writeInt8(0, offset); // isCacheHit + offset += 1; + dataBuffer.writeInt8(0, offset); // ban + offset += 1; + dataBuffer.writeInt8(0, offset); // gag + offset += 1; + dataBuffer.write(sessionKey ?? "", offset, 12, "ascii"); + + const packetContent = dataBuffer; + + // Set the packet content in the outbound message + outboundMessage.data = packetContent; + + log.debug("Returning login response"); + log.debug(`Outbound message: ${outboundMessage.asHex()}`); + + const outboundMessage2 = new SerializedBuffer(); + outboundMessage2._doDeserialize(outboundMessage.serialize()); + + log.debug( + `Outbound message 2: ${outboundMessage2.serialize().toString("hex")}`, + ); + + // Update the data buffer + const response = { + connectionId, + messages: [outboundMessage2, outboundMessage2], + }; + log.debug("Leaving login"); + return response; } /** @@ -174,22 +172,22 @@ async function login({ * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 1281, // 0x0501 - name: "UserLogin", - handler: login, - }, + { + opCode: 1281, // 0x0501 + name: "UserLogin", + handler: login, + }, ]; /** @@ -206,47 +204,47 @@ export const messageHandlers: { * }>} */ export async function handleLoginData({ - connectionId, - message, - log = getServerLogger({ - module: "handleLoginData", - }), + connectionId, + message, + log = getServerLogger({ + module: "handleLoginData", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug(`Received Login Server packet: ${connectionId}`); - - // The packet needs to be an NPSMessage - const inboundMessage = new NPSMessage(); - inboundMessage._doDeserialize(message.serialize()); - - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); - - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } - - try { - const result = await supportedHandler.handler({ - connectionId, - message, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving handleLoginData"); - return result; - } catch (error) { - throw new ServerError(`Error handling login data: ${String(error)}`); - } + log.level = getServerConfiguration({}).logLevel ?? "info"; + log.debug(`Received Login Server packet: ${connectionId}`); + + // The packet needs to be an NPSMessage + const inboundMessage = new NPSMessage(); + inboundMessage._doDeserialize(message.serialize()); + + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); + + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } + + try { + const result = await supportedHandler.handler({ + connectionId, + message, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving handleLoginData"); + return result; + } catch (error) { + throw new ServerError(`Error handling login data: ${String(error)}`); + } } diff --git a/packages/login/src/premadeLogin.ts b/packages/login/src/premadeLogin.ts index e78bd4113..2871596dd 100644 --- a/packages/login/src/premadeLogin.ts +++ b/packages/login/src/premadeLogin.ts @@ -5,273 +5,273 @@ */ export function premadeLogin() { - // TODO: #1181 Generate a dynamic login response message - return Buffer.from([ - // Live Packet - 0x06, - 0x01, // MsgId: 0x601 = NPS_USER_VALID = 1537 + // TODO: #1181 Generate a dynamic login response message + return Buffer.from([ + // Live Packet + 0x06, + 0x01, // MsgId: 0x601 = NPS_USER_VALID = 1537 - 0x01, - 0x00, // Packet Length: 0x003a = 58 + 0x01, + 0x00, // Packet Length: 0x003a = 58 - 0x21, - 0xf9, - 0x17, - 0xf2, // CustomerId: 0x21f917f2 = 568000498 + 0x21, + 0xf9, + 0x17, + 0xf2, // CustomerId: 0x21f917f2 = 568000498 - 0x28, - 0x85, - 0xd1, - 0x47, // PersonaId: 0x2885d147 = 676000007 + 0x28, + 0x85, + 0xd1, + 0x47, // PersonaId: 0x2885d147 = 676000007 - 0xab, // IsCacheHit: 0xab = 171 + 0xab, // IsCacheHit: 0xab = 171 - 0x01, // Ban: 0x01 = 1 + 0x01, // Ban: 0x01 = 1 - 0x00, // Gag: 0x00 = 0 + 0x00, // Gag: 0x00 = 0 - 0x00, - 0xec, - 0xf7, - 0xba, // SessionKey: 0x00ecf7ba = 155000186 + 0x00, + 0xec, + 0xf7, + 0xba, // SessionKey: 0x00ecf7ba = 155000186 - 0x7f, - 0x45, - 0x62, - 0x53, - 0x62, - 0xfe, + 0x7f, + 0x45, + 0x62, + 0x53, + 0x62, + 0xfe, - 0x53, - 0x7b, - 0x03, - 0x11, - 0x27, - 0x72, - 0xbd, - 0xa3, - 0x3d, - 0xa3, - 0x06, - 0x52, - 0x3a, - 0xfb, - 0x7c, - 0xd6, - 0xd5, - 0xdb, - 0x85, - 0x3d, - 0x73, - 0x66, - 0x8f, - 0x26, - 0x69, - 0x65, - 0x07, - 0x37, - 0x7a, - 0xe8, - 0xc9, - 0x45, - 0x99, - 0x6a, - 0xaf, - 0xe5, - 0xdf, - 0x1c, - 0xbd, - 0x1f, - 0x30, - 0xdc, - 0x5a, - 0x1a, - 0x29, - 0x4d, - 0xab, - 0x3d, - 0x0b, - 0x15, - 0xdf, - 0x33, - 0x32, - 0xdc, - 0x1e, - 0xe8, - 0x75, - 0x8b, - 0x54, - 0x34, - 0x26, - 0x0d, - 0x3a, - 0xa2, - 0xcf, - 0x2d, - 0x26, - 0x3d, - 0x7d, - 0xf7, - 0xec, - 0x3c, - 0x52, - 0xb2, - 0x34, - 0x57, - 0xc1, - 0x07, - 0xd7, - 0x6a, - 0xd4, - 0xdc, - 0x1e, - 0xd0, - 0x07, - 0x31, - 0xdd, - 0xe7, - 0x92, - 0x4b, - 0xf2, - 0x56, - 0xc8, - 0xb1, - 0x00, - 0x4d, - 0xd6, - 0xe8, - 0x79, - 0x14, - 0xf0, - 0x72, - 0x71, - 0x41, - 0x6d, - 0xce, - 0x11, - 0xe2, - 0xae, - 0x9d, - 0xec, - 0x55, - 0x6e, - 0xdd, - 0xdf, - 0xfa, - 0xdb, - 0x09, - 0x74, - 0x61, - 0x8c, - 0x67, - 0xf6, - 0xf7, - 0x65, - 0xf3, - 0x98, - 0xfd, - 0x6d, - 0x97, - 0x4b, - 0x3f, - 0x54, - 0x85, - 0x4f, - 0x2a, - 0x69, - 0x02, - 0xbe, - 0xb6, - 0xd4, - 0xa3, - 0x2f, - 0x5b, - 0x86, - 0x58, - 0x19, - 0xbd, - 0xa9, - 0x9e, - 0x21, - 0x63, - 0x50, - 0x9c, - 0x43, - 0x83, - 0x42, - 0xfa, - 0xa5, - 0x81, - 0x5c, - 0x1f, - 0xad, - 0x06, - 0x64, - 0x64, - 0x7f, - 0xe1, - 0x2b, - 0xdb, - 0xd0, - 0xee, - 0xa6, - 0x04, - 0x11, - 0x9a, - 0x00, - 0x00, - 0x00, - 0x00, - 0xb4, - 0x43, - 0xf5, - 0x00, - 0x00, - 0x27, - 0x1f, - 0x07, - 0xa3, - 0xbf, - 0x17, - 0x3d, - 0x9b, - 0x2e, - 0xde, - 0xae, - 0xdf, - 0x46, - 0x2f, - 0x30, - 0x11, - 0x70, - 0xbe, - 0x5f, - 0x90, - 0x46, - 0x0c, - 0x28, - 0x33, - 0xf0, - 0x08, - 0x88, - 0x03, - 0x05, - 0xbf, - 0xe5, - 0x53, - 0xcd, - 0xfa, - 0x45, - 0x77, - 0x2e, - 0x90, - 0xf3, - 0x4d, - 0xd1, - 0x44, - 0x89, - 0x00, - 0x00, - 0x00, // (0xa6 was old val) - ]); + 0x53, + 0x7b, + 0x03, + 0x11, + 0x27, + 0x72, + 0xbd, + 0xa3, + 0x3d, + 0xa3, + 0x06, + 0x52, + 0x3a, + 0xfb, + 0x7c, + 0xd6, + 0xd5, + 0xdb, + 0x85, + 0x3d, + 0x73, + 0x66, + 0x8f, + 0x26, + 0x69, + 0x65, + 0x07, + 0x37, + 0x7a, + 0xe8, + 0xc9, + 0x45, + 0x99, + 0x6a, + 0xaf, + 0xe5, + 0xdf, + 0x1c, + 0xbd, + 0x1f, + 0x30, + 0xdc, + 0x5a, + 0x1a, + 0x29, + 0x4d, + 0xab, + 0x3d, + 0x0b, + 0x15, + 0xdf, + 0x33, + 0x32, + 0xdc, + 0x1e, + 0xe8, + 0x75, + 0x8b, + 0x54, + 0x34, + 0x26, + 0x0d, + 0x3a, + 0xa2, + 0xcf, + 0x2d, + 0x26, + 0x3d, + 0x7d, + 0xf7, + 0xec, + 0x3c, + 0x52, + 0xb2, + 0x34, + 0x57, + 0xc1, + 0x07, + 0xd7, + 0x6a, + 0xd4, + 0xdc, + 0x1e, + 0xd0, + 0x07, + 0x31, + 0xdd, + 0xe7, + 0x92, + 0x4b, + 0xf2, + 0x56, + 0xc8, + 0xb1, + 0x00, + 0x4d, + 0xd6, + 0xe8, + 0x79, + 0x14, + 0xf0, + 0x72, + 0x71, + 0x41, + 0x6d, + 0xce, + 0x11, + 0xe2, + 0xae, + 0x9d, + 0xec, + 0x55, + 0x6e, + 0xdd, + 0xdf, + 0xfa, + 0xdb, + 0x09, + 0x74, + 0x61, + 0x8c, + 0x67, + 0xf6, + 0xf7, + 0x65, + 0xf3, + 0x98, + 0xfd, + 0x6d, + 0x97, + 0x4b, + 0x3f, + 0x54, + 0x85, + 0x4f, + 0x2a, + 0x69, + 0x02, + 0xbe, + 0xb6, + 0xd4, + 0xa3, + 0x2f, + 0x5b, + 0x86, + 0x58, + 0x19, + 0xbd, + 0xa9, + 0x9e, + 0x21, + 0x63, + 0x50, + 0x9c, + 0x43, + 0x83, + 0x42, + 0xfa, + 0xa5, + 0x81, + 0x5c, + 0x1f, + 0xad, + 0x06, + 0x64, + 0x64, + 0x7f, + 0xe1, + 0x2b, + 0xdb, + 0xd0, + 0xee, + 0xa6, + 0x04, + 0x11, + 0x9a, + 0x00, + 0x00, + 0x00, + 0x00, + 0xb4, + 0x43, + 0xf5, + 0x00, + 0x00, + 0x27, + 0x1f, + 0x07, + 0xa3, + 0xbf, + 0x17, + 0x3d, + 0x9b, + 0x2e, + 0xde, + 0xae, + 0xdf, + 0x46, + 0x2f, + 0x30, + 0x11, + 0x70, + 0xbe, + 0x5f, + 0x90, + 0x46, + 0x0c, + 0x28, + 0x33, + 0xf0, + 0x08, + 0x88, + 0x03, + 0x05, + 0xbf, + 0xe5, + 0x53, + 0xcd, + 0xfa, + 0x45, + 0x77, + 0x2e, + 0x90, + 0xf3, + 0x4d, + 0xd1, + 0x44, + 0x89, + 0x00, + 0x00, + 0x00, // (0xa6 was old val) + ]); } diff --git a/packages/login/test/LoginServer.test.ts b/packages/login/test/LoginServer.test.ts index 092187ee1..4bc92083f 100644 --- a/packages/login/test/LoginServer.test.ts +++ b/packages/login/test/LoginServer.test.ts @@ -1,22 +1,22 @@ -import { describe, it, expect } from "vitest"; -import { LoginServer } from "../src/index.js"; +import { describe, expect, it } from "vitest"; import { - mockDatabaseManager, - mockPino, - unmockPino, + mockDatabaseManager, + mockPino, + unmockPino, } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; +import { LoginServer } from "../src/index.js"; describe("LoginServer", () => { - describe("constructor", () => { - it("should create a new instance", () => { - mockPino(); - const loginServer = new LoginServer({ - database: mockDatabaseManager(), - log: getServerLogger({}), - }); - expect(loginServer).toBeDefined(); - unmockPino(); - }); - }); + describe("constructor", () => { + it("should create a new instance", () => { + mockPino(); + const loginServer = new LoginServer({ + database: mockDatabaseManager(), + log: getServerLogger({}), + }); + expect(loginServer).toBeDefined(); + unmockPino(); + }); + }); }); diff --git a/packages/mcots/ClientConnectionManager.ts b/packages/mcots/ClientConnectionManager.ts index 402201c26..204c1f483 100644 --- a/packages/mcots/ClientConnectionManager.ts +++ b/packages/mcots/ClientConnectionManager.ts @@ -1,49 +1,49 @@ import type { Connection } from "rusty-motors-connection"; export class ClientConnectionManager { - static _instance: ClientConnectionManager; - - static getInstance() { - if (!ClientConnectionManager._instance) { - ClientConnectionManager._instance = new ClientConnectionManager(); - } - return ClientConnectionManager._instance; - } - private _connections: Map = new Map(); - - public addConnection(connection: Connection) { - this._connections.set(connection.id, connection); - } - - public removeConnection(connectionId: string) { - this._connections.delete(connectionId); - } - - public getConnection(connectionId: string): Connection | undefined { - return this._connections.get(connectionId); - } - - public getConnections(): Connection[] { - return Array.from(this._connections.values()); - } - - public clearConnections() { - this._connections.clear(); - } - - static addConnection(connection: Connection) { - ClientConnectionManager.getInstance().addConnection(connection); - } - - static removeConnection(connectionId: string) { - ClientConnectionManager.getInstance().removeConnection(connectionId); - } - - static getConnection(connectionId: string): Connection | undefined { - return ClientConnectionManager.getInstance().getConnection(connectionId); - } - - static getConnections(): Connection[] { - return ClientConnectionManager.getInstance().getConnections(); - } + static _instance: ClientConnectionManager; + + static getInstance() { + if (!ClientConnectionManager._instance) { + ClientConnectionManager._instance = new ClientConnectionManager(); + } + return ClientConnectionManager._instance; + } + private _connections: Map = new Map(); + + public addConnection(connection: Connection) { + this._connections.set(connection.id, connection); + } + + public removeConnection(connectionId: string) { + this._connections.delete(connectionId); + } + + public getConnection(connectionId: string): Connection | undefined { + return this._connections.get(connectionId); + } + + public getConnections(): Connection[] { + return Array.from(this._connections.values()); + } + + public clearConnections() { + this._connections.clear(); + } + + static addConnection(connection: Connection) { + ClientConnectionManager.getInstance().addConnection(connection); + } + + static removeConnection(connectionId: string) { + ClientConnectionManager.getInstance().removeConnection(connectionId); + } + + static getConnection(connectionId: string): Connection | undefined { + return ClientConnectionManager.getInstance().getConnection(connectionId); + } + + static getConnections(): Connection[] { + return ClientConnectionManager.getInstance().getConnections(); + } } diff --git a/packages/mcots/errors/ErrorNoKey.ts b/packages/mcots/errors/ErrorNoKey.ts index 7e89d13a1..9523233f1 100644 --- a/packages/mcots/errors/ErrorNoKey.ts +++ b/packages/mcots/errors/ErrorNoKey.ts @@ -1,5 +1,5 @@ export class ErrorNoKey extends Error { - constructor(msg?: string) { - super(msg || "No key provided"); - } + constructor(msg?: string) { + super(msg || "No key provided"); + } } diff --git a/packages/mcots/index.ts b/packages/mcots/index.ts index 72fc21311..547c5ac37 100644 --- a/packages/mcots/index.ts +++ b/packages/mcots/index.ts @@ -1,18 +1,18 @@ -export { ClientConnectionManager } from './ClientConnectionManager.js'; -export { ErrorNoKey } from './errors/ErrorNoKey.js'; +export { ClientConnectionManager } from "./ClientConnectionManager.js"; +export { ErrorNoKey } from "./errors/ErrorNoKey.js"; export { - getServerMessageProcessor, - populateServerMessageProcessors, -} from './messageProcessors/index.js'; -export type { ServerSocketCallback } from './messageProcessors/index.js'; + getServerMessageProcessor, + populateServerMessageProcessors, +} from "./messageProcessors/index.js"; +export type { ServerSocketCallback } from "./messageProcessors/index.js"; export { - ClientConnectionMessage, - ClientTrackingMessage, - LoginMessage, - LoginCompleteMessage, - SetOptionsMessage, - StackCarInfo, - StockCar, -} from './payloads/index.js'; + ClientConnectionMessage, + ClientTrackingMessage, + LoginMessage, + LoginCompleteMessage, + SetOptionsMessage, + StackCarInfo, + StockCar, +} from "./payloads/index.js"; // Path: packages/mcots/index.ts diff --git a/packages/mcots/messageProcessors/index.ts b/packages/mcots/messageProcessors/index.ts index 494ae24d9..9eec46af9 100644 --- a/packages/mcots/messageProcessors/index.ts +++ b/packages/mcots/messageProcessors/index.ts @@ -8,32 +8,32 @@ import { processStockCarInfo } from "./processStockCarInfo.js"; export type ServerSocketCallback = (messages: ServerMessage[]) => void; export type ServerMessageProcessor = ( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback, + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ) => Promise; const serverMessageProcessors = new Map([]); export function addServerMessageProcessor( - messageId: number, - processor: ServerMessageProcessor, + messageId: number, + processor: ServerMessageProcessor, ) { - serverMessageProcessors.set(messageId, processor); + serverMessageProcessors.set(messageId, processor); } export function populateServerMessageProcessors() { - addServerMessageProcessor(105, processServerLogin); - addServerMessageProcessor(109, processSetOptions); - addServerMessageProcessor(141, processStockCarInfo); - addServerMessageProcessor(440, processClientTracking); - addServerMessageProcessor(438, processClientConnect); -}; + addServerMessageProcessor(105, processServerLogin); + addServerMessageProcessor(109, processSetOptions); + addServerMessageProcessor(141, processStockCarInfo); + addServerMessageProcessor(440, processClientTracking); + addServerMessageProcessor(438, processClientConnect); +} export function getServerMessageProcessor(messageId: number) { - return serverMessageProcessors.get(messageId); + return serverMessageProcessors.get(messageId); } export function getServerMessageProcessors() { - return serverMessageProcessors; + return serverMessageProcessors; } diff --git a/packages/mcots/messageProcessors/processClientConnect.ts b/packages/mcots/messageProcessors/processClientConnect.ts index 8f33004ff..ad7c65600 100644 --- a/packages/mcots/messageProcessors/processClientConnect.ts +++ b/packages/mcots/messageProcessors/processClientConnect.ts @@ -1,86 +1,78 @@ -import { createDataEncryptionPair } from 'rusty-motors-connection'; -import type { ServerSocketCallback } from 'rusty-motors-mcots'; +import { createDataEncryptionPair } from "rusty-motors-connection"; +import type { ServerSocketCallback } from "rusty-motors-mcots"; import { - ClientConnectionManager, - ClientConnectionMessage, - ErrorNoKey, -} from 'rusty-motors-mcots'; -import { UserStatusManager } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; -import { ServerMessage } from 'rusty-motors-shared-packets'; -import { sendSuccess } from './sendSuccess.js'; + ClientConnectionManager, + ClientConnectionMessage, + ErrorNoKey, +} from "rusty-motors-mcots"; +import { UserStatusManager } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessage } from "rusty-motors-shared-packets"; +import { sendSuccess } from "./sendSuccess.js"; const log = getServerLogger(); export async function processClientConnect( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ): Promise { - log.setName('processClientConnect'); - try { - log.debug(`Processing client connect request: ${message.toString()}`); - - const request = new ClientConnectionMessage( - message.getDataBuffer().length - ).deserialize(message.getDataBuffer()); - - log.debug(`Received client connect request: ${request.toString()}`); - - const userStatus = UserStatusManager.getUserStatus( - request.getCustomerId() - ); - - if (!userStatus) { - log.error( - `User status not found for customer ID: ${request.getCustomerId()}` - ); - return; - } - - log.debug(`User status found: ${userStatus.toString()}`); - - // Get the connection record - const connection = ClientConnectionManager.getConnection(connectionId); - - if (!connection) { - log.error( - `Connection not found for connection ID: ${connectionId}` - ); - return; - } - - log.debug(`Connection found: ${connection.toString()}`); - - const sessionKey = userStatus.getSessionKey(); - - if (!sessionKey) { - log.error( - `Session key not found for customer ID: ${request.getCustomerId()}` - ); - return; - } - - const cipherPair = createDataEncryptionPair(sessionKey.getKey()); - - connection.setCipherPair(cipherPair); - - sendSuccess(message, socketCallback); - - log.resetName(); - return Promise.resolve(); - } catch (error) { - if (error instanceof ErrorNoKey) { - log.error( - `Error processing client connect request: ${error.message}` - ); - } else { - log.error( - `Error processing client connect request: ${error as string}` - ); - throw error; - } - } + log.setName("processClientConnect"); + try { + log.debug(`Processing client connect request: ${message.toString()}`); + + const request = new ClientConnectionMessage( + message.getDataBuffer().length, + ).deserialize(message.getDataBuffer()); + + log.debug(`Received client connect request: ${request.toString()}`); + + const userStatus = UserStatusManager.getUserStatus(request.getCustomerId()); + + if (!userStatus) { + log.error( + `User status not found for customer ID: ${request.getCustomerId()}`, + ); + return; + } + + log.debug(`User status found: ${userStatus.toString()}`); + + // Get the connection record + const connection = ClientConnectionManager.getConnection(connectionId); + + if (!connection) { + log.error(`Connection not found for connection ID: ${connectionId}`); + return; + } + + log.debug(`Connection found: ${connection.toString()}`); + + const sessionKey = userStatus.getSessionKey(); + + if (!sessionKey) { + log.error( + `Session key not found for customer ID: ${request.getCustomerId()}`, + ); + return; + } + + const cipherPair = createDataEncryptionPair(sessionKey.getKey()); + + connection.setCipherPair(cipherPair); + + sendSuccess(message, socketCallback); + + log.resetName(); + return Promise.resolve(); + } catch (error) { + if (error instanceof ErrorNoKey) { + log.error(`Error processing client connect request: ${error.message}`); + } else { + log.error(`Error processing client connect request: ${error as string}`); + throw error; + } + } } // Path: packages/mcots/messageProcessors/processClientConnect.ts diff --git a/packages/mcots/messageProcessors/processClientTracking.ts b/packages/mcots/messageProcessors/processClientTracking.ts index 94c748511..4d04fab46 100644 --- a/packages/mcots/messageProcessors/processClientTracking.ts +++ b/packages/mcots/messageProcessors/processClientTracking.ts @@ -1,27 +1,31 @@ -import type { ServerSocketCallback } from "./index.js"; -import type { ServerMessage } from "rusty-motors-shared-packets"; -import { getServerLogger } from "rusty-motors-shared"; import { ClientTrackingMessage } from "rusty-motors-mcots"; +import { getServerLogger } from "rusty-motors-shared"; +import type { ServerMessage } from "rusty-motors-shared-packets"; +import type { ServerSocketCallback } from "./index.js"; const log = getServerLogger(); export async function processClientTracking( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback, + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ) { - log.setName("processClientTracking"); + log.setName("processClientTracking"); - log.debug(`Processing client tracking message`); + log.debug(`Processing client tracking message`); - const trackingMessage = new ClientTrackingMessage(0).deserialize(message.serialize()); + const trackingMessage = new ClientTrackingMessage(0).deserialize( + message.serialize(), + ); - log.debug(`Type: ${trackingMessage.getType()}, Tracking Text: ${trackingMessage.getTrackingText()}`); + log.debug( + `Type: ${trackingMessage.getType()}, Tracking Text: ${trackingMessage.getTrackingText()}`, + ); - // Do something with the tracking data + // Do something with the tracking data - log.resetName(); - void socketCallback([]); + log.resetName(); + void socketCallback([]); - return Promise.resolve(); + return Promise.resolve(); } diff --git a/packages/mcots/messageProcessors/processServerLogin.ts b/packages/mcots/messageProcessors/processServerLogin.ts index a643726a3..3e069dcd9 100644 --- a/packages/mcots/messageProcessors/processServerLogin.ts +++ b/packages/mcots/messageProcessors/processServerLogin.ts @@ -1,35 +1,35 @@ -import { LoginCompleteMessage, LoginMessage } from 'rusty-motors-mcots'; -import { getServerLogger } from 'rusty-motors-shared'; -import { ServerMessage } from 'rusty-motors-shared-packets'; -import type { ServerSocketCallback } from './index.js'; +import { LoginCompleteMessage, LoginMessage } from "rusty-motors-mcots"; +import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessage } from "rusty-motors-shared-packets"; +import type { ServerSocketCallback } from "./index.js"; const log = getServerLogger(); export async function processServerLogin( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ): Promise { - log.setName('processServerLogin'); - // Read the inbound packet - const loginMessage = new LoginMessage(message.getDataBuffer().length); - loginMessage.deserialize(message.getDataBuffer()); - log.debug(`Received LoginMessage: ${loginMessage.toString()}`); + log.setName("processServerLogin"); + // Read the inbound packet + const loginMessage = new LoginMessage(message.getDataBuffer().length); + loginMessage.deserialize(message.getDataBuffer()); + log.debug(`Received LoginMessage: ${loginMessage.toString()}`); - // Create new response packet - const response = new LoginCompleteMessage(); - response.setMessageId(213); - response.setServerTime(Math.floor(Date.now() / 1000)); - response.setFirstTime(true); + // Create new response packet + const response = new LoginCompleteMessage(); + response.setMessageId(213); + response.setServerTime(Math.floor(Date.now() / 1000)); + response.setFirstTime(true); - log.debug(`Sending LoginCompleteMessage: ${response.toString()}`); + log.debug(`Sending LoginCompleteMessage: ${response.toString()}`); - // Send response packet - const responsePacket = new ServerMessage(response.getMessageId()); - responsePacket.setData(response); - responsePacket.populateHeader(message.getSequence()); + // Send response packet + const responsePacket = new ServerMessage(response.getMessageId()); + responsePacket.setData(response); + responsePacket.populateHeader(message.getSequence()); - socketCallback([responsePacket]); - log.resetName(); - return Promise.resolve(); + socketCallback([responsePacket]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/mcots/messageProcessors/processSetOptions.ts b/packages/mcots/messageProcessors/processSetOptions.ts index e3f37d0ef..fba0b855a 100644 --- a/packages/mcots/messageProcessors/processSetOptions.ts +++ b/packages/mcots/messageProcessors/processSetOptions.ts @@ -1,27 +1,27 @@ -import { SetOptionsMessage } from 'rusty-motors-mcots'; -import { getServerLogger } from 'rusty-motors-shared'; -import { ServerMessage } from 'rusty-motors-shared-packets'; -import type { ServerSocketCallback } from './index.js'; -import { sendSuccess } from './sendSuccess.js'; +import { SetOptionsMessage } from "rusty-motors-mcots"; +import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessage } from "rusty-motors-shared-packets"; +import type { ServerSocketCallback } from "./index.js"; +import { sendSuccess } from "./sendSuccess.js"; const log = getServerLogger(); export async function processSetOptions( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ) { - log.setName('processSetOptions'); - log.info(`Processing SetOptionsMessage`); - const setOptionsMessage = new SetOptionsMessage().deserialize( - message.getDataBuffer() - ); - log.info(`SetOptionsMessage: ${setOptionsMessage.toString()}`); + log.setName("processSetOptions"); + log.info(`Processing SetOptionsMessage`); + const setOptionsMessage = new SetOptionsMessage().deserialize( + message.getDataBuffer(), + ); + log.info(`SetOptionsMessage: ${setOptionsMessage.toString()}`); - // TODO: Implement the logic for processing the SetOptionsMessage + // TODO: Implement the logic for processing the SetOptionsMessage - sendSuccess(message, socketCallback); + sendSuccess(message, socketCallback); - log.resetName(); - return Promise.resolve(); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/mcots/messageProcessors/processStockCarInfo.ts b/packages/mcots/messageProcessors/processStockCarInfo.ts index 288f80774..3fc50c982 100644 --- a/packages/mcots/messageProcessors/processStockCarInfo.ts +++ b/packages/mcots/messageProcessors/processStockCarInfo.ts @@ -1,107 +1,103 @@ import { - getWarehouseInventory, - type WarehouseInventory, -} from 'rusty-motors-database'; -import { StackCarInfo, StockCar } from 'rusty-motors-mcots'; -import { getServerLogger } from 'rusty-motors-shared'; + type WarehouseInventory, + getWarehouseInventory, +} from "rusty-motors-database"; +import { StackCarInfo, StockCar } from "rusty-motors-mcots"; +import { getServerLogger } from "rusty-motors-shared"; import { - ServerGenericRequest, - ServerMessage, -} from 'rusty-motors-shared-packets'; -import type { ServerSocketCallback } from './index.js'; + ServerGenericRequest, + ServerMessage, +} from "rusty-motors-shared-packets"; +import type { ServerSocketCallback } from "./index.js"; const log = getServerLogger(); // 1300 544f4d43 01 00000000 8d00 [08000000 00000000] export async function processStockCarInfo( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, ): Promise { - log.setName('processStockCarInfo'); - try { - log.debug(`Processing stock car info message`); + log.setName("processStockCarInfo"); + try { + log.debug(`Processing stock car info message`); - const request = new ServerGenericRequest().deserialize( - message.data.serialize() - ); + const request = new ServerGenericRequest().deserialize( + message.data.serialize(), + ); - log.debug(`Received stock car info request: ${request.toString()}`); + log.debug(`Received stock car info request: ${request.toString()}`); - const lotOwnerId = request.getData().readUInt32LE(); - const brandId = request.getData2().readUInt32LE(); + const lotOwnerId = request.getData().readUInt32LE(); + const brandId = request.getData2().readUInt32LE(); - log.debug(`Lot owner ID: ${lotOwnerId} Brand ID: ${brandId}`); + log.debug(`Lot owner ID: ${lotOwnerId} Brand ID: ${brandId}`); - const inventoryCars: WarehouseInventory = await getWarehouseInventory( - lotOwnerId, - brandId - ); + const inventoryCars: WarehouseInventory = await getWarehouseInventory( + lotOwnerId, + brandId, + ); - log.debug( - `Sending car info for lot owner ${lotOwnerId} and brand ${brandId}` - ); + log.debug( + `Sending car info for lot owner ${lotOwnerId} and brand ${brandId}`, + ); - const responsePacket = new StackCarInfo(); + const responsePacket = new StackCarInfo(); - responsePacket.setMessageId(141); - responsePacket.setStarterCash(100); - responsePacket.setDealerId(lotOwnerId); - responsePacket.setBrandId(brandId); + responsePacket.setMessageId(141); + responsePacket.setStarterCash(100); + responsePacket.setDealerId(lotOwnerId); + responsePacket.setBrandId(brandId); - const response = new ServerMessage(141); + const response = new ServerMessage(141); - if ( - inventoryCars.inventory.length > StackCarInfo.MAX_CARS_PER_MESSAGE - ) { - log.error( - `Too many cars in inventory: ${inventoryCars.inventory.length}` - ); - return; - } + if (inventoryCars.inventory.length > StackCarInfo.MAX_CARS_PER_MESSAGE) { + log.error( + `Too many cars in inventory: ${inventoryCars.inventory.length}`, + ); + return; + } - log.debug(`Sending ${inventoryCars.inventory.length} cars`); + log.debug(`Sending ${inventoryCars.inventory.length} cars`); - while (inventoryCars.inventory.length > 0) { - const car = inventoryCars.inventory.shift(); + while (inventoryCars.inventory.length > 0) { + const car = inventoryCars.inventory.shift(); - if (typeof car === 'undefined') { - log.error(`Car not found`); - break; - } + if (typeof car === "undefined") { + log.error(`Car not found`); + break; + } - const stockCar = new StockCar(); + const stockCar = new StockCar(); - stockCar.setBrandedPartId(car.brandedPartId); - stockCar.setIsDealOfTheDay(car.isDealOfTheDay === 1); + stockCar.setBrandedPartId(car.brandedPartId); + stockCar.setIsDealOfTheDay(car.isDealOfTheDay === 1); - let carCost = car.retailPrice || 0; + let carCost = car.retailPrice || 0; - if (car.isDealOfTheDay === 1) { - const discount = carCost * inventoryCars.dealOfTheDayDiscount; - carCost -= discount; - } + if (car.isDealOfTheDay === 1) { + const discount = carCost * inventoryCars.dealOfTheDayDiscount; + carCost -= discount; + } - stockCar.setRetailPrice(carCost); + stockCar.setRetailPrice(carCost); - responsePacket.addCar(stockCar); - } + responsePacket.addCar(stockCar); + } - log.debug( - `Sending ${responsePacket.getNumberOfCars()} cars...complete` - ); + log.debug(`Sending ${responsePacket.getNumberOfCars()} cars...complete`); - responsePacket.setMoreCars(false); + responsePacket.setMoreCars(false); - response.setData(responsePacket); - response.populateHeader(message.header.getSequence()); - log.resetName(); - return socketCallback([response]); - } catch (error) { - log.error(`Error processing stock car info: ${error as string}`); - throw error; - } + response.setData(responsePacket); + response.populateHeader(message.header.getSequence()); + log.resetName(); + return socketCallback([response]); + } catch (error) { + log.error(`Error processing stock car info: ${error as string}`); + throw error; + } } // Path: packages/mcots/messageProcessors/processStockCarInfo.ts diff --git a/packages/mcots/messageProcessors/sendSuccess.ts b/packages/mcots/messageProcessors/sendSuccess.ts index 0614d6108..d0e7576b0 100644 --- a/packages/mcots/messageProcessors/sendSuccess.ts +++ b/packages/mcots/messageProcessors/sendSuccess.ts @@ -1,17 +1,20 @@ import { - ServerGenericResponse, - ServerMessage + ServerGenericResponse, + ServerMessage, } from "rusty-motors-shared-packets"; import type { ServerSocketCallback } from "./index.js"; -export function sendSuccess(message: ServerMessage, socketCallback: ServerSocketCallback) { - const pReply = new ServerGenericResponse(); - pReply.setMessageId(101); - pReply.setMsgReply(438); +export function sendSuccess( + message: ServerMessage, + socketCallback: ServerSocketCallback, +) { + const pReply = new ServerGenericResponse(); + pReply.setMessageId(101); + pReply.setMsgReply(438); - const response = new ServerMessage(101); - response.setData(pReply); - response.populateHeader(message.getSequence()); + const response = new ServerMessage(101); + response.setData(pReply); + response.populateHeader(message.getSequence()); - socketCallback([response]); + socketCallback([response]); } diff --git a/packages/mcots/package.json b/packages/mcots/package.json index 848ab63bf..a12c609ab 100644 --- a/packages/mcots/package.json +++ b/packages/mcots/package.json @@ -1,25 +1,25 @@ { - "name": "rusty-motors-mcots", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "short-unique-id": "^5.0.3" - }, - "description": "" + "name": "rusty-motors-mcots", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + }, + "description": "" } diff --git a/packages/mcots/payloads/ClientConnectMessage.ts b/packages/mcots/payloads/ClientConnectMessage.ts index ada18c329..7ce240c8f 100644 --- a/packages/mcots/payloads/ClientConnectMessage.ts +++ b/packages/mcots/payloads/ClientConnectMessage.ts @@ -1,72 +1,71 @@ -import { ServerMessagePayload } from "rusty-motors-shared-packets"; import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessagePayload } from "rusty-motors-shared-packets"; const log = getServerLogger(); export class ClientConnectionMessage extends ServerMessagePayload { - private _customerId: number = 0; // 4 bytes - private _personaId: number = 0; // 4 bytes - private _customerName: string = ""; // 13 bytes - private _personaName: string = ""; // 13 bytes - private _clientVersion: number = 0; // 4 bytes - - constructor(size: number) { - super(); + private _customerId: number = 0; // 4 bytes + private _personaId: number = 0; // 4 bytes + private _customerName: string = ""; // 13 bytes + private _personaName: string = ""; // 13 bytes + private _clientVersion: number = 0; // 4 bytes - this._data = Buffer.alloc(size); - } + constructor(size: number) { + super(); - override getByteSize(): number { - return 2 + 4 + 4 + 13 + 13 + 4; // 40 bytes - } + this._data = Buffer.alloc(size); + } - override deserialize(data: Buffer): ClientConnectionMessage { - try { - this._assertEnoughData(data, this.getByteSize()); + override getByteSize(): number { + return 2 + 4 + 4 + 13 + 13 + 4; // 40 bytes + } - this.messageId = data.readUInt16LE(0); + override deserialize(data: Buffer): ClientConnectionMessage { + try { + this._assertEnoughData(data, this.getByteSize()); - this._customerId = data.readUInt32LE(2); + this.messageId = data.readUInt16LE(0); - this._personaId = data.readUInt32LE(6); + this._customerId = data.readUInt32LE(2); - this._customerName = data.toString("utf8", 10, 23); + this._personaId = data.readUInt32LE(6); - this._personaName = data.toString("utf8", 23, 36); + this._customerName = data.toString("utf8", 10, 23); - this._clientVersion = data.readUInt32LE(36); + this._personaName = data.toString("utf8", 23, 36); - return this; - } catch (error) { - log.error( - `Error deserializing ClientTrackingMessage: ${error as string}`, - ); - throw error; - } - } + this._clientVersion = data.readUInt32LE(36); - getCustomerId() { - return this._customerId; - } + return this; + } catch (error) { + log.error( + `Error deserializing ClientTrackingMessage: ${error as string}`, + ); + throw error; + } + } - getPersonaId() { - return this._personaId; - } + getCustomerId() { + return this._customerId; + } - getCustomerName() { - return this._customerName; - } + getPersonaId() { + return this._personaId; + } - getPersonaName() { - return this._personaName; - } + getCustomerName() { + return this._customerName; + } - getClientVersion() { - return this._clientVersion; - } + getPersonaName() { + return this._personaName; + } - toString(): string { - return `ClientConnectionMessage {customerId: ${this._customerId}, personaId: ${this._personaId}, customerName: ${this._customerName}, personaName: ${this._personaName}, clientVersion: ${this._clientVersion}}`; - } + getClientVersion() { + return this._clientVersion; + } + toString(): string { + return `ClientConnectionMessage {customerId: ${this._customerId}, personaId: ${this._personaId}, customerName: ${this._customerName}, personaName: ${this._personaName}, clientVersion: ${this._clientVersion}}`; + } } diff --git a/packages/mcots/payloads/ClientTrackingMessage.ts b/packages/mcots/payloads/ClientTrackingMessage.ts index f07593dbc..1229ad71c 100644 --- a/packages/mcots/payloads/ClientTrackingMessage.ts +++ b/packages/mcots/payloads/ClientTrackingMessage.ts @@ -1,44 +1,44 @@ -import { ServerMessagePayload } from "rusty-motors-shared-packets"; import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessagePayload } from "rusty-motors-shared-packets"; const log = getServerLogger(); export class ClientTrackingMessage extends ServerMessagePayload { - private _type: number = 0; // 2 bytes - private _trackingText: string = ""; // 256 bytes + private _type: number = 0; // 2 bytes + private _trackingText: string = ""; // 256 bytes - constructor(size: number) { - super(); + constructor(size: number) { + super(); - this._data = Buffer.alloc(size); - } + this._data = Buffer.alloc(size); + } - override getByteSize(): number { - return 0; - } + override getByteSize(): number { + return 0; + } - override deserialize(data: Buffer): ClientTrackingMessage { - try { - this.messageId = data.readUInt16LE(0); + override deserialize(data: Buffer): ClientTrackingMessage { + try { + this.messageId = data.readUInt16LE(0); - this._type = data.readUInt16LE(2); + this._type = data.readUInt16LE(2); - this._trackingText = data.toString("utf8", 4, 260); + this._trackingText = data.toString("utf8", 4, 260); - return this; - } catch (error) { - log.error( - `Error deserializing ClientTrackingMessage: ${error as string}`, - ); - throw error; - } - } + return this; + } catch (error) { + log.error( + `Error deserializing ClientTrackingMessage: ${error as string}`, + ); + throw error; + } + } - getType() { - return this._type; - } + getType() { + return this._type; + } - getTrackingText() { - return this._trackingText; - } + getTrackingText() { + return this._trackingText; + } } diff --git a/packages/mcots/payloads/LoginCompleteMessage.ts b/packages/mcots/payloads/LoginCompleteMessage.ts index 53438b045..e41cb9e4b 100644 --- a/packages/mcots/payloads/LoginCompleteMessage.ts +++ b/packages/mcots/payloads/LoginCompleteMessage.ts @@ -1,231 +1,229 @@ -import { ServerMessagePayload } from "rusty-motors-shared-packets"; import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessagePayload } from "rusty-motors-shared-packets"; const log = getServerLogger(); export class LoginCompleteMessage extends ServerMessagePayload { - private _serverTime: number = 0; // 4 bytes - private _firstTime: boolean = false; // 1 byte - private _paycheckWaiting: boolean = false; // 1 byte - private _clubInvitesWaiting: boolean = false; // 1 byte - private tallyInProgress: boolean = false; // 1 byte - private _secondsUntilShutdown: number = 0; // 2 bytes + private _serverTime: number = 0; // 4 bytes + private _firstTime: boolean = false; // 1 byte + private _paycheckWaiting: boolean = false; // 1 byte + private _clubInvitesWaiting: boolean = false; // 1 byte + private tallyInProgress: boolean = false; // 1 byte + private _secondsUntilShutdown: number = 0; // 2 bytes - private _shardGNP: number = 0; // 4 bytes - private _shardCarsSold: number = 0; // 4 bytes - private _shardAverageSalaries: number = 0; // 4 bytes - private _shardAverageCarsOwned: number = 0; // 4 bytes - private _shardAverageLevel: number = 0; // 4 bytes + private _shardGNP: number = 0; // 4 bytes + private _shardCarsSold: number = 0; // 4 bytes + private _shardAverageSalaries: number = 0; // 4 bytes + private _shardAverageCarsOwned: number = 0; // 4 bytes + private _shardAverageLevel: number = 0; // 4 bytes - private _cookie: number = 0; // 4 bytes + private _cookie: number = 0; // 4 bytes - private _nextTallyDate: number = 0; // 4 bytes - private _nextPaycheckDate: number = 0; // 4 bytes + private _nextTallyDate: number = 0; // 4 bytes + private _nextPaycheckDate: number = 0; // 4 bytes - constructor() { - super(); + constructor() { + super(); - this._data = Buffer.alloc(this.getByteSize()); - } + this._data = Buffer.alloc(this.getByteSize()); + } - override getByteSize(): number { - return 2 + 4 + 1 + 1 + 1 + 1 + 1 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4; - } + override getByteSize(): number { + return 2 + 4 + 1 + 1 + 1 + 1 + 1 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4; + } - override deserialize(data: Buffer): LoginCompleteMessage { - try { - this._assertEnoughData(data, this.getByteSize()); + override deserialize(data: Buffer): LoginCompleteMessage { + try { + this._assertEnoughData(data, this.getByteSize()); - this.messageId = data.readUInt16LE(0); + this.messageId = data.readUInt16LE(0); - this._serverTime = data.readUInt32LE(2); + this._serverTime = data.readUInt32LE(2); - this._firstTime = data.readUInt8(6) === 1; + this._firstTime = data.readUInt8(6) === 1; - this._paycheckWaiting = data.readUInt8(7) === 1; + this._paycheckWaiting = data.readUInt8(7) === 1; - this._clubInvitesWaiting = data.readUInt8(8) === 1; + this._clubInvitesWaiting = data.readUInt8(8) === 1; - this.tallyInProgress = data.readUInt8(9) === 1; + this.tallyInProgress = data.readUInt8(9) === 1; - this._secondsUntilShutdown = data.readUInt16LE(10); + this._secondsUntilShutdown = data.readUInt16LE(10); - this._shardGNP = data.readUInt32LE(12); + this._shardGNP = data.readUInt32LE(12); - this._shardCarsSold = data.readUInt32LE(16); + this._shardCarsSold = data.readUInt32LE(16); - this._shardAverageSalaries = data.readUInt32LE(20); + this._shardAverageSalaries = data.readUInt32LE(20); - this._shardAverageCarsOwned = data.readUInt32LE(24); + this._shardAverageCarsOwned = data.readUInt32LE(24); - this._shardAverageLevel = data.readUInt32LE(28); + this._shardAverageLevel = data.readUInt32LE(28); - this._cookie = data.readUInt32LE(32); + this._cookie = data.readUInt32LE(32); - this._nextTallyDate = data.readUInt32LE(36); + this._nextTallyDate = data.readUInt32LE(36); - this._nextPaycheckDate = data.readUInt32LE(40); + this._nextPaycheckDate = data.readUInt32LE(40); - return this; - } catch (error) { - log.error( - `Error deserializing LoginCompleteMessage: ${error as string}`, - ); - throw error; - } - } + return this; + } catch (error) { + log.error(`Error deserializing LoginCompleteMessage: ${error as string}`); + throw error; + } + } - getServerTime() { - return this._serverTime; - } + getServerTime() { + return this._serverTime; + } - isFirstTime() { - return this._firstTime; - } + isFirstTime() { + return this._firstTime; + } - isPaycheckWaiting() { - return this._paycheckWaiting; - } + isPaycheckWaiting() { + return this._paycheckWaiting; + } - isClubInvitesWaiting() { - return this._clubInvitesWaiting; - } + isClubInvitesWaiting() { + return this._clubInvitesWaiting; + } - isTallyInProgress() { - return this.tallyInProgress; - } + isTallyInProgress() { + return this.tallyInProgress; + } - getSecondsUntilShutdown() { - return this._secondsUntilShutdown; - } + getSecondsUntilShutdown() { + return this._secondsUntilShutdown; + } - getShardGNP() { - return this._shardGNP; - } + getShardGNP() { + return this._shardGNP; + } - getShardCarsSold() { - return this._shardCarsSold; - } + getShardCarsSold() { + return this._shardCarsSold; + } - getShardAverageSalaries() { - return this._shardAverageSalaries; - } + getShardAverageSalaries() { + return this._shardAverageSalaries; + } - getShardAverageCarsOwned() { - return this._shardAverageCarsOwned; - } + getShardAverageCarsOwned() { + return this._shardAverageCarsOwned; + } - getShardAverageLevel() { - return this._shardAverageLevel; - } + getShardAverageLevel() { + return this._shardAverageLevel; + } - getCookie() { - return this._cookie; - } + getCookie() { + return this._cookie; + } - getNextTallyDate() { - return this._nextTallyDate; - } + getNextTallyDate() { + return this._nextTallyDate; + } - getNextPaycheckDate() { - return this._nextPaycheckDate; - } + getNextPaycheckDate() { + return this._nextPaycheckDate; + } - override serialize(): Buffer { - this._data.writeUInt16LE(this.messageId, 0); + override serialize(): Buffer { + this._data.writeUInt16LE(this.messageId, 0); - this._data.writeUInt32LE(this._serverTime, 2); + this._data.writeUInt32LE(this._serverTime, 2); - this._data.writeUInt8(this._firstTime ? 1 : 0, 6); + this._data.writeUInt8(this._firstTime ? 1 : 0, 6); - this._data.writeUInt8(this._paycheckWaiting ? 1 : 0, 7); + this._data.writeUInt8(this._paycheckWaiting ? 1 : 0, 7); - this._data.writeUInt8(this._clubInvitesWaiting ? 1 : 0, 8); + this._data.writeUInt8(this._clubInvitesWaiting ? 1 : 0, 8); - this._data.writeUInt8(this.tallyInProgress ? 1 : 0, 9); + this._data.writeUInt8(this.tallyInProgress ? 1 : 0, 9); - this._data.writeUInt16LE(this._secondsUntilShutdown, 10); + this._data.writeUInt16LE(this._secondsUntilShutdown, 10); - this._data.writeUInt32LE(this._shardGNP, 12); + this._data.writeUInt32LE(this._shardGNP, 12); - this._data.writeUInt32LE(this._shardCarsSold, 16); + this._data.writeUInt32LE(this._shardCarsSold, 16); - this._data.writeUInt32LE(this._shardAverageSalaries, 20); + this._data.writeUInt32LE(this._shardAverageSalaries, 20); - this._data.writeUInt32LE(this._shardAverageCarsOwned, 24); + this._data.writeUInt32LE(this._shardAverageCarsOwned, 24); - this._data.writeUInt32LE(this._shardAverageLevel, 28); + this._data.writeUInt32LE(this._shardAverageLevel, 28); - this._data.writeUInt32LE(this._cookie, 32); + this._data.writeUInt32LE(this._cookie, 32); - this._data.writeUInt32LE(this._nextTallyDate, 36); + this._data.writeUInt32LE(this._nextTallyDate, 36); - this._data.writeUInt32LE(this._nextPaycheckDate, 40); + this._data.writeUInt32LE(this._nextPaycheckDate, 40); - return this._data; - } + return this._data; + } - toString(): string { - return `LoginCompleteMessage {serverTime: ${this._serverTime}, firstTime: ${this._firstTime}, paycheckWaiting: ${this._paycheckWaiting}, clubInvitesWaiting: ${this._clubInvitesWaiting}, tallyInProgress: ${this.tallyInProgress}, secondsUntilShutdown: ${this._secondsUntilShutdown}, shardGNP: ${this._shardGNP}, shardCarsSold: ${this._shardCarsSold}, shardAverageSalaries: ${this._shardAverageSalaries}, shardAverageCarsOwned: ${this._shardAverageCarsOwned}, shardAverageLevel: ${this._shardAverageLevel}, cookie: ${this._cookie}, nextTallyDate: ${this._nextTallyDate}, nextPaycheckDate: ${this._nextPaycheckDate}}`; - } + toString(): string { + return `LoginCompleteMessage {serverTime: ${this._serverTime}, firstTime: ${this._firstTime}, paycheckWaiting: ${this._paycheckWaiting}, clubInvitesWaiting: ${this._clubInvitesWaiting}, tallyInProgress: ${this.tallyInProgress}, secondsUntilShutdown: ${this._secondsUntilShutdown}, shardGNP: ${this._shardGNP}, shardCarsSold: ${this._shardCarsSold}, shardAverageSalaries: ${this._shardAverageSalaries}, shardAverageCarsOwned: ${this._shardAverageCarsOwned}, shardAverageLevel: ${this._shardAverageLevel}, cookie: ${this._cookie}, nextTallyDate: ${this._nextTallyDate}, nextPaycheckDate: ${this._nextPaycheckDate}}`; + } - setServerTime(serverTime: number) { - this._serverTime = serverTime; - } + setServerTime(serverTime: number) { + this._serverTime = serverTime; + } - setFirstTime(firstTime: boolean) { - this._firstTime = firstTime; - } + setFirstTime(firstTime: boolean) { + this._firstTime = firstTime; + } - setPaycheckWaiting(paycheckWaiting: boolean) { - this._paycheckWaiting = paycheckWaiting; - } + setPaycheckWaiting(paycheckWaiting: boolean) { + this._paycheckWaiting = paycheckWaiting; + } - setClubInvitesWaiting(clubInvitesWaiting: boolean) { - this._clubInvitesWaiting = clubInvitesWaiting; - } + setClubInvitesWaiting(clubInvitesWaiting: boolean) { + this._clubInvitesWaiting = clubInvitesWaiting; + } - setTallyInProgress(tallyInProgress: boolean) { - this.tallyInProgress = tallyInProgress; - } + setTallyInProgress(tallyInProgress: boolean) { + this.tallyInProgress = tallyInProgress; + } - setSecondsUntilShutdown(secondsUntilShutdown: number) { - this._secondsUntilShutdown = secondsUntilShutdown; - } + setSecondsUntilShutdown(secondsUntilShutdown: number) { + this._secondsUntilShutdown = secondsUntilShutdown; + } - setShardGNP(shardGNP: number) { - this._shardGNP = shardGNP; - } + setShardGNP(shardGNP: number) { + this._shardGNP = shardGNP; + } - setShardCarsSold(shardCarsSold: number) { - this._shardCarsSold = shardCarsSold; - } + setShardCarsSold(shardCarsSold: number) { + this._shardCarsSold = shardCarsSold; + } - setShardAverageSalaries(shardAverageSalaries: number) { - this._shardAverageSalaries = shardAverageSalaries; - } + setShardAverageSalaries(shardAverageSalaries: number) { + this._shardAverageSalaries = shardAverageSalaries; + } - setShardAverageCarsOwned(shardAverageCarsOwned: number) { - this._shardAverageCarsOwned = shardAverageCarsOwned; - } + setShardAverageCarsOwned(shardAverageCarsOwned: number) { + this._shardAverageCarsOwned = shardAverageCarsOwned; + } - setShardAverageLevel(shardAverageLevel: number) { - this._shardAverageLevel = shardAverageLevel; - } + setShardAverageLevel(shardAverageLevel: number) { + this._shardAverageLevel = shardAverageLevel; + } - setCookie(cookie: number) { - this._cookie = cookie; - } + setCookie(cookie: number) { + this._cookie = cookie; + } - setNextTallyDate(nextTallyDate: number) { - this._nextTallyDate = nextTallyDate; - } + setNextTallyDate(nextTallyDate: number) { + this._nextTallyDate = nextTallyDate; + } - setNextPaycheckDate(nextPaycheckDate: number) { - this._nextPaycheckDate = nextPaycheckDate; - } + setNextPaycheckDate(nextPaycheckDate: number) { + this._nextPaycheckDate = nextPaycheckDate; + } - size(): number { - return this.getByteSize(); - } -}; + size(): number { + return this.getByteSize(); + } +} diff --git a/packages/mcots/payloads/LoginMessage.ts b/packages/mcots/payloads/LoginMessage.ts index c46a5ff80..0ceeaa4d2 100644 --- a/packages/mcots/payloads/LoginMessage.ts +++ b/packages/mcots/payloads/LoginMessage.ts @@ -1,86 +1,83 @@ -import { ServerMessagePayload } from "rusty-motors-shared-packets" -import { getServerLogger } from "rusty-motors-shared" +import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessagePayload } from "rusty-motors-shared-packets"; const log = getServerLogger(); export class LoginMessage extends ServerMessagePayload { - private _customerId: number = 0; // 4 bytes - private _personaId: number = 0; // 4 bytes - private _lotOwnerId: number = 0; // 4 bytes - private _brandedPartId: number = 0; // 4 bytes - private _skinId: number = 0; // 4 bytes - private _personaName: string = ""; // 13 bytes - private _mcVersion: string = ""; // 4 bytes + private _customerId: number = 0; // 4 bytes + private _personaId: number = 0; // 4 bytes + private _lotOwnerId: number = 0; // 4 bytes + private _brandedPartId: number = 0; // 4 bytes + private _skinId: number = 0; // 4 bytes + private _personaName: string = ""; // 13 bytes + private _mcVersion: string = ""; // 4 bytes - constructor(size: number) { - super(); + constructor(size: number) { + super(); - this._data = Buffer.alloc(size); - } + this._data = Buffer.alloc(size); + } - override getByteSize(): number { - return 2 + 4 + 4 + 4 + 4 + 4 + 13 + 4; - } + override getByteSize(): number { + return 2 + 4 + 4 + 4 + 4 + 4 + 13 + 4; + } - override deserialize(data: Buffer): LoginMessage { - try { - this._assertEnoughData(data, this.getByteSize()); + override deserialize(data: Buffer): LoginMessage { + try { + this._assertEnoughData(data, this.getByteSize()); - this.messageId = data.readUInt16LE(0); + this.messageId = data.readUInt16LE(0); - this._customerId = data.readUInt32LE(2); + this._customerId = data.readUInt32LE(2); - this._personaId = data.readUInt32LE(6); + this._personaId = data.readUInt32LE(6); - this._lotOwnerId = data.readUInt32LE(10); + this._lotOwnerId = data.readUInt32LE(10); - this._brandedPartId = data.readUInt32LE(14); + this._brandedPartId = data.readUInt32LE(14); - this._skinId = data.readUInt32LE(18); + this._skinId = data.readUInt32LE(18); - this._personaName = data.toString("utf8", 22, 35); + this._personaName = data.toString("utf8", 22, 35); - this._mcVersion = data.toString("utf8", 35, 39); + this._mcVersion = data.toString("utf8", 35, 39); - return this; - } catch (error) { - log.error( - `Error deserializing LoginMessage: ${error as string}`, - ); - throw error; - } - } + return this; + } catch (error) { + log.error(`Error deserializing LoginMessage: ${error as string}`); + throw error; + } + } - getCustomerId() { - return this._customerId; - } + getCustomerId() { + return this._customerId; + } - getPersonaId() { - return this._personaId; - } + getPersonaId() { + return this._personaId; + } - getLotOwnerId() { - return this._lotOwnerId; - } + getLotOwnerId() { + return this._lotOwnerId; + } + getBrandedPartId() { + return this._brandedPartId; + } - getBrandedPartId() { - return this._brandedPartId; - } + getSkinId() { + return this._skinId; + } - getSkinId() { - return this._skinId; - } + getPersonaName() { + return this._personaName; + } - getPersonaName() { - return this._personaName; - } + getClientVersion() { + return this._mcVersion; + } - getClientVersion() { - return this._mcVersion; - } - - override toString(): string { - return `LoginMessage: ${this.getPersonaName()}, customerId: ${this.getCustomerId()}, personaId: ${this.getPersonaId()}, lotOwnerId: ${this.getLotOwnerId()}, brandedPartId: ${this.getBrandedPartId()}, skinId: ${this.getSkinId()}, mcVersion: ${this.getClientVersion()}`; - } -}; + override toString(): string { + return `LoginMessage: ${this.getPersonaName()}, customerId: ${this.getCustomerId()}, personaId: ${this.getPersonaId()}, lotOwnerId: ${this.getLotOwnerId()}, brandedPartId: ${this.getBrandedPartId()}, skinId: ${this.getSkinId()}, mcVersion: ${this.getClientVersion()}`; + } +} diff --git a/packages/mcots/payloads/SetOptionsMessage.ts b/packages/mcots/payloads/SetOptionsMessage.ts index 3275f80fa..9e21c4d89 100644 --- a/packages/mcots/payloads/SetOptionsMessage.ts +++ b/packages/mcots/payloads/SetOptionsMessage.ts @@ -1,78 +1,74 @@ -import { ServerMessagePayload } from "rusty-motors-shared-packets"; import { getServerLogger } from "rusty-motors-shared"; +import { ServerMessagePayload } from "rusty-motors-shared-packets"; const log = getServerLogger(); export class SetOptionsMessage extends ServerMessagePayload { - private _lpCode: number = 0; // 2 bytes - private _lpText: string = ""; // 8 bytes - private _carInfoSettings: number = 0; // 4 bytes - private _carNumbers = { - carNumber1: "", // 3 bytes - carNumber2: "", // 3 bytes - carNumber3: "", // 3 bytes - carNumber4: "", // 3 bytes - carNumber5: "", // 3 bytes - carNumber6: "", // 3 bytes - }; - - constructor() { - super(); - - this._data = Buffer.alloc(this.getByteSize()); - } - - override getByteSize(): number { - return 2 + 8 + 4 + 3 * 6; - } - - override deserialize(data: Buffer): SetOptionsMessage { - try { - this._assertEnoughData(data, this.getByteSize()); - - this.messageId = data.readUInt16LE(0); - - this._lpCode = data.readUInt16LE(2); - - this._lpText = data.toString("utf8", 4, 12); - - this._carInfoSettings = data.readUInt32LE(12); - - this._carNumbers.carNumber1 = data.toString("utf8", 16, 19); - this._carNumbers.carNumber2 = data.toString("utf8", 19, 22); - this._carNumbers.carNumber3 = data.toString("utf8", 22, 25); - this._carNumbers.carNumber4 = data.toString("utf8", 25, 28); - this._carNumbers.carNumber5 = data.toString("utf8", 28, 31); - this._carNumbers.carNumber6 = data.toString("utf8", 31, 34); - - return this; - } catch (error) { - log.error( - `Error deserializing SetOptionsMessage: ${error as string}`, - ); - throw error; - } - } - - getLpCode() { - return this._lpCode; - } - - getLpText() { - return this._lpText; - } - - getCarInfoSettings() { - return this._carInfoSettings; - } - - getCarNumbers() { - return this._carNumbers; - } - - toString() { - return `SetOptionsMessage: lpCode=${this._lpCode}, lpText=${this._lpText}, carInfoSettings=${this._carInfoSettings}, carNumbers=${JSON.stringify(this._carNumbers)}`; - } - - + private _lpCode: number = 0; // 2 bytes + private _lpText: string = ""; // 8 bytes + private _carInfoSettings: number = 0; // 4 bytes + private _carNumbers = { + carNumber1: "", // 3 bytes + carNumber2: "", // 3 bytes + carNumber3: "", // 3 bytes + carNumber4: "", // 3 bytes + carNumber5: "", // 3 bytes + carNumber6: "", // 3 bytes + }; + + constructor() { + super(); + + this._data = Buffer.alloc(this.getByteSize()); + } + + override getByteSize(): number { + return 2 + 8 + 4 + 3 * 6; + } + + override deserialize(data: Buffer): SetOptionsMessage { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + + this._lpCode = data.readUInt16LE(2); + + this._lpText = data.toString("utf8", 4, 12); + + this._carInfoSettings = data.readUInt32LE(12); + + this._carNumbers.carNumber1 = data.toString("utf8", 16, 19); + this._carNumbers.carNumber2 = data.toString("utf8", 19, 22); + this._carNumbers.carNumber3 = data.toString("utf8", 22, 25); + this._carNumbers.carNumber4 = data.toString("utf8", 25, 28); + this._carNumbers.carNumber5 = data.toString("utf8", 28, 31); + this._carNumbers.carNumber6 = data.toString("utf8", 31, 34); + + return this; + } catch (error) { + log.error(`Error deserializing SetOptionsMessage: ${error as string}`); + throw error; + } + } + + getLpCode() { + return this._lpCode; + } + + getLpText() { + return this._lpText; + } + + getCarInfoSettings() { + return this._carInfoSettings; + } + + getCarNumbers() { + return this._carNumbers; + } + + toString() { + return `SetOptionsMessage: lpCode=${this._lpCode}, lpText=${this._lpText}, carInfoSettings=${this._carInfoSettings}, carNumbers=${JSON.stringify(this._carNumbers)}`; + } } diff --git a/packages/mcots/payloads/StockCar.ts b/packages/mcots/payloads/StockCar.ts index 85af3f1d2..1701b0644 100644 --- a/packages/mcots/payloads/StockCar.ts +++ b/packages/mcots/payloads/StockCar.ts @@ -1,122 +1,122 @@ +import { getServerLogger } from "rusty-motors-shared"; import { - Serializable, - ServerMessagePayload, + Serializable, + ServerMessagePayload, } from "rusty-motors-shared-packets"; -import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export class StockCar extends Serializable { - private brandedPartId: number = 0; // 4 bytes - private retailPrice: number = 0; // 4 bytes - private isDealOfTheDay: number = 0; // 2 bytes - - override getByteSize(): number { - return 10; - } - - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt32LE(this.brandedPartId, 0); - buffer.writeUInt32LE(this.retailPrice, 4); - buffer.writeUInt16LE(this.isDealOfTheDay, 8); - - return buffer; - } catch (error) { - log.error(`Error serializing StockCar: ${error as string}`); - throw error; - } - } - - setBrandedPartId(brandedPartId: number) { - this.brandedPartId = brandedPartId; - } - - setRetailPrice(retailPrice: number) { - this.retailPrice = retailPrice; - } - - setIsDealOfTheDay(isDealOfTheDay: boolean) { - this.isDealOfTheDay = isDealOfTheDay ? 1 : 0; - } - - toString(): string { - return `StockCar: ${this.brandedPartId}, ${this.retailPrice}, ${this.isDealOfTheDay}`; - } + private brandedPartId: number = 0; // 4 bytes + private retailPrice: number = 0; // 4 bytes + private isDealOfTheDay: number = 0; // 2 bytes + + override getByteSize(): number { + return 10; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt32LE(this.brandedPartId, 0); + buffer.writeUInt32LE(this.retailPrice, 4); + buffer.writeUInt16LE(this.isDealOfTheDay, 8); + + return buffer; + } catch (error) { + log.error(`Error serializing StockCar: ${error as string}`); + throw error; + } + } + + setBrandedPartId(brandedPartId: number) { + this.brandedPartId = brandedPartId; + } + + setRetailPrice(retailPrice: number) { + this.retailPrice = retailPrice; + } + + setIsDealOfTheDay(isDealOfTheDay: boolean) { + this.isDealOfTheDay = isDealOfTheDay ? 1 : 0; + } + + toString(): string { + return `StockCar: ${this.brandedPartId}, ${this.retailPrice}, ${this.isDealOfTheDay}`; + } } export class StackCarInfo extends ServerMessagePayload { - static MAX_CARS_PER_MESSAGE = 100; - private _cars: StockCar[] = []; - // msgNo: 2 bytes - private _starterCash: number = 0; // 4 bytes - private _dealerId: number = 0; // 4 bytes - private _brandId: number = 0; // 4 bytes - private _numberOfCars: number = 0; // 2 bytes - private _moreCars: number = 0; // 2 bytes - - override getByteSize(): number { - return ( - 2 + - 4 + - 4 + - 4 + - 2 + - 1 + - this._cars.length * StockCar.prototype.getByteSize() - ); - } - - setStarterCash(starterCash: number) { - this._starterCash = starterCash; - } - - setDealerId(dealerId: number) { - this._dealerId = dealerId; - } - - setBrandId(brandId: number) { - this._brandId = brandId; - } - - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.getMessageId(), 0); - buffer.writeUInt32LE(this._starterCash, 2); - buffer.writeUInt32LE(this._dealerId, 6); - buffer.writeUInt32LE(this._brandId, 10); - buffer.writeUInt16LE(this.getNumberOfCars(), 14); - buffer.writeInt8(this._moreCars, 16); - - let offset = 17; - for (const car of this._cars) { - car.serialize().copy(buffer, offset); - offset += car.getByteSize(); - } - - return buffer; - } catch (error) { - log.error(`Error serializing StackCarInfo: ${error as string}`); - throw error; - } - } - - addCar(car: StockCar) { - this._cars.push(car); - this._numberOfCars = this._cars.length; - } - - getNumberOfCars(): number { - return this._numberOfCars; - } - - setMoreCars(moreCars: boolean) { - this._moreCars = moreCars ? 1 : 0; - } - - toString(): string { - return `StackCarInfo: ${this._cars.length} cars, ${this._starterCash} starter cash, ${this._dealerId} dealerId, ${this._brandId} brandId`; - } + static MAX_CARS_PER_MESSAGE = 100; + private _cars: StockCar[] = []; + // msgNo: 2 bytes + private _starterCash: number = 0; // 4 bytes + private _dealerId: number = 0; // 4 bytes + private _brandId: number = 0; // 4 bytes + private _numberOfCars: number = 0; // 2 bytes + private _moreCars: number = 0; // 2 bytes + + override getByteSize(): number { + return ( + 2 + + 4 + + 4 + + 4 + + 2 + + 1 + + this._cars.length * StockCar.prototype.getByteSize() + ); + } + + setStarterCash(starterCash: number) { + this._starterCash = starterCash; + } + + setDealerId(dealerId: number) { + this._dealerId = dealerId; + } + + setBrandId(brandId: number) { + this._brandId = brandId; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.getMessageId(), 0); + buffer.writeUInt32LE(this._starterCash, 2); + buffer.writeUInt32LE(this._dealerId, 6); + buffer.writeUInt32LE(this._brandId, 10); + buffer.writeUInt16LE(this.getNumberOfCars(), 14); + buffer.writeInt8(this._moreCars, 16); + + let offset = 17; + for (const car of this._cars) { + car.serialize().copy(buffer, offset); + offset += car.getByteSize(); + } + + return buffer; + } catch (error) { + log.error(`Error serializing StackCarInfo: ${error as string}`); + throw error; + } + } + + addCar(car: StockCar) { + this._cars.push(car); + this._numberOfCars = this._cars.length; + } + + getNumberOfCars(): number { + return this._numberOfCars; + } + + setMoreCars(moreCars: boolean) { + this._moreCars = moreCars ? 1 : 0; + } + + toString(): string { + return `StackCarInfo: ${this._cars.length} cars, ${this._starterCash} starter cash, ${this._dealerId} dealerId, ${this._brandId} brandId`; + } } diff --git a/packages/mcots/payloads/index.ts b/packages/mcots/payloads/index.ts index e49a30f67..2e313375f 100644 --- a/packages/mcots/payloads/index.ts +++ b/packages/mcots/payloads/index.ts @@ -1,8 +1,8 @@ -export { ClientConnectionMessage } from './ClientConnectMessage.js'; -export { ClientTrackingMessage } from './ClientTrackingMessage.js'; -export { LoginMessage } from './LoginMessage.js'; -export { LoginCompleteMessage } from './LoginCompleteMessage.js'; -export { SetOptionsMessage } from './SetOptionsMessage.js'; -export { StackCarInfo, StockCar } from './StockCar.js'; +export { ClientConnectionMessage } from "./ClientConnectMessage.js"; +export { ClientTrackingMessage } from "./ClientTrackingMessage.js"; +export { LoginMessage } from "./LoginMessage.js"; +export { LoginCompleteMessage } from "./LoginCompleteMessage.js"; +export { SetOptionsMessage } from "./SetOptionsMessage.js"; +export { StackCarInfo, StockCar } from "./StockCar.js"; // Path: packages/mcots/payloads/index.ts diff --git a/packages/mcots/test/index.test.ts b/packages/mcots/test/index.test.ts index f01d2f75d..1b1ba700e 100644 --- a/packages/mcots/test/index.test.ts +++ b/packages/mcots/test/index.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; describe("example", () => { - it("should pass", () => { - expect(true).toBe(true); - }); + it("should pass", () => { + expect(true).toBe(true); + }); }); diff --git a/packages/mcots/vite.config.ts b/packages/mcots/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/mcots/vite.config.ts +++ b/packages/mcots/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts index caf5b719c..e77cda129 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts @@ -1,40 +1,40 @@ import { - GameMessage, - MiniRiffInfo, - MiniRiffList, - getAsHex, -} from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; + GameMessage, + MiniRiffInfo, + MiniRiffList, + getAsHex, +} from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); // Command id: 0x30c export async function getLobMiniRiffList( - commandId: number, - data: Buffer + commandId: number, + data: Buffer, ): Promise { - log.setName('nps:getLobMiniRiffList'); - log.info(`Processing getLobMiniRiffList command: ${getAsHex(data)}`); + log.setName("nps:getLobMiniRiffList"); + log.info(`Processing getLobMiniRiffList command: ${getAsHex(data)}`); - const riffList = new MiniRiffList(); + const riffList = new MiniRiffList(); - riffList.addRiff(new MiniRiffInfo('CTRL', 0, 1)); - riffList.addRiff(new MiniRiffInfo('MC141', 141, 0)); - riffList.addRiff(new MiniRiffInfo('MCCHAT', 191, 0)); + riffList.addRiff(new MiniRiffInfo("CTRL", 0, 1)); + riffList.addRiff(new MiniRiffInfo("MC141", 141, 0)); + riffList.addRiff(new MiniRiffInfo("MCCHAT", 191, 0)); - log.info(`getLobMiniRiffList: ${riffList.toString()}`); + log.info(`getLobMiniRiffList: ${riffList.toString()}`); - const responseMessage = new GameMessage(0); - responseMessage.header.setId(0x404); - responseMessage.setData(riffList); + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x404); + responseMessage.setData(riffList); - log.info('Dumping responseMessage: '); + log.info("Dumping responseMessage: "); - log.info( - `responseMessage: ${ - responseMessage.serialize().length - } bytes - ${getAsHex(responseMessage.serialize())}` - ); + log.info( + `responseMessage: ${ + responseMessage.serialize().length + } bytes - ${getAsHex(responseMessage.serialize())}`, + ); - return responseMessage.serialize(); + return responseMessage.serialize(); } diff --git a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts index ad09e529d..d1962707f 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts @@ -1,28 +1,28 @@ import { - GameMessage, - MiniUserInfo, - MiniUserList, - getAsHex, -} from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; + GameMessage, + MiniUserInfo, + MiniUserList, + getAsHex, +} from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); // Command id: 0x128 export async function getLobMiniUserList( - commandId: number, - data: Buffer + commandId: number, + data: Buffer, ): Promise { - log.setName('nps:getLobMiniUserList'); - log.info(`Processing getLobMiniUserList command: ${getAsHex(data)}`); + log.setName("nps:getLobMiniUserList"); + log.info(`Processing getLobMiniUserList command: ${getAsHex(data)}`); - const miniUserList = new MiniUserList(0); + const miniUserList = new MiniUserList(0); - miniUserList.addChannelUser(new MiniUserInfo(1000, 'Molly')); + miniUserList.addChannelUser(new MiniUserInfo(1000, "Molly")); - const responseMessage = new GameMessage(0); - responseMessage.header.setId(0x229); - responseMessage.setData(miniUserList); + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x229); + responseMessage.setData(miniUserList); - return Promise.resolve(responseMessage.serialize()); + return Promise.resolve(responseMessage.serialize()); } diff --git a/packages/nps/gameMessageProcessors/index.ts b/packages/nps/gameMessageProcessors/index.ts index 26f0a350b..10255b4cb 100644 --- a/packages/nps/gameMessageProcessors/index.ts +++ b/packages/nps/gameMessageProcessors/index.ts @@ -1,88 +1,88 @@ -import { processGameLogin } from "./processGameLogin.js"; -import { processGetProfileMaps } from "./processGetProfileMaps.js"; -import { processCheckProfileName } from "./processCheckProfileName.js"; +import { GameMessage } from "../messageStructs/GameMessage.js"; +import type { UserStatus } from "../messageStructs/UserStatus.js"; import { processCheckPlateText } from "./processCheckPlateText.js"; +import { processCheckProfileName } from "./processCheckProfileName.js"; import { processCreateProfile } from "./processCreateProfile.js"; import { processDeleteProfile } from "./processDeleteProfile.js"; +import { processEncryptedGameCommand } from "./processEncryptedGameCommand.js"; +import { processGameLogin } from "./processGameLogin.js"; +import { processGameLogout } from "./processGameLogout.js"; +import { processFirstBuddy } from "./processGetFirstBuddy.js"; import { processGetProfileInfo } from "./processGetProfileInfo.js"; +import { processGetProfileMaps } from "./processGetProfileMaps.js"; +import { processPing } from "./processPing.js"; import { processSelectPersona } from "./processSelectPersona.js"; import { processUserLogin } from "./processUserLogin.js"; -import { processFirstBuddy } from "./processGetFirstBuddy.js"; -import { processEncryptedGameCommand } from "./processEncryptedGameCommand.js"; -import { GameMessage } from "../messageStructs/GameMessage.js"; -import { processPing } from "./processPing.js"; -import type { UserStatus } from "../messageStructs/UserStatus.js"; -import { processGameLogout } from "./processGameLogout.js"; export type GameSocketCallback = (messages: Buffer[]) => void; export type MessageProcessor = ( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ) => Promise; export class MessageProcessorError extends Error { - constructor(id: number, message: string) { - super(`MessageProcessorError: ${id}: ${message}`); - } + constructor(id: number, message: string) { + super(`MessageProcessorError: ${id}: ${message}`); + } } export const gameMessageProcessors = new Map([]); export function populateGameMessageProcessors( - processors: Map, + processors: Map, ): void { - processors.set(256, processUserLogin); // 0x100 - processors.set(535, processPing); // 0x217 - processors.set(1281, processGameLogin); // 0x501 - processors.set(1283, processSelectPersona); // 0x503 - processors.set(1287, processCreateProfile); // 0x507 - processors.set(1291, processFirstBuddy); // 0x50b - processors.set(1295, processGameLogout); // 0x50f - processors.set(1298, processDeleteProfile); // 0x512 - processors.set(1305, processGetProfileInfo); // 0x519 - processors.set(1330, processGetProfileMaps); // 0x532 - processors.set(1331, processCheckProfileName); // 0x533 - processors.set(1332, processCheckPlateText); // 0x534 - processors.set(4353, processEncryptedGameCommand); // 0x1101 + processors.set(256, processUserLogin); // 0x100 + processors.set(535, processPing); // 0x217 + processors.set(1281, processGameLogin); // 0x501 + processors.set(1283, processSelectPersona); // 0x503 + processors.set(1287, processCreateProfile); // 0x507 + processors.set(1291, processFirstBuddy); // 0x50b + processors.set(1295, processGameLogout); // 0x50f + processors.set(1298, processDeleteProfile); // 0x512 + processors.set(1305, processGetProfileInfo); // 0x519 + processors.set(1330, processGetProfileMaps); // 0x532 + processors.set(1331, processCheckProfileName); // 0x533 + processors.set(1332, processCheckPlateText); // 0x534 + processors.set(4353, processEncryptedGameCommand); // 0x1101 } export function getGameMessageProcessor(messageId: number) { - if (gameMessageProcessors.has(messageId) === true) { - return gameMessageProcessors.get(messageId) as MessageProcessor; - } + if (gameMessageProcessors.has(messageId) === true) { + return gameMessageProcessors.get(messageId) as MessageProcessor; + } - return undefined; + return undefined; } export class PortMapError extends Error { - port: number; - constructor(port: number, message: string) { - super(message); - this.name = "PortMapError"; - this.port = port; - } + port: number; + constructor(port: number, message: string) { + super(message); + this.name = "PortMapError"; + this.port = port; + } - override toString(): string { - return `${this.name}: ${this.message}`; - } + override toString(): string { + return `${this.name}: ${this.message}`; + } } export const portToMessageTypes = new Map([]); export function populatePortToMessageTypes(portMap: Map): void { - portMap.set(7003, "Game"); - portMap.set(8226, "Game"); - portMap.set(8228, "Game"); - portMap.set(43300, "Server"); + portMap.set(7003, "Game"); + portMap.set(8226, "Game"); + portMap.set(8228, "Game"); + portMap.set(43300, "Server"); } export function getPortMessageType(port: number): string { - if (portToMessageTypes.has(port) === true) { - // @ts-expect-error - Since has() is true, the return value is NOT undefined - return portToMessageTypes.get(port); - } - throw new PortMapError(port, "No message type found"); + if (portToMessageTypes.has(port) === true) { + // @ts-expect-error - Since has() is true, the return value is NOT undefined + return portToMessageTypes.get(port); + } + throw new PortMapError(port, "No message type found"); } diff --git a/packages/nps/gameMessageProcessors/lobbyCommands.ts b/packages/nps/gameMessageProcessors/lobbyCommands.ts index 821c0a28e..8cbffa986 100644 --- a/packages/nps/gameMessageProcessors/lobbyCommands.ts +++ b/packages/nps/gameMessageProcessors/lobbyCommands.ts @@ -6,8 +6,8 @@ import { getLobMiniUserList } from "./getLobMiniUserList.js"; // 0128000800000000 export type lobbyCommandProcessor = ( - commandId: number, - data: Buffer, + commandId: number, + data: Buffer, ) => Promise; export const lobbyCommandMap = new Map(); diff --git a/packages/nps/gameMessageProcessors/processCheckPlateText.ts b/packages/nps/gameMessageProcessors/processCheckPlateText.ts index b58167697..74a723387 100644 --- a/packages/nps/gameMessageProcessors/processCheckPlateText.ts +++ b/packages/nps/gameMessageProcessors/processCheckPlateText.ts @@ -1,33 +1,29 @@ -import { GameMessage } from "../messageStructs/GameMessage.js"; -import type { GameSocketCallback } from "./index.js"; -import { getLenString } from "../src/utils/pureGet.js"; import { getServerLogger } from "rusty-motors-shared"; +import { GameMessage } from "../messageStructs/GameMessage.js"; import type { UserStatus } from "../messageStructs/UserStatus.js"; +import { getLenString } from "../src/utils/pureGet.js"; import { sendNPSAck } from "../src/utils/sendNPSAck.js"; +import type { GameSocketCallback } from "./index.js"; const log = getServerLogger(); export async function processCheckPlateText( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processCheckPlateText"); + log.setName("nps:processCheckPlateText"); - const plateType = message.getDataAsBuffer().readUInt32BE(0); + const plateType = message.getDataAsBuffer().readUInt32BE(0); - const requestedPlateText = getLenString( - message.getDataAsBuffer(), - 4, - false, - ); + const requestedPlateText = getLenString(message.getDataAsBuffer(), 4, false); - log.info( - `Requested plate text: ${requestedPlateText} for plate type ${plateType}`, - ); + log.info( + `Requested plate text: ${requestedPlateText} for plate type ${plateType}`, + ); - sendNPSAck(socketCallback); - log.resetName(); - return Promise.resolve(); + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processCheckProfileName.ts b/packages/nps/gameMessageProcessors/processCheckProfileName.ts index 67bf2f4a7..116d78d37 100644 --- a/packages/nps/gameMessageProcessors/processCheckProfileName.ts +++ b/packages/nps/gameMessageProcessors/processCheckProfileName.ts @@ -1,6 +1,6 @@ import { GameMessage } from "../messageStructs/GameMessage.js"; +import { getLenString } from "../src/utils/pureGet.js"; import type { GameSocketCallback } from "./index.js"; -import { getLenString } from "../src/utils/pureGet.js"; import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; @@ -8,26 +8,26 @@ import type { UserStatus } from "../messageStructs/UserStatus.js"; const log = getServerLogger(); export async function processCheckProfileName( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processCheckProfileName"); - const customerId = message.serialize().readUInt32BE(8); + log.setName("nps:processCheckProfileName"); + const customerId = message.serialize().readUInt32BE(8); - const requestedPersonaName = getLenString(message.serialize(), 12, false); + const requestedPersonaName = getLenString(message.serialize(), 12, false); - log.info( - `Requested persona name: ${requestedPersonaName} for customer ${customerId}`, - ); + log.info( + `Requested persona name: ${requestedPersonaName} for customer ${customerId}`, + ); - const response = new GameMessage(0); - response.header.setId(0x601); + const response = new GameMessage(0); + response.header.setId(0x601); - const responseBytes = response.serialize(); + const responseBytes = response.serialize(); - socketCallback([responseBytes]); - log.resetName(); - return Promise.resolve(); + socketCallback([responseBytes]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processCreateProfile.ts b/packages/nps/gameMessageProcessors/processCreateProfile.ts index fe359a311..5e57cd18e 100644 --- a/packages/nps/gameMessageProcessors/processCreateProfile.ts +++ b/packages/nps/gameMessageProcessors/processCreateProfile.ts @@ -1,45 +1,40 @@ +import { getServerLogger } from "rusty-motors-shared"; import { GameMessage } from "../messageStructs/GameMessage.js"; -import type { GameSocketCallback } from "./index.js"; import { GameProfile } from "../messageStructs/GameProfile.js"; -import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; import { addGameProfile } from "../services/profile.js"; +import type { GameSocketCallback } from "./index.js"; const log = getServerLogger(); export async function processCreateProfile( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processCreateProfile"); - // Log the request - log.info(`ProcessCreateProfile request: ${message.toString()}`); - - const createProfileMessage = GameProfile.fromBytes( - message.getDataAsBuffer(), - ); + log.setName("nps:processCreateProfile"); + // Log the request + log.info(`ProcessCreateProfile request: ${message.toString()}`); - // Log the request - log.info( - `ProcessCreateProfile request: ${createProfileMessage.toString()}`, - ); + const createProfileMessage = GameProfile.fromBytes(message.getDataAsBuffer()); - // Add the profile - addGameProfile(createProfileMessage); + // Log the request + log.info(`ProcessCreateProfile request: ${createProfileMessage.toString()}`); + // Add the profile + addGameProfile(createProfileMessage); - // TODO: Send the response - const response = new GameMessage(257); - response.header.setId(0x601); + // TODO: Send the response + const response = new GameMessage(257); + response.header.setId(0x601); - response.setData(message.getData()); + response.setData(message.getData()); - // Log the response - log.info(`ProcessCreateProfile response: ${response.toString()}`); + // Log the response + log.info(`ProcessCreateProfile response: ${response.toString()}`); - socketCallback([response.serialize()]); - log.resetName(); - return Promise.resolve(); + socketCallback([response.serialize()]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processDeleteProfile.ts b/packages/nps/gameMessageProcessors/processDeleteProfile.ts index 0be750070..8f819fa48 100644 --- a/packages/nps/gameMessageProcessors/processDeleteProfile.ts +++ b/packages/nps/gameMessageProcessors/processDeleteProfile.ts @@ -1,9 +1,9 @@ -import fs from "node:fs"; import crypto from "node:crypto"; -import type { GameSocketCallback } from "./index.js"; +import fs from "node:fs"; import { GameMessage } from "../messageStructs/GameMessage.js"; import { SessionKey } from "../messageStructs/SessionKey.js"; import { getLenString } from "../src/utils/pureGet.js"; +import type { GameSocketCallback } from "./index.js"; import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; @@ -11,99 +11,99 @@ import type { UserStatus } from "../messageStructs/UserStatus.js"; const log = getServerLogger(); export function loadPrivateKey(path: string): string { - const privateKey = fs.readFileSync(path); + const privateKey = fs.readFileSync(path); - return privateKey.toString("utf8"); + return privateKey.toString("utf8"); } export function decryptSessionKey( - encryptedSessionKey: string, - privateKey: string, + encryptedSessionKey: string, + privateKey: string, ): string { - const sessionKeyStructure = crypto.privateDecrypt( - privateKey, - Buffer.from(encryptedSessionKey, "hex"), - ); + const sessionKeyStructure = crypto.privateDecrypt( + privateKey, + Buffer.from(encryptedSessionKey, "hex"), + ); - return sessionKeyStructure.toString("hex"); + return sessionKeyStructure.toString("hex"); } export function unpackUserLoginMessage(message: GameMessage): { - sessionKey: string; - gameId: string; - contextToken: string; + sessionKey: string; + gameId: string; + contextToken: string; } { - // Get the context token - const ticket = getLenString(message.getDataAsBuffer(), 0, false); + // Get the context token + const ticket = getLenString(message.getDataAsBuffer(), 0, false); - let dataOffset = ticket.length + 2; + let dataOffset = ticket.length + 2; - // The next data structure is a container with an empty id, a length, and a data structure + // The next data structure is a container with an empty id, a length, and a data structure - // Skip the empty id - dataOffset += 2; + // Skip the empty id + dataOffset += 2; - // Get the next data length - const nextDataLength = message.getDataAsBuffer().readUInt16BE(dataOffset); + // Get the next data length + const nextDataLength = message.getDataAsBuffer().readUInt16BE(dataOffset); - // This value is the encrypted session key hex, stored as a string - const encryptedSessionKey = message - .getDataAsBuffer() - .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) - .toString("utf8"); + // This value is the encrypted session key hex, stored as a string + const encryptedSessionKey = message + .getDataAsBuffer() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) + .toString("utf8"); - // Load the private key - const privateKey = loadPrivateKey("./data/private_key.pem"); + // Load the private key + const privateKey = loadPrivateKey("./data/private_key.pem"); - // Decrypt the session key - const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); + // Decrypt the session key + const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); - // Unpack the session key - const sessionKeyStructure = SessionKey.fromBytes( - Buffer.from(sessionKey, "hex"), - ); + // Unpack the session key + const sessionKeyStructure = SessionKey.fromBytes( + Buffer.from(sessionKey, "hex"), + ); - // Update the data offset - dataOffset += 2 + nextDataLength; + // Update the data offset + dataOffset += 2 + nextDataLength; - // Get the next data length - const nextDataLength2 = message.getDataAsBuffer().readUInt16BE(dataOffset); + // Get the next data length + const nextDataLength2 = message.getDataAsBuffer().readUInt16BE(dataOffset); - // This value is the game id (used by server to identify the game) - const gameId = message - .getDataAsBuffer() - .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) - .toString("utf8"); + // This value is the game id (used by server to identify the game) + const gameId = message + .getDataAsBuffer() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) + .toString("utf8"); - // Update the data offset - dataOffset += 2 + nextDataLength2; + // Update the data offset + dataOffset += 2 + nextDataLength2; - // Return the session key, game id, and context token - return { - sessionKey: sessionKeyStructure.getKey(), - gameId, - contextToken: ticket, - }; + // Return the session key, game id, and context token + return { + sessionKey: sessionKeyStructure.getKey(), + gameId, + contextToken: ticket, + }; } export async function processDeleteProfile( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processDeleteProfile"); - // Log the message - log.info(`Delete profile request: ${message.toString()}`); + log.setName("nps:processDeleteProfile"); + // Log the message + log.info(`Delete profile request: ${message.toString()}`); - // TODO: Delete the profile + // TODO: Delete the profile - // Create a new message - Login ACK - const loginACK = new GameMessage(0); - loginACK.header.setId(0x60c); + // Create a new message - Login ACK + const loginACK = new GameMessage(0); + loginACK.header.setId(0x60c); - // Send the ack - socketCallback([loginACK.serialize()]); - log.resetName(); - return Promise.resolve(); + // Send the ack + socketCallback([loginACK.serialize()]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts index d64c05a70..ccccfb0bb 100644 --- a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts +++ b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts @@ -1,14 +1,15 @@ import { - GameMessage, - SerializableData, + GameMessage, + SerializableData, } from "../messageStructs/GameMessage.js"; -import type { GameSocketCallback } from "./index.js"; -import { getAsHex } from "../src/utils/pureGet.js"; import { - type EncryptionSession, - getEncryptionSession, newEncryptionSession, - setEncryptionSession + type EncryptionSession, + getEncryptionSession, + newEncryptionSession, + setEncryptionSession, } from "../src/EncryptionSession.js"; +import { getAsHex } from "../src/utils/pureGet.js"; +import type { GameSocketCallback } from "./index.js"; import { lobbyCommandMap } from "./lobbyCommands.js"; import { getServerLogger } from "rusty-motors-shared"; @@ -17,97 +18,97 @@ import type { UserStatus } from "../messageStructs/UserStatus.js"; const log = getServerLogger(); export async function processEncryptedGameCommand( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processEncryptedGameCommand"); - log.info(`Attempting to decrypt message: ${message.toString()}`); - - // Get the encryption session - let encryptionSession: EncryptionSession | undefined = - getEncryptionSession(connectionId); - - // If the encryption session doesn't exist, attempt to create it - if (typeof encryptionSession === "undefined") { - try { - // Create the encryption session - const newSession = newEncryptionSession({ - connectionId, - customerId: userStatus.getCustomerId(), - sessionKey: userStatus.getSessionKey().getKey().substring(0, 16), - }); - setEncryptionSession(newSession); - encryptionSession = newSession; - } catch (error) { - log.error(`Error creating encryption session: ${error as string}`); - throw new Error("Error creating encryption session"); - } - - // Log the encryption session - log.info(`Created encryption session for ${userStatus.getCustomerId()}`); - } - - // Attempt to decrypt the message - const decryptedbytes = encryptionSession.gameDecipher.update( - message.getDataAsBuffer(), - ); - - // Log the decrypted bytes - log.info(`Decrypted bytes: ${getAsHex(decryptedbytes)}`); - - // Set the decrypted bytes as a new message - const decryptedMessage = new GameMessage(0); - decryptedMessage.deserialize(decryptedbytes); - - // Log the decrypted message id - log.info(`Decrypted message ID: ${decryptedMessage.header.getId()}`); - - // Do we have a valid message processor? - const processor = lobbyCommandMap.get(decryptedMessage.header.getId()); - - if (typeof processor === "undefined") { - const err = `No processor found for message ID: ${decryptedMessage.header.getId()}`; - log.fatal(err); - throw Error(err); - } - - // Process the message - const response = await processor( - decryptedMessage.header.getId(), - decryptedMessage.getDataAsBuffer(), - ); - - // Log the response - log.info(`Response: ${response.length} bytes, ${getAsHex(response)}`); - - // Encrypt the response - const encryptedResponse = encryptionSession.gameCipher.update(response); - setEncryptionSession(encryptionSession); - - // Log the encrypted response - log.info( - `Encrypted response: ${encryptedResponse.length} bytes, ${getAsHex( - encryptedResponse, - )}`, - ); - - const responsePacket = new GameMessage(0); - responsePacket.header.setId(0x1101); - - const responseData = new SerializableData(encryptedResponse.length); - responseData.deserialize(encryptedResponse); - - responsePacket.setData(responseData); - log.info( - `Response packet: ${responsePacket.header.getLength()} bytes, ${getAsHex( - responsePacket.serialize(), - )}`, - ); - const responseBytes = responsePacket.serialize(); - - socketCallback([responseBytes]); - log.resetName(); - return Promise.resolve(); + log.setName("nps:processEncryptedGameCommand"); + log.info(`Attempting to decrypt message: ${message.toString()}`); + + // Get the encryption session + let encryptionSession: EncryptionSession | undefined = + getEncryptionSession(connectionId); + + // If the encryption session doesn't exist, attempt to create it + if (typeof encryptionSession === "undefined") { + try { + // Create the encryption session + const newSession = newEncryptionSession({ + connectionId, + customerId: userStatus.getCustomerId(), + sessionKey: userStatus.getSessionKey().getKey().substring(0, 16), + }); + setEncryptionSession(newSession); + encryptionSession = newSession; + } catch (error) { + log.error(`Error creating encryption session: ${error as string}`); + throw new Error("Error creating encryption session"); + } + + // Log the encryption session + log.info(`Created encryption session for ${userStatus.getCustomerId()}`); + } + + // Attempt to decrypt the message + const decryptedbytes = encryptionSession.gameDecipher.update( + message.getDataAsBuffer(), + ); + + // Log the decrypted bytes + log.info(`Decrypted bytes: ${getAsHex(decryptedbytes)}`); + + // Set the decrypted bytes as a new message + const decryptedMessage = new GameMessage(0); + decryptedMessage.deserialize(decryptedbytes); + + // Log the decrypted message id + log.info(`Decrypted message ID: ${decryptedMessage.header.getId()}`); + + // Do we have a valid message processor? + const processor = lobbyCommandMap.get(decryptedMessage.header.getId()); + + if (typeof processor === "undefined") { + const err = `No processor found for message ID: ${decryptedMessage.header.getId()}`; + log.fatal(err); + throw Error(err); + } + + // Process the message + const response = await processor( + decryptedMessage.header.getId(), + decryptedMessage.getDataAsBuffer(), + ); + + // Log the response + log.info(`Response: ${response.length} bytes, ${getAsHex(response)}`); + + // Encrypt the response + const encryptedResponse = encryptionSession.gameCipher.update(response); + setEncryptionSession(encryptionSession); + + // Log the encrypted response + log.info( + `Encrypted response: ${encryptedResponse.length} bytes, ${getAsHex( + encryptedResponse, + )}`, + ); + + const responsePacket = new GameMessage(0); + responsePacket.header.setId(0x1101); + + const responseData = new SerializableData(encryptedResponse.length); + responseData.deserialize(encryptedResponse); + + responsePacket.setData(responseData); + log.info( + `Response packet: ${responsePacket.header.getLength()} bytes, ${getAsHex( + responsePacket.serialize(), + )}`, + ); + const responseBytes = responsePacket.serialize(); + + socketCallback([responseBytes]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGameLogin.ts b/packages/nps/gameMessageProcessors/processGameLogin.ts index dd3c8ff05..5ea562915 100644 --- a/packages/nps/gameMessageProcessors/processGameLogin.ts +++ b/packages/nps/gameMessageProcessors/processGameLogin.ts @@ -1,210 +1,211 @@ -import type { ISerializable } from "../types.js"; -import { GameMessage } from "../messageStructs/GameMessage.js"; -import fs from "node:fs"; import crypto from "node:crypto"; +import fs from "node:fs"; import * as Sentry from "@sentry/node"; -import { getToken } from "../services/token.js"; -import type { GameSocketCallback } from "./index.js"; +import { getServerConfiguration, getServerLogger } from "rusty-motors-shared"; +import { GameMessage } from "../messageStructs/GameMessage.js"; import { SessionKey } from "../messageStructs/SessionKey.js"; -import { getAsHex, getLenString } from "../src/utils/pureGet.js"; import { UserStatus } from "../messageStructs/UserStatus.js"; -import { getServerConfiguration, getServerLogger } from "rusty-motors-shared"; +import { getToken } from "../services/token.js"; import { UserStatusManager } from "../src/UserStatusManager.js"; +import { getAsHex, getLenString } from "../src/utils/pureGet.js"; +import type { ISerializable } from "../types.js"; +import type { GameSocketCallback } from "./index.js"; const log = getServerLogger(); export function loadPrivateKey(path: string): string { - const privateKey = fs.readFileSync(path); + const privateKey = fs.readFileSync(path); - return privateKey.toString("utf8"); + return privateKey.toString("utf8"); } export function decryptSessionKey( - encryptedSessionKey: string, - privateKey: string, + encryptedSessionKey: string, + privateKey: string, ): string { - const sessionKeyStructure = crypto.privateDecrypt( - privateKey, - Buffer.from(encryptedSessionKey, "hex"), - ); + const sessionKeyStructure = crypto.privateDecrypt( + privateKey, + Buffer.from(encryptedSessionKey, "hex"), + ); - return sessionKeyStructure.toString("hex"); + return sessionKeyStructure.toString("hex"); } export function unpackUserLoginMessage(message: ISerializable): { - sessionKey: string; - gameId: string; - contextToken: string; + sessionKey: string; + gameId: string; + contextToken: string; } { - log.setName("nps:unpackUserLoginMessage"); - log.info(`Unpacking user login message: ${getAsHex(message.serialize())}`); + log.setName("nps:unpackUserLoginMessage"); + log.info(`Unpacking user login message: ${getAsHex(message.serialize())}`); - // Get the context token - const ticket = getLenString(message.serialize(), 0, false); + // Get the context token + const ticket = getLenString(message.serialize(), 0, false); - let dataOffset = ticket.length + 2; + let dataOffset = ticket.length + 2; - // The next data structure is a container with an empty id, a length, and a data structure + // The next data structure is a container with an empty id, a length, and a data structure - // Skip the empty id - dataOffset += 2; + // Skip the empty id + dataOffset += 2; - // Get the next data length - const nextDataLength = message.serialize().readUInt16BE(dataOffset); + // Get the next data length + const nextDataLength = message.serialize().readUInt16BE(dataOffset); - // This value is the encrypted session key hex, stored as a string - const encryptedSessionKey = message - .serialize() - .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) - .toString("utf8"); + // This value is the encrypted session key hex, stored as a string + const encryptedSessionKey = message + .serialize() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength) + .toString("utf8"); - // Load the private key - const privateKey = loadPrivateKey( - getServerConfiguration({}).privateKeyFile, - ); + // Load the private key + const privateKey = loadPrivateKey(getServerConfiguration({}).privateKeyFile); - // Decrypt the session key - const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); + // Decrypt the session key + const sessionKey = decryptSessionKey(encryptedSessionKey, privateKey); - log.info(`Decrypted session key: ${getAsHex(Buffer.from(sessionKey, "hex"))}`); + log.info( + `Decrypted session key: ${getAsHex(Buffer.from(sessionKey, "hex"))}`, + ); - // Unpack the session key - const sessionKeyStructure = SessionKey.fromBytes( - Buffer.from(sessionKey, "hex"), - ); + // Unpack the session key + const sessionKeyStructure = SessionKey.fromBytes( + Buffer.from(sessionKey, "hex"), + ); - log.info(`Session key structure: ${sessionKeyStructure.toString()}`); + log.info(`Session key structure: ${sessionKeyStructure.toString()}`); - // Update the data offset - dataOffset += 2 + nextDataLength; + // Update the data offset + dataOffset += 2 + nextDataLength; - // Get the next data length - const nextDataLength2 = message.serialize().readUInt16BE(dataOffset); + // Get the next data length + const nextDataLength2 = message.serialize().readUInt16BE(dataOffset); - // This value is the game id (used by server to identify the game) - const gameId = message - .serialize() - .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) - .toString("utf8"); + // This value is the game id (used by server to identify the game) + const gameId = message + .serialize() + .subarray(dataOffset + 2, dataOffset + 2 + nextDataLength2) + .toString("utf8"); - // Update the data offset - dataOffset += 2 + nextDataLength2; + // Update the data offset + dataOffset += 2 + nextDataLength2; - log.resetName(); + log.resetName(); - // Return the session key, game id, and context token - return { - sessionKey: sessionKeyStructure.getKey(), - gameId, - contextToken: ticket, - }; + // Return the session key, game id, and context token + return { + sessionKey: sessionKeyStructure.getKey(), + gameId, + contextToken: ticket, + }; } /** * This is the initial connection to the Login server */ export async function processGameLogin( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - Sentry.startSpan( - { - name: "processLogin", - op: "processLogin", - }, - () => { - log.setName("nps:processLogin"); - - log.info(`Login: ${message.toString()}`); - - // Unpack the message - try { - const { sessionKey, contextToken } = - unpackUserLoginMessage(message.getData()); - - // Log the context token - log.info(`Context token: ${contextToken}`); - - // Log the session key - log.info(`Session key: ${sessionKey}`); - - // Look up the customer id - const user = getToken(contextToken); - - // If the user is not found, return an error - if (user === undefined) { - log.error(`User not found for context token: ${contextToken}`); - - // Create a new message - Not found - const response = new GameMessage(0); - response.header.setId(0x602); - - // Send the message - twice - Sentry.startSpan( - { - name: "socketCallback", - op: "socketCallback", - }, - () => { - socketCallback([response.serialize()]); - }, - ); - Sentry.startSpan( - { - name: "socketCallback", - op: "socketCallback", - }, - () => { - socketCallback([response.serialize()]); - }, - ); - - return; - } - - // Log the user - log.info(`User: ${user.customerId}`); - - // Create a new message - Login ACK - const loginACK = new GameMessage(0); - loginACK.header.setId(0x601); - - // Send the ack - socketCallback([loginACK.serialize()]); - - // Create a new UserStatus message - const userStatus = UserStatus.new(); - userStatus.setCustomerId(user.customerId); - userStatus.setPersonaId(0); - userStatus.ban.set({ - initiator: "Molly", - startComment: "Because I said so", - }); - userStatus.setSessionKey(SessionKey.fromKeyString(sessionKey)); - - UserStatusManager.addUserStatus(userStatus); - - // Create a new message - UserStatus - const userStatusMessage = new GameMessage(257); - userStatusMessage.header.setId(0x601); - - userStatusMessage.setData(userStatus); - - // Log the message - log.info(`UserStatus: ${userStatusMessage.toString()}`); - - // Send the message - socketCallback([userStatusMessage.serialize()]); - socketCallback([userStatusMessage.serialize()]); - - return; - } catch (e) { - console.error(e); - } - }, - ); - log.resetName(); - return Promise.resolve(); + Sentry.startSpan( + { + name: "processLogin", + op: "processLogin", + }, + () => { + log.setName("nps:processLogin"); + + log.info(`Login: ${message.toString()}`); + + // Unpack the message + try { + const { sessionKey, contextToken } = unpackUserLoginMessage( + message.getData(), + ); + + // Log the context token + log.info(`Context token: ${contextToken}`); + + // Log the session key + log.info(`Session key: ${sessionKey}`); + + // Look up the customer id + const user = getToken(contextToken); + + // If the user is not found, return an error + if (user === undefined) { + log.error(`User not found for context token: ${contextToken}`); + + // Create a new message - Not found + const response = new GameMessage(0); + response.header.setId(0x602); + + // Send the message - twice + Sentry.startSpan( + { + name: "socketCallback", + op: "socketCallback", + }, + () => { + socketCallback([response.serialize()]); + }, + ); + Sentry.startSpan( + { + name: "socketCallback", + op: "socketCallback", + }, + () => { + socketCallback([response.serialize()]); + }, + ); + + return; + } + + // Log the user + log.info(`User: ${user.customerId}`); + + // Create a new message - Login ACK + const loginACK = new GameMessage(0); + loginACK.header.setId(0x601); + + // Send the ack + socketCallback([loginACK.serialize()]); + + // Create a new UserStatus message + const userStatus = UserStatus.new(); + userStatus.setCustomerId(user.customerId); + userStatus.setPersonaId(0); + userStatus.ban.set({ + initiator: "Molly", + startComment: "Because I said so", + }); + userStatus.setSessionKey(SessionKey.fromKeyString(sessionKey)); + + UserStatusManager.addUserStatus(userStatus); + + // Create a new message - UserStatus + const userStatusMessage = new GameMessage(257); + userStatusMessage.header.setId(0x601); + + userStatusMessage.setData(userStatus); + + // Log the message + log.info(`UserStatus: ${userStatusMessage.toString()}`); + + // Send the message + socketCallback([userStatusMessage.serialize()]); + socketCallback([userStatusMessage.serialize()]); + + return; + } catch (e) { + console.error(e); + } + }, + ); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGameLogout.ts b/packages/nps/gameMessageProcessors/processGameLogout.ts index 954b807bb..f104a976b 100644 --- a/packages/nps/gameMessageProcessors/processGameLogout.ts +++ b/packages/nps/gameMessageProcessors/processGameLogout.ts @@ -1,15 +1,14 @@ import type { GameMessage } from "../messageStructs/GameMessage.js"; -import type { GameSocketCallback } from "./index.js"; -import { sendNPSAck } from "../src/utils/sendNPSAck.js"; import type { UserStatus } from "../messageStructs/UserStatus.js"; +import { sendNPSAck } from "../src/utils/sendNPSAck.js"; +import type { GameSocketCallback } from "./index.js"; export async function processGameLogout( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback, + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - - sendNPSAck(socketCallback); - return Promise.resolve(); + sendNPSAck(socketCallback); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts index 64325db04..fd435c9af 100644 --- a/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts +++ b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts @@ -1,44 +1,44 @@ import { - GameMessage, - ProfileList, - SerializableData, - getDWord, - getGameProfilesForCustomerId, -} from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; + GameMessage, + ProfileList, + SerializableData, + getDWord, + getGameProfilesForCustomerId, +} from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import type { UserStatus } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { UserStatus } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processFirstBuddy( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processFirstBuddy'); - const profileId = getDWord(message.getDataAsBuffer(), 0, false); + log.setName("nps:processFirstBuddy"); + const profileId = getDWord(message.getDataAsBuffer(), 0, false); - log.info(`GetFirstBuddy profile: ${profileId}`); + log.info(`GetFirstBuddy profile: ${profileId}`); - // Look up the profiles for the customer ID - const profiles = getGameProfilesForCustomerId(profileId); + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(profileId); - // Create a new NPSList of profiles - const list = new ProfileList(); + // Create a new NPSList of profiles + const list = new ProfileList(); - const outMessage = new GameMessage(257); - outMessage.header.setId(0x614); - outMessage.setData(new SerializableData(4)); + const outMessage = new GameMessage(257); + outMessage.header.setId(0x614); + outMessage.setData(new SerializableData(4)); - // Log the message - log.info(`GetFirstBuddy: ${outMessage.toString()}`); + // Log the message + log.info(`GetFirstBuddy: ${outMessage.toString()}`); - log.info('==========================================='); + log.info("==========================================="); - socketCallback([outMessage.serialize()]); - log.resetName(); - return Promise.resolve(); + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGetProfileInfo.ts b/packages/nps/gameMessageProcessors/processGetProfileInfo.ts index ea648243d..d9972d064 100644 --- a/packages/nps/gameMessageProcessors/processGetProfileInfo.ts +++ b/packages/nps/gameMessageProcessors/processGetProfileInfo.ts @@ -1,66 +1,66 @@ import { - GameMessage, - ProfileList, - getAsHex, - getDWord, - getGameProfilesForCustomerId, -} from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; + GameMessage, + ProfileList, + getAsHex, + getDWord, + getGameProfilesForCustomerId, +} from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import type { UserStatus } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { UserStatus } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processGetProfileInfo( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processGetProfileInfo'); - const customerId = getDWord(message.serialize(), 0, false); + log.setName("nps:processGetProfileInfo"); + const customerId = getDWord(message.serialize(), 0, false); - log.info(`GetProfileInfo: ${customerId}`); + log.info(`GetProfileInfo: ${customerId}`); - // Look up the profiles for the customer ID - const profiles = getGameProfilesForCustomerId(customerId); + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(customerId); - // Create a new NPSList of profiles - const list = new ProfileList(); + // Create a new NPSList of profiles + const list = new ProfileList(); - const outMessage = new GameMessage(0); + const outMessage = new GameMessage(0); - // Add each profile to the list - if (profiles) { - outMessage.header.setId(0x607); - for (const profile of profiles) { - // Log the profile - log.info(`GetProfileInfo: ${profile.toString()}`); // TODO: Remove this line + // Add each profile to the list + if (profiles) { + outMessage.header.setId(0x607); + for (const profile of profiles) { + // Log the profile + log.info(`GetProfileInfo: ${profile.toString()}`); // TODO: Remove this line - list.addProfile(profile); - } - } else { - outMessage.header.setId(0x602); - } + list.addProfile(profile); + } + } else { + outMessage.header.setId(0x602); + } - // Send the list back to the client - try { - // Log the message data - log.info(`GetProfileInfo: ${getAsHex(list.serialize())}`); + // Send the list back to the client + try { + // Log the message data + log.info(`GetProfileInfo: ${getAsHex(list.serialize())}`); - outMessage.setData(list); + outMessage.setData(list); - // Log the message - log.info(`GetProfileInfo: ${outMessage.toString()}`); + // Log the message + log.info(`GetProfileInfo: ${outMessage.toString()}`); - log.info('==========================================='); + log.info("==========================================="); - socketCallback([outMessage.serialize()]); - log.resetName(); - return Promise.resolve(); - } catch (error) { - log.error(`Error sending profile info: ${error as string}`); - throw new Error('Error sending profile info'); - } + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); + } catch (error) { + log.error(`Error sending profile info: ${error as string}`); + throw new Error("Error sending profile info"); + } } diff --git a/packages/nps/gameMessageProcessors/processGetProfileMaps.ts b/packages/nps/gameMessageProcessors/processGetProfileMaps.ts index a97737efd..225fac433 100644 --- a/packages/nps/gameMessageProcessors/processGetProfileMaps.ts +++ b/packages/nps/gameMessageProcessors/processGetProfileMaps.ts @@ -1,71 +1,71 @@ import { - GameMessage, - ProfileList, - getAsHex, - getDWord, - getGameProfilesForCustomerId, -} from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; + GameMessage, + ProfileList, + getAsHex, + getDWord, + getGameProfilesForCustomerId, +} from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import type { UserStatus } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { UserStatus } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processGetProfileMaps( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processGetProfileMaps'); - // This message is a version 257, but it's version is set to 0 - // This is a bug in the client, so we need to generate a new message - // with the correct version - const requestMessage = GameMessage.fromGameMessage(257, message); + log.setName("nps:processGetProfileMaps"); + // This message is a version 257, but it's version is set to 0 + // This is a bug in the client, so we need to generate a new message + // with the correct version + const requestMessage = GameMessage.fromGameMessage(257, message); - log.info(`GetProfileMaps (257): ${requestMessage.toString()}`); + log.info(`GetProfileMaps (257): ${requestMessage.toString()}`); - const customerId = getDWord(requestMessage.getDataAsBuffer(), 0, false); + const customerId = getDWord(requestMessage.getDataAsBuffer(), 0, false); - log.info(`GetProfileMaps: ${customerId}`); + log.info(`GetProfileMaps: ${customerId}`); - // Look up the profiles for the customer ID - const profiles = getGameProfilesForCustomerId(customerId); + // Look up the profiles for the customer ID + const profiles = getGameProfilesForCustomerId(customerId); - // Create a new NPSList of profiles - const list = new ProfileList(); + // Create a new NPSList of profiles + const list = new ProfileList(); - // Add each profile to the list - if (profiles) { - for (const profile of profiles) { - // Log the profile - log.info(`GetProfileMaps: ${profile.toString()}`); + // Add each profile to the list + if (profiles) { + for (const profile of profiles) { + // Log the profile + log.info(`GetProfileMaps: ${profile.toString()}`); - list.addProfile(profile); - } - } + list.addProfile(profile); + } + } - // Send the list back to the client - try { - const outMessage = new GameMessage(257); - outMessage.header.setId(0x607); + // Send the list back to the client + try { + const outMessage = new GameMessage(257); + outMessage.header.setId(0x607); - // Log the message data - log.info(`GetProfileMaps: ${getAsHex(outMessage.serialize())}`); + // Log the message data + log.info(`GetProfileMaps: ${getAsHex(outMessage.serialize())}`); - outMessage.setData(list); + outMessage.setData(list); - // Log the message - log.info(`GetProfileMaps: ${outMessage.toString()}`); + // Log the message + log.info(`GetProfileMaps: ${outMessage.toString()}`); - log.info('==========================================='); + log.info("==========================================="); - socketCallback([outMessage.serialize()]); - log.resetName(); - return Promise.resolve(); - } catch (error) { - log.error(`Error sending profile info: ${error as string}`); - throw new Error('Error sending profile info'); - } + socketCallback([outMessage.serialize()]); + log.resetName(); + return Promise.resolve(); + } catch (error) { + log.error(`Error sending profile info: ${error as string}`); + throw new Error("Error sending profile info"); + } } diff --git a/packages/nps/gameMessageProcessors/processPing.ts b/packages/nps/gameMessageProcessors/processPing.ts index 886be08b2..5fbf73206 100644 --- a/packages/nps/gameMessageProcessors/processPing.ts +++ b/packages/nps/gameMessageProcessors/processPing.ts @@ -1,22 +1,22 @@ -import { GameMessage } from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; +import { GameMessage } from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import type { UserStatus } from 'rusty-motors-nps'; -import { sendNPSAck } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { UserStatus } from "rusty-motors-nps"; +import { sendNPSAck } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processPing( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processPing'); - log.info(`Ping: ${message.toString()}`); + log.setName("nps:processPing"); + log.info(`Ping: ${message.toString()}`); - sendNPSAck(socketCallback); - log.resetName(); - return Promise.resolve(); + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processSelectPersona.ts b/packages/nps/gameMessageProcessors/processSelectPersona.ts index d99c703a1..7d299cf5f 100644 --- a/packages/nps/gameMessageProcessors/processSelectPersona.ts +++ b/packages/nps/gameMessageProcessors/processSelectPersona.ts @@ -1,50 +1,50 @@ -import { GameMessage, getDWord } from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; +import { GameMessage, getDWord } from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import { UserStatus, UserStatusManager, sendNPSAck } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import { UserStatus, UserStatusManager, sendNPSAck } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processSelectPersona( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processSelectPersona'); + log.setName("nps:processSelectPersona"); - log.info(`SelectPersona: ${message.toString()}`); + log.info(`SelectPersona: ${message.toString()}`); - const customerId = getDWord(message.getDataAsBuffer(), 0, false); + const customerId = getDWord(message.getDataAsBuffer(), 0, false); - const personaId = getDWord(message.getDataAsBuffer(), 4, false); + const personaId = getDWord(message.getDataAsBuffer(), 4, false); - const shardId = getDWord(message.getDataAsBuffer(), 8, false); + const shardId = getDWord(message.getDataAsBuffer(), 8, false); - // Log the values - log.info(`Customer ID: ${customerId}`); - log.info(`Persona ID: ${personaId}`); - log.info(`Shard ID: ${shardId}`); + // Log the values + log.info(`Customer ID: ${customerId}`); + log.info(`Persona ID: ${personaId}`); + log.info(`Shard ID: ${shardId}`); - // Lookup the session - const existingStatus = UserStatusManager.getUserStatus(customerId); + // Lookup the session + const existingStatus = UserStatusManager.getUserStatus(customerId); - if (!existingStatus) { - log.error(`UserStatus not found for customer ID ${customerId}`); - throw new Error(`UserStatus not found for customer ID ${customerId}`); - } + if (!existingStatus) { + log.error(`UserStatus not found for customer ID ${customerId}`); + throw new Error(`UserStatus not found for customer ID ${customerId}`); + } - log.info( - `Setting persona ID to ${personaId} for ${existingStatus.getCustomerId()}` - ); + log.info( + `Setting persona ID to ${personaId} for ${existingStatus.getCustomerId()}`, + ); - // Update the user status - existingStatus.setPersonaId(personaId); + // Update the user status + existingStatus.setPersonaId(personaId); - log.info(`GameLogin: ${message.toString()}`); + log.info(`GameLogin: ${message.toString()}`); - sendNPSAck(socketCallback); - log.resetName(); - return Promise.resolve(); + sendNPSAck(socketCallback); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processUserLogin.ts b/packages/nps/gameMessageProcessors/processUserLogin.ts index 45f9e2a0c..cdf5b1119 100644 --- a/packages/nps/gameMessageProcessors/processUserLogin.ts +++ b/packages/nps/gameMessageProcessors/processUserLogin.ts @@ -1,72 +1,72 @@ import { - GameMessage, - UserInfo, - getDWord, - getLenString, -} from 'rusty-motors-nps'; -import type { GameSocketCallback } from './index.js'; + GameMessage, + UserInfo, + getDWord, + getLenString, +} from "rusty-motors-nps"; +import type { GameSocketCallback } from "./index.js"; -import type { UserStatus } from 'rusty-motors-nps'; -import { UserStatusManager, getCustomerId } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { UserStatus } from "rusty-motors-nps"; +import { UserStatusManager, getCustomerId } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export async function processUserLogin( - connectionId: string, - userStatus: UserStatus, - message: GameMessage, - socketCallback: GameSocketCallback + connectionId: string, + userStatus: UserStatus, + message: GameMessage, + socketCallback: GameSocketCallback, ): Promise { - log.setName('nps:processUserLogin'); + log.setName("nps:processUserLogin"); - log.info(`UserLogin: ${message.toString()}`); + log.info(`UserLogin: ${message.toString()}`); - // This message is a BareMessageV0 + // This message is a BareMessageV0 - const personaId = getDWord(message.getDataAsBuffer(), 0, false); + const personaId = getDWord(message.getDataAsBuffer(), 0, false); - const profileName = getLenString(message.getDataAsBuffer(), 4, false); + const profileName = getLenString(message.getDataAsBuffer(), 4, false); - // Lookup customerID from personaID - const customerID = getCustomerId(personaId); + // Lookup customerID from personaID + const customerID = getCustomerId(personaId); - if (customerID === -1) { - log.error(`CustomerID not found for personaID: ${personaId}`); - throw new Error(`CustomerID not found for personaID: ${personaId}`); - } + if (customerID === -1) { + log.error(`CustomerID not found for personaID: ${personaId}`); + throw new Error(`CustomerID not found for personaID: ${personaId}`); + } - log.info(`LobbyLogin: ${personaId} ${profileName} ${customerID}`); + log.info(`LobbyLogin: ${personaId} ${profileName} ${customerID}`); - const existingStatus = UserStatusManager.getUserStatus(customerID); + const existingStatus = UserStatusManager.getUserStatus(customerID); - if (typeof existingStatus === 'undefined') { - log.error(`UserStatus not found for customerID: ${customerID}`); - throw new Error(`UserStatus not found for customerID: ${customerID}`); - } + if (typeof existingStatus === "undefined") { + log.error(`UserStatus not found for customerID: ${customerID}`); + throw new Error(`UserStatus not found for customerID: ${customerID}`); + } - // Update the user status - existingStatus.setPersonaId(personaId); + // Update the user status + existingStatus.setPersonaId(personaId); - userStatus = existingStatus; + userStatus = existingStatus; - log.info(`LobbyLogin: ${message.toString()}`); + log.info(`LobbyLogin: ${message.toString()}`); - const response = new UserInfo(personaId, profileName); + const response = new UserInfo(personaId, profileName); - log.info(`Sending response: ${response.toString()}`); + log.info(`Sending response: ${response.toString()}`); - const responseMessage = new GameMessage(0); - responseMessage.header.setId(0x120); + const responseMessage = new GameMessage(0); + responseMessage.header.setId(0x120); - responseMessage.setData(response); + responseMessage.setData(response); - log.info(`Response message: ${responseMessage.toString()}`); + log.info(`Response message: ${responseMessage.toString()}`); - const responseBytes = responseMessage.serialize(); + const responseBytes = responseMessage.serialize(); - socketCallback([responseBytes]); + socketCallback([responseBytes]); - log.resetName(); - return Promise.resolve(); + log.resetName(); + return Promise.resolve(); } diff --git a/packages/nps/index.ts b/packages/nps/index.ts index 4f1c09ad4..b0ee48860 100644 --- a/packages/nps/index.ts +++ b/packages/nps/index.ts @@ -1,53 +1,53 @@ export { - MessageProcessorError, - PortMapError, - gameMessageProcessors, - getGameMessageProcessor, - getPortMessageType, - populateGameMessageProcessors, - populatePortToMessageTypes, - portToMessageTypes, - type GameSocketCallback, -} from './gameMessageProcessors/index.js'; -export { processGameLogin } from './gameMessageProcessors/processGameLogin.js'; -export { GameMessage, SerializableData } from './messageStructs/GameMessage.js'; -export { MiniRiffInfo, MiniRiffList } from './messageStructs/MiniRiffList.js'; -export { MiniUserInfo, MiniUserList } from './messageStructs/MiniUserList.js'; -export { ProfileList } from './messageStructs/ProfileList.js'; -export { UserInfo } from './messageStructs/UserInfo.js'; -export { UserStatus } from './messageStructs/UserStatus.js'; + MessageProcessorError, + PortMapError, + gameMessageProcessors, + getGameMessageProcessor, + getPortMessageType, + populateGameMessageProcessors, + populatePortToMessageTypes, + portToMessageTypes, + type GameSocketCallback, +} from "./gameMessageProcessors/index.js"; +export { processGameLogin } from "./gameMessageProcessors/processGameLogin.js"; +export { GameMessage, SerializableData } from "./messageStructs/GameMessage.js"; +export { MiniRiffInfo, MiniRiffList } from "./messageStructs/MiniRiffList.js"; +export { MiniUserInfo, MiniUserList } from "./messageStructs/MiniUserList.js"; +export { ProfileList } from "./messageStructs/ProfileList.js"; +export { UserInfo } from "./messageStructs/UserInfo.js"; +export { UserStatus } from "./messageStructs/UserStatus.js"; export { - getUser, - populateGameUsers as populateGameUsers, -} from './services/account.js'; + getUser, + populateGameUsers as populateGameUsers, +} from "./services/account.js"; export { - gameProfiles, - getCustomerId, - getGameProfilesForCustomerId, -} from './services/profile.js'; -export { generateToken } from './services/token.js'; -export { UserStatusManager } from './src/UserStatusManager.js'; -export { isOnlyOneSet } from './src/utils/pureCompare.js'; + gameProfiles, + getCustomerId, + getGameProfilesForCustomerId, +} from "./services/profile.js"; +export { generateToken } from "./services/token.js"; +export { UserStatusManager } from "./src/UserStatusManager.js"; +export { isOnlyOneSet } from "./src/utils/pureCompare.js"; export { - getAsHex, - getDWord, - getLenBlob, - getLenString, - getNBytes, - getShortBool, - getWord, -} from './src/utils/pureGet.js'; + getAsHex, + getDWord, + getLenBlob, + getLenString, + getNBytes, + getShortBool, + getWord, +} from "./src/utils/pureGet.js"; export { - put16, - put16BE, - put16LE, - put32, - put32BE, - put32LE, - put8, - putLenBlob, - putLenString, - putShortBool, -} from './src/utils/purePut.js'; -export { sendNPSAck } from './src/utils/sendNPSAck.js'; -export * from './types.js'; + put16, + put16BE, + put16LE, + put32, + put32BE, + put32LE, + put8, + putLenBlob, + putLenString, + putShortBool, +} from "./src/utils/purePut.js"; +export { sendNPSAck } from "./src/utils/sendNPSAck.js"; +export * from "./types.js"; diff --git a/packages/nps/messageStructs/GameMessage.ts b/packages/nps/messageStructs/GameMessage.ts index a844cbee1..6ab03454d 100644 --- a/packages/nps/messageStructs/GameMessage.ts +++ b/packages/nps/messageStructs/GameMessage.ts @@ -1,205 +1,204 @@ -import type { ISerializable, IMessageHeader, IMessage } from "rusty-motors-nps"; +import type { IMessage, IMessageHeader, ISerializable } from "rusty-motors-nps"; export class MessageHeader implements IMessageHeader { - private version: 0 | 257; - private id: number; - private length: number; - - constructor(version: 0 | 257, id: number, length: number) { - if (version !== 0 && version !== 257) { - throw new Error(`Invalid version ${parseInt(version)}`); - } - this.version = version; - this.id = id; - this.length = length !== 0 ? length : this.getByteSize(); - } - getDataOffset(): number { - return this.getVersion() === 0 ? 4 : 12; - } - getByteSize(): number { - return this.getVersion() === 0 ? 4 : 12; - } - - getVersion(): number { - return this.version; - } - getId(): number { - return this.id; - } - getLength(): number { - return this.length; - } - setVersion(version: 0 | 257): void { - if (version !== 0 && version !== 257) { - throw new Error(`Invalid version ${parseInt(version)}`); - } - this.version = version; - } - setId(id: number): void { - this.id = id; - } - setLength(length: number): void { - this.length = length; - } - - private serializeV0(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16BE(this.id, 0); - buffer.writeUInt16BE(this.length, 2); - - return buffer; - } - - private serializeV1(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16BE(this.id, 0); - buffer.writeUInt16BE(this.length, 2); - buffer.writeUInt16BE(this.version, 4); - buffer.writeUInt16BE(0, 6); - buffer.writeUInt32BE(this.length, 8); - - return buffer; - } - - serialize(): Buffer { - return this.version === 0 ? this.serializeV0() : this.serializeV1(); - } - - private deserializeV0(data: Buffer): void { - this.id = data.readUInt16BE(0); - this.length = data.readUInt16BE(2); - } - - private deserializeV1(data: Buffer): void { - this.id = data.readUInt16BE(0); - this.length = data.readUInt16BE(2); - // Skip version - // Skip padding - this.length = data.readUInt32BE(8); - } - - deserialize(data: Buffer): void { - if (data.length < 4) { - throw new Error( - `Data is too short. Expected at least 4 bytes, got ${data.length} bytes`, - ); - } - - if (this.version === 0) { - this.deserializeV0(data); - } else { - this.deserializeV1(data); - } - } + private version: 0 | 257; + private id: number; + private length: number; + + constructor(version: 0 | 257, id: number, length: number) { + if (version !== 0 && version !== 257) { + throw new Error(`Invalid version ${parseInt(version)}`); + } + this.version = version; + this.id = id; + this.length = length !== 0 ? length : this.getByteSize(); + } + getDataOffset(): number { + return this.getVersion() === 0 ? 4 : 12; + } + getByteSize(): number { + return this.getVersion() === 0 ? 4 : 12; + } + + getVersion(): number { + return this.version; + } + getId(): number { + return this.id; + } + getLength(): number { + return this.length; + } + setVersion(version: 0 | 257): void { + if (version !== 0 && version !== 257) { + throw new Error(`Invalid version ${parseInt(version)}`); + } + this.version = version; + } + setId(id: number): void { + this.id = id; + } + setLength(length: number): void { + this.length = length; + } + + private serializeV0(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + + return buffer; + } + + private serializeV1(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16BE(this.id, 0); + buffer.writeUInt16BE(this.length, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(0, 6); + buffer.writeUInt32BE(this.length, 8); + + return buffer; + } + + serialize(): Buffer { + return this.version === 0 ? this.serializeV0() : this.serializeV1(); + } + + private deserializeV0(data: Buffer): void { + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + } + + private deserializeV1(data: Buffer): void { + this.id = data.readUInt16BE(0); + this.length = data.readUInt16BE(2); + // Skip version + // Skip padding + this.length = data.readUInt32BE(8); + } + + deserialize(data: Buffer): void { + if (data.length < 4) { + throw new Error( + `Data is too short. Expected at least 4 bytes, got ${data.length} bytes`, + ); + } + + if (this.version === 0) { + this.deserializeV0(data); + } else { + this.deserializeV1(data); + } + } } export class SerializableData implements ISerializable { - private data: Buffer; - constructor(requestedSize: number) { - this.data = Buffer.alloc(requestedSize); - } - - serialize(): Buffer { - return this.data; - } - - deserialize(data: Buffer): void { - if (data.length > this.data.length) { - throw new Error( - `Data is too long. Expected at most ${this.data.length} bytes, got ${data.length} bytes`, - ); - } - this.data = data; - } - - getByteSize(): number { - return this.data.length; - } - - toString(): string { - return `EmptyData(length=${this.data.length}, data=${this.data.toString( - "hex", - )})`; - } + private data: Buffer; + constructor(requestedSize: number) { + this.data = Buffer.alloc(requestedSize); + } + + serialize(): Buffer { + return this.data; + } + + deserialize(data: Buffer): void { + if (data.length > this.data.length) { + throw new Error( + `Data is too long. Expected at most ${this.data.length} bytes, got ${data.length} bytes`, + ); + } + this.data = data; + } + + getByteSize(): number { + return this.data.length; + } + + toString(): string { + return `EmptyData(length=${this.data.length}, data=${this.data.toString( + "hex", + )})`; + } } export class GameMessage implements IMessage { - header: MessageHeader; - data: ISerializable; - - constructor(version: 0 | 257) { - this.header = new MessageHeader(version, 0, 0); - this.data = new SerializableData(0); - } - - getId() { - return this.header.getId(); - } - - getDataAsBuffer(): Buffer { - return this.data.serialize(); - } - - /** The message length is the length of the message data, not including the id */ - getByteSize(): number { - return this.header.getLength(); - } - getData(): ISerializable { - return this.data; - } - setData(data: ISerializable): void { - this.data = data; - this.header.setLength(data.getByteSize() + this.header.getByteSize()); - } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - const headerData = this.header.serialize(); - headerData.copy(buffer, 0); - const messageData = this.data.serialize(); - messageData.copy(buffer, this.header.getDataOffset()); - return buffer; - } - deserialize(data: Buffer): GameMessage { - if (data.length < this.header.getDataOffset()) { - throw new Error( - `Data is too short. Expected at least ${this.header.getDataOffset()} bytes, got ${ - data.length - } bytes`, - ); - } - this.header.deserialize(data); - const messageData = data.subarray(this.header.getDataOffset()); - - // Update the message data to the required size - this.data = new SerializableData(this.header.getLength()); - - this.data.deserialize(messageData.subarray(0, this.header.getLength())); - return this; - } - - toString(): string { - return `Id: ${this.header.getId()} + header: MessageHeader; + data: ISerializable; + + constructor(version: 0 | 257) { + this.header = new MessageHeader(version, 0, 0); + this.data = new SerializableData(0); + } + + getId() { + return this.header.getId(); + } + + getDataAsBuffer(): Buffer { + return this.data.serialize(); + } + + /** The message length is the length of the message data, not including the id */ + getByteSize(): number { + return this.header.getLength(); + } + getData(): ISerializable { + return this.data; + } + setData(data: ISerializable): void { + this.data = data; + this.header.setLength(data.getByteSize() + this.header.getByteSize()); + } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + const headerData = this.header.serialize(); + headerData.copy(buffer, 0); + const messageData = this.data.serialize(); + messageData.copy(buffer, this.header.getDataOffset()); + return buffer; + } + deserialize(data: Buffer): GameMessage { + if (data.length < this.header.getDataOffset()) { + throw new Error( + `Data is too short. Expected at least ${this.header.getDataOffset()} bytes, got ${ + data.length + } bytes`, + ); + } + this.header.deserialize(data); + const messageData = data.subarray(this.header.getDataOffset()); + + // Update the message data to the required size + this.data = new SerializableData(this.header.getLength()); + + this.data.deserialize(messageData.subarray(0, this.header.getLength())); + return this; + } + + toString(): string { + return `Id: ${this.header.getId()} Length: ${this.header.getLength()} Data: ${this.data.toString()}`; - } - - static identifyVersion(data: Buffer): 0 | 257 { - if (data.length < 6) { - return 0; - } - - const version = data.readUInt16BE(4); - if (version !== 257) { - return 0; - } - - return 257; - } - - static fromGameMessage(version: 0 | 257, source: GameMessage): GameMessage { - const message = new GameMessage(version); - message.deserialize(source.serialize()); - return message; - } - + } + + static identifyVersion(data: Buffer): 0 | 257 { + if (data.length < 6) { + return 0; + } + + const version = data.readUInt16BE(4); + if (version !== 257) { + return 0; + } + + return 257; + } + + static fromGameMessage(version: 0 | 257, source: GameMessage): GameMessage { + const message = new GameMessage(version); + message.deserialize(source.serialize()); + return message; + } } diff --git a/packages/nps/messageStructs/GameProfile.ts b/packages/nps/messageStructs/GameProfile.ts index 81ee60abb..ff4f7c87e 100644 --- a/packages/nps/messageStructs/GameProfile.ts +++ b/packages/nps/messageStructs/GameProfile.ts @@ -1,166 +1,166 @@ import type { ISerializable } from "rusty-motors-nps"; import { putLenString } from "rusty-motors-nps"; import { - getAsHex, - getLenBlob, - getLenString, - getShortBool, + getAsHex, + getLenBlob, + getLenString, + getShortBool, } from "rusty-motors-nps"; export class GameProfile implements ISerializable { - customerId: number; // 4 bytes - profileName: string; // 32 bytes - max length - serverId: number; // 4 bytes - createStamp: number; // 4 bytes - lastLoginStamp: number; // 4 bytes - numberGames: number; // 4 bytes - profileId: number; // 4 bytes - isOnline: boolean; // 2 bytes - gamePurchaseStamp: number; // 4 bytes - gameSerialNumber: string; // 32 bytes - max length - timeOnline: number; // 4 bytes - timeInGame: number; // 4 bytes - gameBlob: Buffer; // 512 bytes - max length - personalBlob: Buffer; // 256 bytes - max length - pictureBlob: Buffer; // 1 byte - dnd: boolean; // 2 bytes - gameStartStamp: number; // 4 bytes - currentKey: string; // 400 bytes - max length - profileLevel: number; // 2 bytes - shardId: number; // 4 bytes + customerId: number; // 4 bytes + profileName: string; // 32 bytes - max length + serverId: number; // 4 bytes + createStamp: number; // 4 bytes + lastLoginStamp: number; // 4 bytes + numberGames: number; // 4 bytes + profileId: number; // 4 bytes + isOnline: boolean; // 2 bytes + gamePurchaseStamp: number; // 4 bytes + gameSerialNumber: string; // 32 bytes - max length + timeOnline: number; // 4 bytes + timeInGame: number; // 4 bytes + gameBlob: Buffer; // 512 bytes - max length + personalBlob: Buffer; // 256 bytes - max length + pictureBlob: Buffer; // 1 byte + dnd: boolean; // 2 bytes + gameStartStamp: number; // 4 bytes + currentKey: string; // 400 bytes - max length + profileLevel: number; // 2 bytes + shardId: number; // 4 bytes - constructor() { - this.customerId = 0; - this.profileName = ""; - this.serverId = 0; - this.createStamp = 0; - this.lastLoginStamp = 0; - this.numberGames = 0; - this.profileId = 0; - this.isOnline = false; - this.gamePurchaseStamp = 0; - this.gameSerialNumber = ""; - this.timeOnline = 0; - this.timeInGame = 0; - this.gameBlob = Buffer.alloc(0); - this.personalBlob = Buffer.alloc(0); - this.pictureBlob = Buffer.alloc(0); - this.dnd = false; - this.gameStartStamp = 0; - this.currentKey = ""; - this.profileLevel = 0; - this.shardId = 0; - } - serialize(): Buffer { - return this.toBytes(); - } - deserialize(data: Buffer): GameProfile { - return GameProfile.fromBytes(data); - } - getByteSize(): number { - throw new Error("Method not implemented."); - } + constructor() { + this.customerId = 0; + this.profileName = ""; + this.serverId = 0; + this.createStamp = 0; + this.lastLoginStamp = 0; + this.numberGames = 0; + this.profileId = 0; + this.isOnline = false; + this.gamePurchaseStamp = 0; + this.gameSerialNumber = ""; + this.timeOnline = 0; + this.timeInGame = 0; + this.gameBlob = Buffer.alloc(0); + this.personalBlob = Buffer.alloc(0); + this.pictureBlob = Buffer.alloc(0); + this.dnd = false; + this.gameStartStamp = 0; + this.currentKey = ""; + this.profileLevel = 0; + this.shardId = 0; + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(data: Buffer): GameProfile { + return GameProfile.fromBytes(data); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } - static new(): GameProfile { - return new GameProfile(); - } + static new(): GameProfile { + return new GameProfile(); + } - static fromBytes(data: Buffer): GameProfile { - const message = new GameProfile(); - let offset = 0; - message.customerId = data.readUInt32BE(offset); - offset += 4; - message.profileName = getLenString(data, offset, false); - offset += message.profileName.length + 2; - message.serverId = data.readUInt32BE(offset); - offset += 4; - message.createStamp = data.readUInt32BE(offset); - offset += 4; - message.lastLoginStamp = data.readUInt32BE(offset); - offset += 4; - message.numberGames = data.readUInt32BE(offset); - offset += 4; - message.profileId = data.readUInt32BE(offset); - offset += 4; - message.isOnline = getShortBool(data, offset); - offset += 2; - message.gamePurchaseStamp = data.readUInt32BE(offset); - offset += 4; - message.gameSerialNumber = getLenString(data, offset, false); - offset += message.gameSerialNumber.length + 2; - message.timeOnline = data.readUInt32BE(offset); - offset += 4; - message.timeInGame = data.readUInt32BE(offset); - offset += 4; - message.gameBlob = getLenBlob(data, offset, false); - offset += message.gameBlob.length + 2; - message.personalBlob = getLenBlob(data, offset, false); - offset += message.personalBlob.length + 2; - message.pictureBlob = data.subarray(offset, offset + 1); - offset += message.pictureBlob.length; - message.dnd = getShortBool(data, offset); - offset += 2; - message.gameStartStamp = data.readUInt32BE(offset); - offset += 4; - message.currentKey = getLenString(data, offset, false); - offset += message.currentKey.length + 2; - message.profileLevel = data.readUInt16BE(offset); - offset += 2; - message.shardId = data.readUInt32BE(offset); + static fromBytes(data: Buffer): GameProfile { + const message = new GameProfile(); + let offset = 0; + message.customerId = data.readUInt32BE(offset); + offset += 4; + message.profileName = getLenString(data, offset, false); + offset += message.profileName.length + 2; + message.serverId = data.readUInt32BE(offset); + offset += 4; + message.createStamp = data.readUInt32BE(offset); + offset += 4; + message.lastLoginStamp = data.readUInt32BE(offset); + offset += 4; + message.numberGames = data.readUInt32BE(offset); + offset += 4; + message.profileId = data.readUInt32BE(offset); + offset += 4; + message.isOnline = getShortBool(data, offset); + offset += 2; + message.gamePurchaseStamp = data.readUInt32BE(offset); + offset += 4; + message.gameSerialNumber = getLenString(data, offset, false); + offset += message.gameSerialNumber.length + 2; + message.timeOnline = data.readUInt32BE(offset); + offset += 4; + message.timeInGame = data.readUInt32BE(offset); + offset += 4; + message.gameBlob = getLenBlob(data, offset, false); + offset += message.gameBlob.length + 2; + message.personalBlob = getLenBlob(data, offset, false); + offset += message.personalBlob.length + 2; + message.pictureBlob = data.subarray(offset, offset + 1); + offset += message.pictureBlob.length; + message.dnd = getShortBool(data, offset); + offset += 2; + message.gameStartStamp = data.readUInt32BE(offset); + offset += 4; + message.currentKey = getLenString(data, offset, false); + offset += message.currentKey.length + 2; + message.profileLevel = data.readUInt16BE(offset); + offset += 2; + message.shardId = data.readUInt32BE(offset); - return message; - } + return message; + } - toBytes(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - let offset = 0; - buffer.writeUInt32BE(this.customerId, offset); - offset += 4; // offset is now 4 - buffer.writeUInt16BE(3341, offset); - offset += 2; // offset is now 6 - buffer.writeUInt32BE(this.profileId, offset); - offset += 4; // offset is now 10 - buffer.writeUInt32BE(this.shardId, offset); - offset += 4; // offset is now 14 - offset += 2; // offset is now 16 - putLenString(buffer, offset, this.profileName, false); + toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); + offset += 4; // offset is now 4 + buffer.writeUInt16BE(3341, offset); + offset += 2; // offset is now 6 + buffer.writeUInt32BE(this.profileId, offset); + offset += 4; // offset is now 10 + buffer.writeUInt32BE(this.shardId, offset); + offset += 4; // offset is now 14 + offset += 2; // offset is now 16 + putLenString(buffer, offset, this.profileName, false); - // buffer.writeUInt32BE(this.serverId, offset); - // offset += this.profileName.length + 2; - // buffer.writeUInt32BE(this.createStamp, offset); - // offset += 4; - // buffer.writeUInt32BE(this.lastLoginStamp, offset); - // offset += 4; - // buffer.writeUInt32BE(this.numberGames, offset); - // offset += 4; - // putShortBool(buffer, offset, this.isOnline); - // offset += 2; - // buffer.writeUInt32BE(this.gamePurchaseStamp, offset); - // offset += 4; - // putLenString(buffer, offset, this.gameSerialNumber, false); - // offset += this.gameSerialNumber.length + 2; - // buffer.writeUInt32BE(this.timeOnline, offset); - // offset += 4; - // buffer.writeUInt32BE(this.timeInGame, offset); - // offset += 4; - // putLenBlob(buffer, offset, this.gameBlob, false); - // offset += this.gameBlob.length + 2; - // putLenBlob(buffer, offset, this.personalBlob, false); - // offset += this.personalBlob.length + 2; - // this.pictureBlob.copy(buffer, offset, 0, 1); - // offset += 1; - // putShortBool(buffer, offset, this.dnd); - // offset += 2; - // buffer.writeUInt32BE(this.gameStartStamp, offset); - // offset += 4; - // putLenString(buffer, offset, this.currentKey, false); - // offset += this.currentKey.length + 2; - // buffer.writeUInt16BE(this.profileLevel, offset); - // offset += 2; - return buffer; - } - toString(): string { - return `GameProfile: + // buffer.writeUInt32BE(this.serverId, offset); + // offset += this.profileName.length + 2; + // buffer.writeUInt32BE(this.createStamp, offset); + // offset += 4; + // buffer.writeUInt32BE(this.lastLoginStamp, offset); + // offset += 4; + // buffer.writeUInt32BE(this.numberGames, offset); + // offset += 4; + // putShortBool(buffer, offset, this.isOnline); + // offset += 2; + // buffer.writeUInt32BE(this.gamePurchaseStamp, offset); + // offset += 4; + // putLenString(buffer, offset, this.gameSerialNumber, false); + // offset += this.gameSerialNumber.length + 2; + // buffer.writeUInt32BE(this.timeOnline, offset); + // offset += 4; + // buffer.writeUInt32BE(this.timeInGame, offset); + // offset += 4; + // putLenBlob(buffer, offset, this.gameBlob, false); + // offset += this.gameBlob.length + 2; + // putLenBlob(buffer, offset, this.personalBlob, false); + // offset += this.personalBlob.length + 2; + // this.pictureBlob.copy(buffer, offset, 0, 1); + // offset += 1; + // putShortBool(buffer, offset, this.dnd); + // offset += 2; + // buffer.writeUInt32BE(this.gameStartStamp, offset); + // offset += 4; + // putLenString(buffer, offset, this.currentKey, false); + // offset += this.currentKey.length + 2; + // buffer.writeUInt16BE(this.profileLevel, offset); + // offset += 2; + return buffer; + } + toString(): string { + return `GameProfile: customerID: ${this.customerId} profileName: ${this.profileName} serverId: ${this.serverId} @@ -182,17 +182,12 @@ export class GameProfile implements ISerializable { profileLevel: ${this.profileLevel} shardId: ${this.shardId} `; - } - toHex(): string { - return getAsHex(this.toBytes()); - } - setData(): void { - throw new Error("Method not implemented."); - } - getData(): Buffer { - throw new Error("Method not implemented."); - } - getSize(): number { - return 52; - } + } + toHex(): string { + return getAsHex(this.toBytes()); + } + + getSize(): number { + return 52; + } } diff --git a/packages/nps/messageStructs/MiniRiffList.ts b/packages/nps/messageStructs/MiniRiffList.ts index e4de5b79f..6a0724efa 100644 --- a/packages/nps/messageStructs/MiniRiffList.ts +++ b/packages/nps/messageStructs/MiniRiffList.ts @@ -1,100 +1,96 @@ -import type { ISerializable } from 'rusty-motors-nps'; -import { putLenString } from 'rusty-motors-nps'; -import { NPSList } from './NPSList.js'; +import type { ISerializable } from "rusty-motors-nps"; +import { putLenString } from "rusty-motors-nps"; +import { NPSList } from "./NPSList.js"; -import { getServerLogger } from 'rusty-motors-shared'; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); const channelRecordSize = 40; export class MiniRiffInfo implements ISerializable { - riffName: string; // 32 bytes - max length - riffId: number; // 4 bytes - population: number; // 2 bytes + riffName: string; // 32 bytes - max length + riffId: number; // 4 bytes + population: number; // 2 bytes - constructor(riffName: string, riffId: number, population: number) { - if (riffName.length > 32) { - throw new Error(`Riff name too long: ${riffName}`); - } + constructor(riffName: string, riffId: number, population: number) { + if (riffName.length > 32) { + throw new Error(`Riff name too long: ${riffName}`); + } - this.riffName = riffName; - this.riffId = riffId; - this.population = population; - } + this.riffName = riffName; + this.riffId = riffId; + this.population = population; + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - putLenString(buffer, offset, this.riffName, false); - offset += 2 + this.riffName.length + 1; - buffer.writeUInt32BE(this.riffId, offset); - offset += 4; - buffer.writeUInt16BE(this.population, offset); - log.debug( - `MiniRiffInfo: ${this.toString()} - ${buffer.toString('hex')}` - ); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error('Method not implemented.'); - } - getByteSize(): number { - return 4 + this.riffName.length + 1 + 4 + 2; - } - toString(): string { - return `MiniRiffInfo(riffName=${this.riffName}, riffId=${this.riffId}, population=${this.population})`; - } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + putLenString(buffer, offset, this.riffName, false); + offset += 2 + this.riffName.length + 1; + buffer.writeUInt32BE(this.riffId, offset); + offset += 4; + buffer.writeUInt16BE(this.population, offset); + log.debug(`MiniRiffInfo: ${this.toString()} - ${buffer.toString("hex")}`); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return 4 + this.riffName.length + 1 + 4 + 2; + } + toString(): string { + return `MiniRiffInfo(riffName=${this.riffName}, riffId=${this.riffId}, population=${this.population})`; + } } export class MiniRiffList extends NPSList implements ISerializable { - override serialize(): Buffer { - return this.toBytes(); - } - override deserialize(data: Buffer): void { - throw new Error('Method not implemented.'); - } - override getByteSize(): number { - return this.getSize(); - } - private riffs: MiniRiffInfo[] = []; + override serialize(): Buffer { + return this.toBytes(); + } + override deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + override getByteSize(): number { + return this.getSize(); + } + private riffs: MiniRiffInfo[] = []; - getMaxRiffs(): number { - return this.riffs.length; - } + getMaxRiffs(): number { + return this.riffs.length; + } - addRiff(riff: MiniRiffInfo): void { - this.riffs.push(riff); - } + addRiff(riff: MiniRiffInfo): void { + this.riffs.push(riff); + } - override toBytes(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - let offset = 0; - buffer.writeUInt32BE(this.riffs.length, offset); - offset += 4; - for (const riff of this.riffs) { - const riffBuffer = riff.serialize(); - riffBuffer.copy(buffer, offset); - offset += riff.getByteSize(); - } + override toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this.riffs.length, offset); + offset += 4; + for (const riff of this.riffs) { + const riffBuffer = riff.serialize(); + riffBuffer.copy(buffer, offset); + offset += riff.getByteSize(); + } - log.debug( - `MiniRiffList: ${this.toString()} - ${buffer.toString('hex')}` - ); - return buffer; - } - override toString(): string { - return `MiniRiffList(riffs=${this.riffs})`; - } - override toHex(): string { - return this.toBytes().toString('hex'); - } + log.debug(`MiniRiffList: ${this.toString()} - ${buffer.toString("hex")}`); + return buffer; + } + override toString(): string { + return `MiniRiffList(riffs=${this.riffs})`; + } + override toHex(): string { + return this.toBytes().toString("hex"); + } - override getSize(): number { - let size = 4; - for (const riff of this.riffs) { - size += riff.getByteSize(); - } - return size; - } + override getSize(): number { + let size = 4; + for (const riff of this.riffs) { + size += riff.getByteSize(); + } + return size; + } } diff --git a/packages/nps/messageStructs/MiniUserList.ts b/packages/nps/messageStructs/MiniUserList.ts index 41c56b150..af8fcb839 100644 --- a/packages/nps/messageStructs/MiniUserList.ts +++ b/packages/nps/messageStructs/MiniUserList.ts @@ -2,73 +2,72 @@ import type { ISerializable } from "rusty-motors-nps"; import { putLenString } from "rusty-motors-nps"; export class MiniUserInfo implements ISerializable { - userId: number; // 4 bytes - userName: string; // 32 bytes - max length + userId: number; // 4 bytes + userName: string; // 32 bytes - max length - constructor(userId: number, userName: string) { - if (userName.length > 32) { - throw new Error(`User name too long: ${userName}`); - } + constructor(userId: number, userName: string) { + if (userName.length > 32) { + throw new Error(`User name too long: ${userName}`); + } - this.userId = userId; - this.userName = userName; - } + this.userId = userId; + this.userName = userName; + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeUInt32BE(this.userId, offset); - offset += 4; - putLenString(buffer, offset, this.userName, false); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return 4 + 4 + this.userName.length + 1; - } - toString(): string { - return `MiniUserInfo(userId=${this.userId}, userName=${this.userName})`; - } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.userId, offset); + offset += 4; + putLenString(buffer, offset, this.userName, false); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return 4 + 4 + this.userName.length + 1; + } + toString(): string { + return `MiniUserInfo(userId=${this.userId}, userName=${this.userName})`; + } } export class MiniUserList implements ISerializable { - private channelId: number; // 4 bytes - private channelUsers: MiniUserInfo[] = []; + private channelId: number; // 4 bytes + private channelUsers: MiniUserInfo[] = []; - constructor(channelId: number) { - this.channelId = channelId; - } + constructor(channelId: number) { + this.channelId = channelId; + } - addChannelUser(user: MiniUserInfo): void { - this.channelUsers.push(user); - } + addChannelUser(user: MiniUserInfo): void { + this.channelUsers.push(user); + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeUInt32BE(this.channelId, offset); - offset += 4; - buffer.writeUInt32BE(this.channelUsers.length, offset); - offset += 4; - this.channelUsers.forEach((user) => { - const userBuffer = user.serialize(); - userBuffer.copy(buffer, offset); - offset += userBuffer.length; - }); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return ( - 16 + - this.channelUsers.reduce((acc, user) => acc + user.getByteSize(), 0) - ); - } - toString(): string { - return `MiniUserList(channelId=${this.channelId}, channelUsers=${this.channelUsers})`; - } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.channelId, offset); + offset += 4; + buffer.writeUInt32BE(this.channelUsers.length, offset); + offset += 4; + this.channelUsers.forEach((user) => { + const userBuffer = user.serialize(); + userBuffer.copy(buffer, offset); + offset += userBuffer.length; + }); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return ( + 16 + this.channelUsers.reduce((acc, user) => acc + user.getByteSize(), 0) + ); + } + toString(): string { + return `MiniUserList(channelId=${this.channelId}, channelUsers=${this.channelUsers})`; + } } diff --git a/packages/nps/messageStructs/NPSList.ts b/packages/nps/messageStructs/NPSList.ts index 268011d4a..c4d86c1bd 100644 --- a/packages/nps/messageStructs/NPSList.ts +++ b/packages/nps/messageStructs/NPSList.ts @@ -1,34 +1,34 @@ -import type { ISerializable, IMessage } from "rusty-motors-nps"; +import type { IMessage, ISerializable } from "rusty-motors-nps"; export class NPSList implements ISerializable { - serialize(): Buffer { - throw new Error("Method not implemented."); - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - throw new Error("Method not implemented."); - } - private list: IMessage[] = []; + serialize(): Buffer { + throw new Error("Method not implemented."); + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + private list: IMessage[] = []; - toBytes(): Buffer { - throw new Error("Method not implemented."); - } - toString(): string { - throw new Error("Method not implemented."); - } - toHex(): string { - throw new Error("Method not implemented."); - } - setData(data: Buffer): void { - throw new Error("Method not implemented."); - } - getData(): Buffer { - throw new Error("Method not implemented."); - } + toBytes(): Buffer { + throw new Error("Method not implemented."); + } + toString(): string { + throw new Error("Method not implemented."); + } + toHex(): string { + throw new Error("Method not implemented."); + } + setData(data: Buffer): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } - getSize(): number { - return 0; - } + getSize(): number { + return 0; + } } diff --git a/packages/nps/messageStructs/ProfileList.ts b/packages/nps/messageStructs/ProfileList.ts index 4a5d6ce02..a1d84f0a7 100644 --- a/packages/nps/messageStructs/ProfileList.ts +++ b/packages/nps/messageStructs/ProfileList.ts @@ -1,59 +1,47 @@ -import type { ISerializable } from 'rusty-motors-nps'; -import { GameProfile } from './GameProfile.js'; -import { NPSList } from './NPSList.js'; +import type { ISerializable } from "rusty-motors-nps"; +import { GameProfile } from "./GameProfile.js"; +import { NPSList } from "./NPSList.js"; export class ProfileList extends NPSList implements ISerializable { - override serialize(): Buffer { - return this.toBytes(); - } - override deserialize(data: Buffer): void { - throw new Error('Method not implemented.'); - } - override getByteSize(): number { - return this.getSize(); - } - maxProfiles = 0; // 1 byte - private profiles: GameProfile[] = []; + override serialize(): Buffer { + return this.toBytes(); + } + override getByteSize(): number { + return this.getSize(); + } + maxProfiles = 0; // 1 byte + private profiles: GameProfile[] = []; - getMaxProfiles(): number { - return this.maxProfiles; - } + getMaxProfiles(): number { + return this.maxProfiles; + } - addProfile(profile: GameProfile): void { - this.profiles.push(profile); - this.maxProfiles = this.profiles.length; - } + addProfile(profile: GameProfile): void { + this.profiles.push(profile); + this.maxProfiles = this.profiles.length; + } - override toBytes(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - let offset = 0; - buffer.writeUInt16BE(this.maxProfiles, offset); - offset += 2; - for (const profile of this.profiles) { - const profileBuffer = profile.toBytes(); - profileBuffer.copy(buffer, offset); - offset += profile.getSize(); - } - return buffer; - } - override toString(): string { - return `ProfileList(maxProfiles=${this.maxProfiles}, profiles=${this.profiles})`; - } - override toHex(): string { - throw new Error('Method not implemented.'); - } - override setData(data: Buffer): void { - throw new Error('Method not implemented.'); - } - override getData(): Buffer { - throw new Error('Method not implemented.'); - } + override toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt16BE(this.maxProfiles, offset); + offset += 2; + for (const profile of this.profiles) { + const profileBuffer = profile.toBytes(); + profileBuffer.copy(buffer, offset); + offset += profile.getSize(); + } + return buffer; + } + override toString(): string { + return `ProfileList(maxProfiles=${this.maxProfiles}, profiles=${this.profiles})`; + } - override getSize(): number { - let size = 4; - for (const profile of this.profiles) { - size += profile.getSize(); - } - return size; - } + override getSize(): number { + let size = 4; + for (const profile of this.profiles) { + size += profile.getSize(); + } + return size; + } } diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts index ba53e0b1a..9382b95e5 100644 --- a/packages/nps/messageStructs/SessionKey.ts +++ b/packages/nps/messageStructs/SessionKey.ts @@ -1,113 +1,111 @@ -import type { ISerializable } from 'rusty-motors-nps'; -import { getAsHex, isOnlyOneSet } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { ISerializable } from "rusty-motors-nps"; +import { getAsHex, isOnlyOneSet } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export class SessionKey implements ISerializable { - private key: Buffer = Buffer.alloc(0); - private timestamp: number = 0; - private _isSet: boolean = false; - - constructor({ key, timestamp }: { key?: Buffer; timestamp?: number }) { - log.setName('SessionKey'); - if (isOnlyOneSet(key, timestamp)) { - throw new Error('Both key and timestamp must be set if one is set'); - } - - if (typeof key !== 'undefined' && typeof timestamp !== 'undefined') { - log.debug( - `SessionKey: key=${getAsHex(key)}, timestamp=${timestamp}` - ); - this.key = key; - this.timestamp = timestamp; - this._isSet = true; - } - log.resetName(); - } - serialize(): Buffer { - return this.toBytes(); - } - deserialize(data: Buffer): void { - SessionKey.fromBytes(data); - } - getByteSize(): number { - throw new Error('Method not implemented.'); - } - - static fromBytes(bytes: Buffer): SessionKey { - log.setName('SessionKey.fromBytes'); - const keyLength = bytes.readUInt16BE(0); - - // Set the data offset - const dataOffset = 2 + keyLength; - - const key = bytes.subarray(2, dataOffset); - - log.debug(`SessionKey.fromBytes: key=${getAsHex(key)}`); - - // Get the timestamp - const timestamp = bytes.readUInt32BE(dataOffset); - - log.resetName(); - - return new SessionKey({ - key, - timestamp, - }); - } - - static fromKeyString(key: string): SessionKey { - const keyBuffer = Buffer.from(key, 'hex'); - - return new SessionKey({ - key: keyBuffer, - timestamp: 0, - }); - } - - getKey(): string { - return this.key.toString('hex'); - } - - toString(): string { - return `SessionKey(key=${this.getKey()}, timestamp=${this.timestamp})`; - } - - toHex(): string { - return getAsHex(this.toBytes()); - } - - toBytes(): Buffer { - if (!this.isSet()) { - throw new Error('Session key is not set'); - } - - const keyLength = this.key.length; - const timestamp = this.timestamp; - - const buffer = Buffer.alloc(2 + keyLength + 4); - - buffer.writeUInt16BE(keyLength, 0); - this.key.copy(buffer, 2); - buffer.writeUInt32BE(timestamp, 2 + keyLength); - - return buffer; - } - - getSize(): number { - return this.key.length + 6; - } - - getData(): Buffer { - throw new Error('Method not implemented.'); - } - - setData(): void { - throw new Error('Method not implemented.'); - } - - isSet(): boolean { - return this._isSet; - } + private key: Buffer = Buffer.alloc(0); + private timestamp: number = 0; + private _isSet: boolean = false; + + constructor({ key, timestamp }: { key?: Buffer; timestamp?: number }) { + log.setName("SessionKey"); + if (isOnlyOneSet(key, timestamp)) { + throw new Error("Both key and timestamp must be set if one is set"); + } + + if (typeof key !== "undefined" && typeof timestamp !== "undefined") { + log.debug(`SessionKey: key=${getAsHex(key)}, timestamp=${timestamp}`); + this.key = key; + this.timestamp = timestamp; + this._isSet = true; + } + log.resetName(); + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(data: Buffer): void { + SessionKey.fromBytes(data); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + + static fromBytes(bytes: Buffer): SessionKey { + log.setName("SessionKey.fromBytes"); + const keyLength = bytes.readUInt16BE(0); + + // Set the data offset + const dataOffset = 2 + keyLength; + + const key = bytes.subarray(2, dataOffset); + + log.debug(`SessionKey.fromBytes: key=${getAsHex(key)}`); + + // Get the timestamp + const timestamp = bytes.readUInt32BE(dataOffset); + + log.resetName(); + + return new SessionKey({ + key, + timestamp, + }); + } + + static fromKeyString(key: string): SessionKey { + const keyBuffer = Buffer.from(key, "hex"); + + return new SessionKey({ + key: keyBuffer, + timestamp: 0, + }); + } + + getKey(): string { + return this.key.toString("hex"); + } + + toString(): string { + return `SessionKey(key=${this.getKey()}, timestamp=${this.timestamp})`; + } + + toHex(): string { + return getAsHex(this.toBytes()); + } + + toBytes(): Buffer { + if (!this.isSet()) { + throw new Error("Session key is not set"); + } + + const keyLength = this.key.length; + const timestamp = this.timestamp; + + const buffer = Buffer.alloc(2 + keyLength + 4); + + buffer.writeUInt16BE(keyLength, 0); + this.key.copy(buffer, 2); + buffer.writeUInt32BE(timestamp, 2 + keyLength); + + return buffer; + } + + getSize(): number { + return this.key.length + 6; + } + + getData(): Buffer { + throw new Error("Method not implemented."); + } + + setData(): void { + throw new Error("Method not implemented."); + } + + isSet(): boolean { + return this._isSet; + } } diff --git a/packages/nps/messageStructs/UserAction.ts b/packages/nps/messageStructs/UserAction.ts index 7c218f04a..894683952 100644 --- a/packages/nps/messageStructs/UserAction.ts +++ b/packages/nps/messageStructs/UserAction.ts @@ -1,133 +1,133 @@ -import type { ISerializable } from 'rusty-motors-nps'; -import { getAsHex } from 'rusty-motors-nps'; -import { getServerLogger } from 'rusty-motors-shared'; +import type { ISerializable } from "rusty-motors-nps"; +import { getAsHex } from "rusty-motors-nps"; +import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export class UserAction implements ISerializable { - private name: string; - private _endTimeMaybe = 0; // 4 bytes - private _b1 = 0; // 1 byte - private _b2 = 0; // 1 byte - private _initiator = ''; // 64 bytes - private _startComment = ''; // 256 bytes - private _endComment = ''; // 256 bytes + private name: string; + private _endTimeMaybe = 0; // 4 bytes + private _b1 = 0; // 1 byte + private _b2 = 0; // 1 byte + private _initiator = ""; // 64 bytes + private _startComment = ""; // 256 bytes + private _endComment = ""; // 256 bytes - constructor(name: string) { - this.name = name; - } + constructor(name: string) { + this.name = name; + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - let offset = 0; - buffer.writeUInt32BE(this._endTimeMaybe, offset); - offset += 4; - buffer.writeUInt8(this._b1, offset); - offset += 1; - buffer.writeUInt8(this._b2, offset); - offset += 1; - buffer.write(this._initiator, offset, 0x40, 'utf8'); - offset += 0x40; - buffer.write(this._startComment, offset, 0x100, 'utf8'); - offset += 0x100; - buffer.write(this._endComment, offset, 0x100, 'utf8'); + serialize(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this._endTimeMaybe, offset); + offset += 4; + buffer.writeUInt8(this._b1, offset); + offset += 1; + buffer.writeUInt8(this._b2, offset); + offset += 1; + buffer.write(this._initiator, offset, 0x40, "utf8"); + offset += 0x40; + buffer.write(this._startComment, offset, 0x100, "utf8"); + offset += 0x100; + buffer.write(this._endComment, offset, 0x100, "utf8"); - return buffer; - } - deserialize(data: Buffer): void { - try { - this._endTimeMaybe = data.readUInt32BE(0); - this._b1 = data.readUInt8(4); - this._b2 = data.readUInt8(5); - this._initiator = data.toString('utf8', 6, 0x46); - this._startComment = data.toString('utf8', 0x46, 0x146); - this._endComment = data.toString('utf8', 0x146, 0x246); - } catch (error) { - log.error(`Error deserializing UserAction: ${error as string}`); - throw error; - } - } - getByteSize(): number { - throw new Error('Method not implemented.'); - } - setData(): void { - throw new Error('Method not implemented.'); - } - getData(): Buffer { - throw new Error('Method not implemented.'); - } + return buffer; + } + deserialize(data: Buffer): void { + try { + this._endTimeMaybe = data.readUInt32BE(0); + this._b1 = data.readUInt8(4); + this._b2 = data.readUInt8(5); + this._initiator = data.toString("utf8", 6, 0x46); + this._startComment = data.toString("utf8", 0x46, 0x146); + this._endComment = data.toString("utf8", 0x146, 0x246); + } catch (error) { + log.error(`Error deserializing UserAction: ${error as string}`); + throw error; + } + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + setData(): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } - static fromBytes(name: string, bytes: Buffer): UserAction { - const userAction = new UserAction(name); - userAction.deserialize(bytes); + static fromBytes(name: string, bytes: Buffer): UserAction { + const userAction = new UserAction(name); + userAction.deserialize(bytes); - return userAction; - } + return userAction; + } - toBytes(): Buffer { - return this.serialize(); - } - toString(): string { - return `UserAction: ${this.name} - ${this._initiator} - ${this._startComment} - ${this._endComment}`; - } - toHex(): string { - return getAsHex(this.serialize()); - } + toBytes(): Buffer { + return this.serialize(); + } + toString(): string { + return `UserAction: ${this.name} - ${this._initiator} - ${this._startComment} - ${this._endComment}`; + } + toHex(): string { + return getAsHex(this.serialize()); + } - getSize(): number { - return 4 + 1 + 1 + 0x40 + 0x100 + 0x100; - } + getSize(): number { + return 4 + 1 + 1 + 0x40 + 0x100 + 0x100; + } - public set({ - endTimeMaybe, - b1, - b2, - initiator, - startComment, - endComment, - }: { - endTimeMaybe?: number; - b1?: number; - b2?: number; - initiator: string; - startComment: string; - endComment?: string; - }): void { - this._endTimeMaybe = endTimeMaybe || 0; - this._b1 = b1 || 0; - this._b2 = b2 || 0; - this._initiator = initiator; - this._startComment = startComment; - this._endComment = endComment || ''; - } + public set({ + endTimeMaybe, + b1, + b2, + initiator, + startComment, + endComment, + }: { + endTimeMaybe?: number; + b1?: number; + b2?: number; + initiator: string; + startComment: string; + endComment?: string; + }): void { + this._endTimeMaybe = endTimeMaybe || 0; + this._b1 = b1 || 0; + this._b2 = b2 || 0; + this._initiator = initiator; + this._startComment = startComment; + this._endComment = endComment || ""; + } - public clear(): void { - this._endTimeMaybe = 0; - this._b1 = 0; - this._b2 = 0; - this._initiator = ''; - this._startComment = ''; - this._endComment = ''; - } + public clear(): void { + this._endTimeMaybe = 0; + this._b1 = 0; + this._b2 = 0; + this._initiator = ""; + this._startComment = ""; + this._endComment = ""; + } - updateEmptyValuesFrom(other: UserAction) { - if (this._endTimeMaybe === 0) { - this._endTimeMaybe = other._endTimeMaybe; - } - if (this._b1 === 0) { - this._b1 = other._b1; - } - if (this._b2 === 0) { - this._b2 = other._b2; - } - if (this._initiator === '') { - this._initiator = other._initiator; - } - if (this._startComment === '') { - this._startComment = other._startComment; - } - if (this._endComment === '') { - this._endComment = other._endComment; - } - } + updateEmptyValuesFrom(other: UserAction) { + if (this._endTimeMaybe === 0) { + this._endTimeMaybe = other._endTimeMaybe; + } + if (this._b1 === 0) { + this._b1 = other._b1; + } + if (this._b2 === 0) { + this._b2 = other._b2; + } + if (this._initiator === "") { + this._initiator = other._initiator; + } + if (this._startComment === "") { + this._startComment = other._startComment; + } + if (this._endComment === "") { + this._endComment = other._endComment; + } + } } diff --git a/packages/nps/messageStructs/UserInfo.ts b/packages/nps/messageStructs/UserInfo.ts index 308dc5cad..ae55e5855 100644 --- a/packages/nps/messageStructs/UserInfo.ts +++ b/packages/nps/messageStructs/UserInfo.ts @@ -1,46 +1,46 @@ import type { ISerializable } from "rusty-motors-nps"; export class UserInfo implements ISerializable { - private profileId: number; // 4 bytes - private profileName: string; // 32 bytes - max length - private userData; // 64 bytes + private profileId: number; // 4 bytes + private profileName: string; // 32 bytes - max length + private userData; // 64 bytes - constructor(id: number, name: string) { - if (name.length > 31) { - throw new Error( - `Profile name too long: ${name}, max length is 31, got ${name.length}`, - ); - } - this.profileId = id; - this.profileName = name; - this.userData = Buffer.alloc(64); - } + constructor(id: number, name: string) { + if (name.length > 31) { + throw new Error( + `Profile name too long: ${name}, max length is 31, got ${name.length}`, + ); + } + this.profileId = id; + this.profileName = name; + this.userData = Buffer.alloc(64); + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeInt32BE(this.profileId, offset); - offset += 4; - buffer.writeUInt16BE(this.profileName.length, offset); - offset += 2; - buffer.write( - `${this.profileName}\0`, - offset, - this.profileName.length + 1, - "utf8", - ); - offset += this.profileName.length + 1; - this.userData.copy(buffer, offset); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return 4 + 2 + this.profileName.length + 1 + 64; - } - toString(): string { - return `Profile ID: ${this.profileId}, + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeInt32BE(this.profileId, offset); + offset += 4; + buffer.writeUInt16BE(this.profileName.length, offset); + offset += 2; + buffer.write( + `${this.profileName}\0`, + offset, + this.profileName.length + 1, + "utf8", + ); + offset += this.profileName.length + 1; + this.userData.copy(buffer, offset); + return buffer; + } + deserialize(data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return 4 + 2 + this.profileName.length + 1 + 64; + } + toString(): string { + return `Profile ID: ${this.profileId}, Profile Name: ${this.profileName}`; - } + } } diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts index 9dd3157d1..5ffcf5548 100644 --- a/packages/nps/messageStructs/UserStatus.ts +++ b/packages/nps/messageStructs/UserStatus.ts @@ -4,175 +4,172 @@ import { SessionKey } from "./SessionKey.js"; import { UserAction } from "./UserAction.js"; export class UserStatus implements ISerializable { - private _sessionId: string = ""; - private _remoteIp: string = ""; - private _machineId: string = ""; - private customerId: number = 0; - private personaId: number = 0; - private isCacheHit: boolean = false; - readonly ban: UserAction = new UserAction("ban"); - readonly gag: UserAction = new UserAction("gag"); - private sessionKey: SessionKey = new SessionKey({}); - - constructor({ - customerId, - personaId, - sessionKey, - }: { - customerId: number; - personaId?: number; - sessionKey?: SessionKey; - - }) { - this._sessionId = randomUUID(); - this.customerId = customerId; - this.personaId = personaId || 0; - this.isCacheHit = false; - this.ban = new UserAction("ban"); - this.gag = new UserAction("gag"); - this.sessionKey = sessionKey || new SessionKey({}); - } - serialize(): Buffer { - return this.toBytes(); - } - deserialize(): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return this.getSize(); - } - - getSessionId(): string { - return this._sessionId; - } - - getRemoteIp(): string { - return this._remoteIp; - } - - setRemoteIp(value: string) { - if (this._remoteIp !== "" && this._remoteIp !== value) { - throw new Error("Remote IP is already set and cannot be changed"); - } - this._remoteIp = value; - } - - getMachineId(): string { - return this._machineId; - } - - setMachineId(value: string) { - if (this._machineId !== "" && this._machineId !== value) { - throw new Error("Machine ID is already set and cannot be changed"); - } - this._machineId = value; - } - - static new(): UserStatus { - return new UserStatus({ - customerId: 0, - }); - - } - - static fromBytes(bytes: Buffer): UserStatus { - let offset = 0; - const customerId = bytes.readUInt32BE(offset); - offset += 4; - const personaId = bytes.readUInt32BE(offset); - offset += 4; - // Skip isCacheHit - offset += 1; - const ban = UserAction.fromBytes("ban", bytes.subarray(offset)); - offset += ban.getSize(); - const gag = UserAction.fromBytes("gag", bytes.subarray(offset)); - offset += gag.getSize(); - const sessionKey = SessionKey.fromBytes(bytes.subarray(offset)); - - return new UserStatus({ - customerId, - personaId, - sessionKey, - - }); - } - - toBytes(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - - if (this.sessionKey === null) { - throw new Error("Session key is required"); - } - - let offset = 0; - buffer.writeUInt32BE(this.customerId, offset); - offset += 4; - buffer.writeUInt32BE(this.personaId, offset); - offset += 4; - buffer.writeUInt8(this.isCacheHit ? 1 : 0, offset); - offset += 1; - this.ban.toBytes().copy(buffer, offset); - offset += this.ban.getSize(); - this.gag.toBytes().copy(buffer, offset); - offset += this.gag.getSize(); - this.sessionKey.toBytes().copy(buffer, offset); - offset += this.sessionKey.getSize(); - - return buffer; - } - - getSize(): number { - return ( - 4 + - 4 + - 1 + - this.ban.getSize() + - this.gag.getSize() + - this.sessionKey.getSize() + - 4 + - 64 - ); - } - - getCustomerId(): number { - return this.customerId; - } - - setCustomerId(customerId: number) { - this.customerId = customerId; - } - - getPersonaId(): number { - return this.personaId; - } - - setPersonaId(personaId: number) { - this.personaId = personaId; - } - - getSessionKey(): SessionKey { - return this.sessionKey; - } - - setSessionKey(sessionKey: SessionKey) { - this.sessionKey = sessionKey; - } - - toString(): string { - return `UserStatus: + private _sessionId: string = ""; + private _remoteIp: string = ""; + private _machineId: string = ""; + private customerId: number = 0; + private personaId: number = 0; + private isCacheHit: boolean = false; + readonly ban: UserAction = new UserAction("ban"); + readonly gag: UserAction = new UserAction("gag"); + private sessionKey: SessionKey = new SessionKey({}); + + constructor({ + customerId, + personaId, + sessionKey, + }: { + customerId: number; + personaId?: number; + sessionKey?: SessionKey; + }) { + this._sessionId = randomUUID(); + this.customerId = customerId; + this.personaId = personaId || 0; + this.isCacheHit = false; + this.ban = new UserAction("ban"); + this.gag = new UserAction("gag"); + this.sessionKey = sessionKey || new SessionKey({}); + } + serialize(): Buffer { + return this.toBytes(); + } + deserialize(): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + return this.getSize(); + } + + getSessionId(): string { + return this._sessionId; + } + + getRemoteIp(): string { + return this._remoteIp; + } + + setRemoteIp(value: string) { + if (this._remoteIp !== "" && this._remoteIp !== value) { + throw new Error("Remote IP is already set and cannot be changed"); + } + this._remoteIp = value; + } + + getMachineId(): string { + return this._machineId; + } + + setMachineId(value: string) { + if (this._machineId !== "" && this._machineId !== value) { + throw new Error("Machine ID is already set and cannot be changed"); + } + this._machineId = value; + } + + static new(): UserStatus { + return new UserStatus({ + customerId: 0, + }); + } + + static fromBytes(bytes: Buffer): UserStatus { + let offset = 0; + const customerId = bytes.readUInt32BE(offset); + offset += 4; + const personaId = bytes.readUInt32BE(offset); + offset += 4; + // Skip isCacheHit + offset += 1; + const ban = UserAction.fromBytes("ban", bytes.subarray(offset)); + offset += ban.getSize(); + const gag = UserAction.fromBytes("gag", bytes.subarray(offset)); + offset += gag.getSize(); + const sessionKey = SessionKey.fromBytes(bytes.subarray(offset)); + + return new UserStatus({ + customerId, + personaId, + sessionKey, + }); + } + + toBytes(): Buffer { + const buffer = Buffer.alloc(this.getSize()); + + if (this.sessionKey === null) { + throw new Error("Session key is required"); + } + + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); + offset += 4; + buffer.writeUInt32BE(this.personaId, offset); + offset += 4; + buffer.writeUInt8(this.isCacheHit ? 1 : 0, offset); + offset += 1; + this.ban.toBytes().copy(buffer, offset); + offset += this.ban.getSize(); + this.gag.toBytes().copy(buffer, offset); + offset += this.gag.getSize(); + this.sessionKey.toBytes().copy(buffer, offset); + offset += this.sessionKey.getSize(); + + return buffer; + } + + getSize(): number { + return ( + 4 + + 4 + + 1 + + this.ban.getSize() + + this.gag.getSize() + + this.sessionKey.getSize() + + 4 + + 64 + ); + } + + getCustomerId(): number { + return this.customerId; + } + + setCustomerId(customerId: number) { + this.customerId = customerId; + } + + getPersonaId(): number { + return this.personaId; + } + + setPersonaId(personaId: number) { + this.personaId = personaId; + } + + getSessionKey(): SessionKey { + return this.sessionKey; + } + + setSessionKey(sessionKey: SessionKey) { + this.sessionKey = sessionKey; + } + + toString(): string { + return `UserStatus: Customer ID: ${this.customerId} Persona ID: ${this.personaId} Is Cache Hit: ${this.isCacheHit} Ban: ${this.ban.toString()} Gag: ${this.gag.toString()} Session Key: ${this.sessionKey.toString()}`; - } + } - toHex(): string { - return this.toBytes().toString("hex"); - } + toHex(): string { + return this.toBytes().toString("hex"); + } - setData() { - throw new Error("Method not implemented."); - } + setData() { + throw new Error("Method not implemented."); + } } diff --git a/packages/nps/package.json b/packages/nps/package.json index 94256f9f3..2a3a115a4 100644 --- a/packages/nps/package.json +++ b/packages/nps/package.json @@ -1,25 +1,25 @@ { - "name": "rusty-motors-nps", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@sentry/node": "^8.0.0", - "short-unique-id": "^5.0.3" - }, - "description": "" + "name": "rusty-motors-nps", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + }, + "description": "" } diff --git a/packages/nps/services/account.ts b/packages/nps/services/account.ts index 6822ae457..065991925 100644 --- a/packages/nps/services/account.ts +++ b/packages/nps/services/account.ts @@ -1,44 +1,44 @@ -import { db, LoginSchema } from 'rusty-motors-database'; -import { getServerLogger } from 'rusty-motors-shared'; -import type { DatabaseSchema } from '../../database/src/services/database'; +import { LoginSchema, db } from "rusty-motors-database"; +import { getServerLogger } from "rusty-motors-shared"; +import type { DatabaseSchema } from "../../database/src/services/database"; const log = getServerLogger(); export async function populateGameUsers(): Promise { - await LoginSchema(db).insertOrIgnore({ - customer_id: 1, - login_name: 'admin', - password: 'admin', - login_level: 1, - }); + await LoginSchema(db).insertOrIgnore({ + customer_id: 1, + login_name: "admin", + password: "admin", + login_level: 1, + }); } export async function getUser( - username: string, - password: string -): Promise { - log.setName('getUser'); + username: string, + password: string, +): Promise { + log.setName("getUser"); - log.debug(`Getting user ${username}, ${password}`); + log.debug(`Getting user ${username}, ${password}`); - const userAccount = await LoginSchema(db).findOne({ - login_name: username, - password, - }); + const userAccount = await LoginSchema(db).findOne({ + login_name: username, + password, + }); - if (!userAccount) { - log.warn(`User ${username} not found`); - } + if (!userAccount) { + log.warn(`User ${username} not found`); + } - return userAccount; + return userAccount; } export async function isSuperUser( - username: string, - password: string + username: string, + password: string, ): Promise { - const user = await getUser(username, password); - return user ? user.login_level === 1 : false; + const user = await getUser(username, password); + return user ? user.login_level === 1 : false; } // Path: packages/nps/services/account.ts diff --git a/packages/nps/services/profile.ts b/packages/nps/services/profile.ts index e6b483cb2..302e75866 100644 --- a/packages/nps/services/profile.ts +++ b/packages/nps/services/profile.ts @@ -1,74 +1,74 @@ -import { db, ProfileSchema } from 'rusty-motors-database'; -import { GameProfile } from '../messageStructs/GameProfile.js'; +import { ProfileSchema, db } from "rusty-motors-database"; +import { GameProfile } from "../messageStructs/GameProfile.js"; export const gameProfiles: GameProfile[] = []; export function getGameProfilesForCustomerId( - customerId: number + customerId: number, ): GameProfile[] { - const profiles: GameProfile[] = []; - for (const profile of gameProfiles.values()) { - if (profile.customerId === customerId) { - profiles.push(profile); - } - } - return profiles; + const profiles: GameProfile[] = []; + for (const profile of gameProfiles.values()) { + if (profile.customerId === customerId) { + profiles.push(profile); + } + } + return profiles; } export function getCustomerId(profileId: number): number { - for (const profile of gameProfiles.values()) { - if (profile.profileId === profileId) { - return profile.customerId; - } - } - return -1; + for (const profile of gameProfiles.values()) { + if (profile.profileId === profileId) { + return profile.customerId; + } + } + return -1; } export function gameProfileExists(profileName: string): boolean { - for (const profile of gameProfiles.values()) { - if (profile.profileName === profileName) { - return true; - } - } - return false; + for (const profile of gameProfiles.values()) { + if (profile.profileName === profileName) { + return true; + } + } + return false; } export async function addGameProfile(profile: GameProfile): Promise { - await ProfileSchema(db).insertOrIgnore({ - customer_id: profile.customerId, - profile_name: profile.profileName, - server_id: profile.serverId, - create_stamp: profile.createStamp, - last_login_stamp: profile.lastLoginStamp, - number_games: profile.numberGames, - profile_id: profile.profileId, - is_online: profile.isOnline, - game_purchase_stamp: profile.gamePurchaseStamp, - game_serial_number: profile.gameSerialNumber, - time_online: profile.timeOnline, - time_in_game: profile.timeInGame, - game_blob: profile.gameBlob.toString(), - personal_blob: profile.personalBlob.toString(), - picture_blob: profile.pictureBlob.toString(), - dnd: profile.dnd, - game_start_stamp: profile.gameStartStamp, - current_key: profile.currentKey, - profile_level: profile.profileLevel, - shard_id: profile.shardId, - }); + await ProfileSchema(db).insertOrIgnore({ + customer_id: profile.customerId, + profile_name: profile.profileName, + server_id: profile.serverId, + create_stamp: profile.createStamp, + last_login_stamp: profile.lastLoginStamp, + number_games: profile.numberGames, + profile_id: profile.profileId, + is_online: profile.isOnline, + game_purchase_stamp: profile.gamePurchaseStamp, + game_serial_number: profile.gameSerialNumber, + time_online: profile.timeOnline, + time_in_game: profile.timeInGame, + game_blob: profile.gameBlob.toString(), + personal_blob: profile.personalBlob.toString(), + picture_blob: profile.pictureBlob.toString(), + dnd: profile.dnd, + game_start_stamp: profile.gameStartStamp, + current_key: profile.currentKey, + profile_level: profile.profileLevel, + shard_id: profile.shardId, + }); } export function deleteGameProfile(profileId: number): void { - for (const [index, profile] of gameProfiles.entries()) { - if (profile.profileId === profileId) { - gameProfiles.splice(index, 1); - return; - } - } + for (const [index, profile] of gameProfiles.entries()) { + if (profile.profileId === profileId) { + gameProfiles.splice(index, 1); + return; + } + } } export function createGameProfile(): GameProfile { - const profile = GameProfile.new(); + const profile = GameProfile.new(); - return profile; + return profile; } diff --git a/packages/nps/services/token.ts b/packages/nps/services/token.ts index 4f6bca8db..05e1ce7be 100644 --- a/packages/nps/services/token.ts +++ b/packages/nps/services/token.ts @@ -3,66 +3,66 @@ import ShortUniqueId from "short-unique-id"; const uid = new ShortUniqueId.default(); export type TokenRecord = { - customerId: number; - token: string; + customerId: number; + token: string; }; export const activeTokens = new Map([]); export function generateTokenRecord(customerId: number): TokenRecord { - const token = uid.stamp(34); + const token = uid.stamp(34); - return { - customerId, - token, - }; + return { + customerId, + token, + }; } export function generateToken(customerId: number): string { - if (typeof customerId !== "number") { - throw new Error("Invalid customer ID"); - } - const tokenRecord = generateTokenRecord(customerId); - activeTokens.set(tokenRecord.token, tokenRecord); - return tokenRecord.token; + if (typeof customerId !== "number") { + throw new Error("Invalid customer ID"); + } + const tokenRecord = generateTokenRecord(customerId); + activeTokens.set(tokenRecord.token, tokenRecord); + return tokenRecord.token; } export function isTokenExpired(token: string): boolean { - const issuedAt = uid.parseStamp(token).getTime(); + const issuedAt = uid.parseStamp(token).getTime(); - // 30 minutes - const expirationTime = Date.now() - 1800000; + // 30 minutes + const expirationTime = Date.now() - 1800000; - if (issuedAt < expirationTime) { - return true; - } + if (issuedAt < expirationTime) { + return true; + } - return false; + return false; } export function getToken(token: string): TokenRecord | undefined { - if (activeTokens.has(token)) { - return activeTokens.get(token); - } - return undefined; + if (activeTokens.has(token)) { + return activeTokens.get(token); + } + return undefined; } export function deleteToken(token: string): void { - activeTokens.delete(token); + activeTokens.delete(token); } export function deleteExpiredTokens(): void { - for (const token of activeTokens.keys()) { - if (isTokenExpired(token)) { - deleteToken(token); - } - } + for (const token of activeTokens.keys()) { + if (isTokenExpired(token)) { + deleteToken(token); + } + } } export function getCustomerId(token: string): number | undefined { - const tokenRecord = getToken(token); - if (typeof tokenRecord !== "undefined" && !isTokenExpired(token)) { - return tokenRecord.customerId; - } - return undefined; + const tokenRecord = getToken(token); + if (typeof tokenRecord !== "undefined" && !isTokenExpired(token)) { + return tokenRecord.customerId; + } + return undefined; } diff --git a/packages/nps/services/types.ts b/packages/nps/services/types.ts index 81bfde2b1..3cdab9c5c 100644 --- a/packages/nps/services/types.ts +++ b/packages/nps/services/types.ts @@ -1,18 +1,18 @@ export type Part = { - PartID: number; - ParentPartID: number; - BrandedPartID: number; - RepairPrice: number; - JunkPrice: number; - Wear: number; - AttachmentPoint: number; - Damage: number; + PartID: number; + ParentPartID: number; + BrandedPartID: number; + RepairPrice: number; + JunkPrice: number; + Wear: number; + AttachmentPoint: number; + Damage: number; }; export type Vehicle = { - VehicleID: number; - SkinID: number; - Flags: number; - Delta: number; - Damage: number; + VehicleID: number; + SkinID: number; + Flags: number; + Delta: number; + Damage: number; }; diff --git a/packages/nps/src/EncryptionSession.ts b/packages/nps/src/EncryptionSession.ts index 3bdbe4683..7e6993394 100644 --- a/packages/nps/src/EncryptionSession.ts +++ b/packages/nps/src/EncryptionSession.ts @@ -1,68 +1,67 @@ import { - Cipher, - Decipher, - createCipheriv, - createDecipheriv + Cipher, + Decipher, + createCipheriv, + createDecipheriv, } from "node:crypto"; - export type EncryptionSession = { - connectionId: string; - customerId: number; - sessionKey: string; - gameCipher: Cipher; - gameDecipher: Decipher; + connectionId: string; + customerId: number; + sessionKey: string; + gameCipher: Cipher; + gameDecipher: Decipher; }; export const encryptionSessions = new Map([]); export function setEncryptionSession( - encryptionSession: EncryptionSession + encryptionSession: EncryptionSession, ): void { - encryptionSessions.set(encryptionSession.connectionId, encryptionSession); + encryptionSessions.set(encryptionSession.connectionId, encryptionSession); } export function getEncryptionSession( - connectionId: string + connectionId: string, ): EncryptionSession | undefined { - if (encryptionSessions.has(connectionId)) { - return encryptionSessions.get(connectionId); - } - return undefined; + if (encryptionSessions.has(connectionId)) { + return encryptionSessions.get(connectionId); + } + return undefined; } -export function deleteEncryptionSession( - connectionId: string -): void { - encryptionSessions.delete(connectionId); +export function deleteEncryptionSession(connectionId: string): void { + encryptionSessions.delete(connectionId); } export function newEncryptionSession({ - connectionId, customerId, sessionKey, + connectionId, + customerId, + sessionKey, }: { - connectionId: string; - customerId: number; - sessionKey: string; + connectionId: string; + customerId: number; + sessionKey: string; }): EncryptionSession { - const gameCipher = createCipheriv( - "des-cbc", - Buffer.from(sessionKey, "hex"), - Buffer.alloc(8) - ); - gameCipher.setAutoPadding(false); - const gameDecipher = createDecipheriv( - "des-cbc", - Buffer.from(sessionKey, "hex"), - Buffer.alloc(8) - ); - gameDecipher.setAutoPadding(false); - const encryptionSession = { - connectionId, - customerId, - sessionKey, - gameCipher, - gameDecipher, - }; - setEncryptionSession(encryptionSession); - return encryptionSession; + const gameCipher = createCipheriv( + "des-cbc", + Buffer.from(sessionKey, "hex"), + Buffer.alloc(8), + ); + gameCipher.setAutoPadding(false); + const gameDecipher = createDecipheriv( + "des-cbc", + Buffer.from(sessionKey, "hex"), + Buffer.alloc(8), + ); + gameDecipher.setAutoPadding(false); + const encryptionSession = { + connectionId, + customerId, + sessionKey, + gameCipher, + gameDecipher, + }; + setEncryptionSession(encryptionSession); + return encryptionSession; } diff --git a/packages/nps/src/UserStatusManager.ts b/packages/nps/src/UserStatusManager.ts index 2f884eca7..0cb9b2d14 100644 --- a/packages/nps/src/UserStatusManager.ts +++ b/packages/nps/src/UserStatusManager.ts @@ -1,80 +1,89 @@ import { UserStatus } from "../messageStructs/UserStatus.js"; export class UserStatusManager { - static newUserStatus() { - return new UserStatus({ customerId: 0 }); - } - static _instance: UserStatusManager; - - static getInstance() { - if (!UserStatusManager._instance) { - UserStatusManager._instance = new UserStatusManager(); - } - return UserStatusManager._instance; - } - private _userStatuses: Map = new Map(); - - public addUserStatus(userStatus: UserStatus) { - this._userStatuses.set(userStatus.getCustomerId(), userStatus); - } - - public removeUserStatus(customerId: number) { - this._userStatuses.delete(customerId); - } - - public getUserStatus(customerId: number): UserStatus | undefined { - return this._userStatuses.get(customerId); - } - - public getUserStatuses(): UserStatus[] { - return Array.from(this._userStatuses.values()); - } - - public clearUserStatuses() { - this._userStatuses.clear(); - } - - static addUserStatus(userStatus: UserStatus) { - UserStatusManager.getInstance().addUserStatus(userStatus); - } - - static removeUserStatus(customerId: number) { - UserStatusManager.getInstance().removeUserStatus(customerId); - } - - static getUserStatus(customerId: number): UserStatus | undefined { - const userStatus = UserStatusManager.getInstance().getUserStatus(customerId); - - if (userStatus) { - return userStatus; - } - - const newUserStatus = new UserStatus({ customerId }); - - UserStatusManager.getInstance().addUserStatus(newUserStatus); - - return newUserStatus; - } - - static getUserStatusBySessionId(sessionId: string): UserStatus | undefined { - const userStatus = UserStatusManager.getInstance().getUserStatuses().find((userStatus) => { - return userStatus.getSessionId() === sessionId; - }); - - if (userStatus) { - return userStatus; - } - - return undefined; - } - - getUserStatuseByMachineIdAndIp(machineId: string, remoteIp: string): UserStatus | undefined { - return Array.from(this._userStatuses.values()).find((userStatus) => { - return userStatus.getMachineId() === machineId && userStatus.getRemoteIp() === remoteIp; - }); - } - - static getUserStatuses(): UserStatus[] { - return UserStatusManager.getInstance().getUserStatuses(); - } + static newUserStatus() { + return new UserStatus({ customerId: 0 }); + } + static _instance: UserStatusManager; + + static getInstance() { + if (!UserStatusManager._instance) { + UserStatusManager._instance = new UserStatusManager(); + } + return UserStatusManager._instance; + } + private _userStatuses: Map = new Map(); + + public addUserStatus(userStatus: UserStatus) { + this._userStatuses.set(userStatus.getCustomerId(), userStatus); + } + + public removeUserStatus(customerId: number) { + this._userStatuses.delete(customerId); + } + + public getUserStatus(customerId: number): UserStatus | undefined { + return this._userStatuses.get(customerId); + } + + public getUserStatuses(): UserStatus[] { + return Array.from(this._userStatuses.values()); + } + + public clearUserStatuses() { + this._userStatuses.clear(); + } + + static addUserStatus(userStatus: UserStatus) { + UserStatusManager.getInstance().addUserStatus(userStatus); + } + + static removeUserStatus(customerId: number) { + UserStatusManager.getInstance().removeUserStatus(customerId); + } + + static getUserStatus(customerId: number): UserStatus | undefined { + const userStatus = + UserStatusManager.getInstance().getUserStatus(customerId); + + if (userStatus) { + return userStatus; + } + + const newUserStatus = new UserStatus({ customerId }); + + UserStatusManager.getInstance().addUserStatus(newUserStatus); + + return newUserStatus; + } + + static getUserStatusBySessionId(sessionId: string): UserStatus | undefined { + const userStatus = UserStatusManager.getInstance() + .getUserStatuses() + .find((userStatus) => { + return userStatus.getSessionId() === sessionId; + }); + + if (userStatus) { + return userStatus; + } + + return undefined; + } + + getUserStatuseByMachineIdAndIp( + machineId: string, + remoteIp: string, + ): UserStatus | undefined { + return Array.from(this._userStatuses.values()).find((userStatus) => { + return ( + userStatus.getMachineId() === machineId && + userStatus.getRemoteIp() === remoteIp + ); + }); + } + + static getUserStatuses(): UserStatus[] { + return UserStatusManager.getInstance().getUserStatuses(); + } } diff --git a/packages/nps/src/utils/pureCompare.ts b/packages/nps/src/utils/pureCompare.ts index 8317df3da..82c3742e2 100644 --- a/packages/nps/src/utils/pureCompare.ts +++ b/packages/nps/src/utils/pureCompare.ts @@ -1,48 +1,47 @@ export function isZero(n: number): boolean { - // Return true if n is zero - return n === 0; + // Return true if n is zero + return n === 0; } - export function isUndefined(n: unknown): boolean { - // Return true if n is undefined - return typeof n === "undefined"; + // Return true if n is undefined + return typeof n === "undefined"; } export function lessThan(a: number, b: number): boolean { - // Return true if a < b - return a < b; + // Return true if a < b + return a < b; } export function lessThanOrEqual(a: number, b: number): boolean { - // Return true if a <= b - return a <= b; + // Return true if a <= b + return a <= b; } export function greaterThan(a: number, b: number): boolean { - // Return true if a > b - return a > b; + // Return true if a > b + return a > b; } export function greaterThanOrEqual(a: number, b: number): boolean { - // Return true if a >= b - return a >= b; + // Return true if a >= b + return a >= b; } export function areBothZero(a: number, b: number): boolean { - // Return true if both a and b are zero - return isZero(a) && isZero(b); + // Return true if both a and b are zero + return isZero(a) && isZero(b); } export function areBothUndefined(a: unknown, b: unknown): boolean { - // Return true if both a and b are undefined - return typeof a === "undefined" && typeof b === "undefined"; + // Return true if both a and b are undefined + return typeof a === "undefined" && typeof b === "undefined"; } export function areBothSet(a: unknown, b: unknown): boolean { - // Return true if both a and b are set - return !isUndefined(a) && !isUndefined(b); + // Return true if both a and b are set + return !isUndefined(a) && !isUndefined(b); } export function isOnlyOneSet(a: unknown, b: unknown): boolean { - // Return true if only one of a and b is set - return !areBothSet(a, b) && (!isUndefined(a) || !isUndefined(b)); + // Return true if only one of a and b is set + return !areBothSet(a, b) && (!isUndefined(a) || !isUndefined(b)); } diff --git a/packages/nps/src/utils/pureGet.ts b/packages/nps/src/utils/pureGet.ts index ae2d0fe3e..a82f9202d 100644 --- a/packages/nps/src/utils/pureGet.ts +++ b/packages/nps/src/utils/pureGet.ts @@ -1,13 +1,13 @@ import { greaterThanOrEqual } from "./pureCompare.js"; export function getWord(bytes: Buffer, offset: number, isLE: boolean): number { - // Get the word at the offset - return isLE ? bytes.readUInt16LE(offset) : bytes.readUInt16BE(offset); + // Get the word at the offset + return isLE ? bytes.readUInt16LE(offset) : bytes.readUInt16BE(offset); } export function getDWord(bytes: Buffer, offset: number, isLE: boolean): number { - // Get the dword at the offset - return isLE ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset); + // Get the dword at the offset + return isLE ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset); } /** @@ -15,45 +15,45 @@ export function getDWord(bytes: Buffer, offset: number, isLE: boolean): number { * If the buffer is shorter than n bytes, return the whole buffer */ export function getNBytes(bytes: Buffer, n: number): Buffer { - const bufferLength = bytes.length; + const bufferLength = bytes.length; - const cutLength = greaterThanOrEqual(bufferLength, n) ? n : bufferLength; + const cutLength = greaterThanOrEqual(bufferLength, n) ? n : bufferLength; - // Get the first n bytes - return bytes.subarray(0, cutLength); + // Get the first n bytes + return bytes.subarray(0, cutLength); } export function getAsHex(bytes: Buffer): string { - return bytes.length % 2 === 0 - ? bytes.toString("hex") - : bytes.toString("hex") + "0"; + return bytes.length % 2 === 0 + ? bytes.toString("hex") + : bytes.toString("hex") + "0"; } export function getLenString( - bytes: Buffer, - offset: number, - isLE: boolean, + bytes: Buffer, + offset: number, + isLE: boolean, ): string { - // Get the length of the string - const strLen = getWord(bytes, offset, isLE); + // Get the length of the string + const strLen = getWord(bytes, offset, isLE); - // Get the string - return bytes.subarray(offset + 2, offset + 2 + strLen).toString("utf8"); + // Get the string + return bytes.subarray(offset + 2, offset + 2 + strLen).toString("utf8"); } export function getLenBlob( - bytes: Buffer, - offset: number, - isLE: boolean, + bytes: Buffer, + offset: number, + isLE: boolean, ): Buffer { - // Get the length of the blob - const blobLen = getDWord(bytes, offset, isLE); + // Get the length of the blob + const blobLen = getDWord(bytes, offset, isLE); - // Get the blob - return bytes.subarray(offset + 2, offset + 2 + blobLen); + // Get the blob + return bytes.subarray(offset + 2, offset + 2 + blobLen); } export function getShortBool(bytes: Buffer, offset: number): boolean { - // Get a 2 byte boolean - return bytes.readUInt16LE(offset) === 1; + // Get a 2 byte boolean + return bytes.readUInt16LE(offset) === 1; } diff --git a/packages/nps/src/utils/purePut.ts b/packages/nps/src/utils/purePut.ts index 460301155..09180bba5 100644 --- a/packages/nps/src/utils/purePut.ts +++ b/packages/nps/src/utils/purePut.ts @@ -1,105 +1,105 @@ export function put16( - bytes: Buffer, - offset: number, - word: number, - isLE: boolean, + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, ): Buffer { - // Put the word at the offset - if (isLE) { - bytes.writeUInt16LE(word, offset); - } else { - bytes.writeUInt16BE(word, offset); - } - return bytes; + // Put the word at the offset + if (isLE) { + bytes.writeUInt16LE(word, offset); + } else { + bytes.writeUInt16BE(word, offset); + } + return bytes; } export function put8(bytes: Buffer, offset: number, byte: number): Buffer { - // Put the byte at the offset - bytes.writeUInt8(byte, offset); - return bytes; + // Put the byte at the offset + bytes.writeUInt8(byte, offset); + return bytes; } export function put16BE(bytes: Buffer, offset: number, word: number): Buffer { - return put16(bytes, offset, word, false); + return put16(bytes, offset, word, false); } export function put16LE(bytes: Buffer, offset: number, word: number): Buffer { - return put16(bytes, offset, word, true); + return put16(bytes, offset, word, true); } export function put32( - bytes: Buffer, - offset: number, - word: number, - isLE: boolean, + bytes: Buffer, + offset: number, + word: number, + isLE: boolean, ): Buffer { - // Put the word at the offset - if (isLE) { - bytes.writeUInt32LE(word, offset); - } else { - bytes.writeUInt32BE(word, offset); - } - return bytes; + // Put the word at the offset + if (isLE) { + bytes.writeUInt32LE(word, offset); + } else { + bytes.writeUInt32BE(word, offset); + } + return bytes; } export function put32BE(bytes: Buffer, offset: number, word: number): Buffer { - return put32(bytes, offset, word, false); + return put32(bytes, offset, word, false); } export function put32LE(bytes: Buffer, offset: number, word: number): Buffer { - return put32(bytes, offset, word, true); + return put32(bytes, offset, word, true); } export function putLenString( - bytes: Buffer, - offset: number, - str: string, - isLE: boolean, + bytes: Buffer, + offset: number, + str: string, + isLE: boolean, ): Buffer { - // Get the length of the string - const strLen = str.length + 1; + // Get the length of the string + const strLen = str.length + 1; - // Put the length of the string - if (isLE) { - bytes.writeUInt32LE(strLen, offset); - } else { - bytes.writeUInt32BE(strLen, offset); - } + // Put the length of the string + if (isLE) { + bytes.writeUInt32LE(strLen, offset); + } else { + bytes.writeUInt32BE(strLen, offset); + } - // Put the string - bytes.write(str.concat("\0"), offset + 4, strLen, "utf8"); + // Put the string + bytes.write(str.concat("\0"), offset + 4, strLen, "utf8"); - return bytes; + return bytes; } export function putLenBlob( - bytes: Buffer, - offset: number, - blob: Buffer, - isLE: boolean, + bytes: Buffer, + offset: number, + blob: Buffer, + isLE: boolean, ): Buffer { - // Get the length of the blob - const blobLen = blob.length; + // Get the length of the blob + const blobLen = blob.length; - // Put the length of the blob - if (isLE) { - bytes.writeUInt32LE(blobLen, offset); - } else { - bytes.writeUInt32BE(blobLen, offset); - } + // Put the length of the blob + if (isLE) { + bytes.writeUInt32LE(blobLen, offset); + } else { + bytes.writeUInt32BE(blobLen, offset); + } - // Put the blob - blob.copy(bytes, offset + 4); + // Put the blob + blob.copy(bytes, offset + 4); - return bytes; + return bytes; } export function putShortBool( - bytes: Buffer, - offset: number, - bool: boolean, + bytes: Buffer, + offset: number, + bool: boolean, ): Buffer { - // Put a 2 byte boolean - bytes.writeUInt16LE(bool ? 1 : 0, offset); - return bytes; + // Put a 2 byte boolean + bytes.writeUInt16LE(bool ? 1 : 0, offset); + return bytes; } diff --git a/packages/nps/src/utils/sendNPSAck.ts b/packages/nps/src/utils/sendNPSAck.ts index 19aadd979..177f6138d 100644 --- a/packages/nps/src/utils/sendNPSAck.ts +++ b/packages/nps/src/utils/sendNPSAck.ts @@ -1,11 +1,11 @@ -import { GameMessage } from "../../messageStructs/GameMessage.js"; import type { GameSocketCallback } from "../../gameMessageProcessors/index.js"; +import { GameMessage } from "../../messageStructs/GameMessage.js"; export function sendNPSAck(socketCallback: GameSocketCallback) { - const response = new GameMessage(0); - response.header.setId(519); + const response = new GameMessage(0); + response.header.setId(519); - const responseBytes = response.serialize(); + const responseBytes = response.serialize(); - socketCallback([responseBytes]); + socketCallback([responseBytes]); } diff --git a/packages/nps/test/index.test.ts b/packages/nps/test/index.test.ts index f01d2f75d..1b1ba700e 100644 --- a/packages/nps/test/index.test.ts +++ b/packages/nps/test/index.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; describe("example", () => { - it("should pass", () => { - expect(true).toBe(true); - }); + it("should pass", () => { + expect(true).toBe(true); + }); }); diff --git a/packages/nps/types.ts b/packages/nps/types.ts index e01f50a1e..953848790 100644 --- a/packages/nps/types.ts +++ b/packages/nps/types.ts @@ -1,23 +1,23 @@ export interface ISerializable { - serialize(): Buffer; - deserialize(data: Buffer): void; - getByteSize(): number; - toString(): string; + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; } export interface IMessageHeader extends ISerializable { - getVersion(): number; - getId(): number; - getLength(): number; - getDataOffset(): number; - setVersion(version: number): void; - setId(id: number): void; - setLength(length: number): void; + getVersion(): number; + getId(): number; + getLength(): number; + getDataOffset(): number; + setVersion(version: number): void; + setId(id: number): void; + setLength(length: number): void; } export interface IMessage extends ISerializable { - header: IMessageHeader; - getData(): ISerializable; - getDataAsBuffer(): Buffer; - setData(data: ISerializable): void; + header: IMessageHeader; + getData(): ISerializable; + getDataAsBuffer(): Buffer; + setData(data: ISerializable): void; } diff --git a/packages/nps/vite.config.ts b/packages/nps/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/nps/vite.config.ts +++ b/packages/nps/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/patch/package.json b/packages/patch/package.json index 6460259aa..e8c8af6e7 100644 --- a/packages/patch/package.json +++ b/packages/patch/package.json @@ -1,27 +1,27 @@ { - "name": "rusty-motors-patch", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - }, - "directories": { - "test": "test" - }, - "description": "" + "name": "rusty-motors-patch", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" } diff --git a/packages/patch/src/PatchServer.ts b/packages/patch/src/PatchServer.ts index 87aa0ff68..86da6e3fc 100644 --- a/packages/patch/src/PatchServer.ts +++ b/packages/patch/src/PatchServer.ts @@ -1,19 +1,15 @@ +import { Buffer } from "node:buffer"; import { IncomingMessage, ServerResponse } from "node:http"; import { getServerLogger } from "../../shared/log.js"; -import { Buffer } from "node:buffer"; - -const debug_reseponse = Buffer.from([ - 0xca, 0xfe, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -]); export const CastanetResponse = { - body: Buffer.from([ - 0xca, 0xfe, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, - ]), - header: { - type: "Content-Type", - value: "application/octet-stream", - }, + body: Buffer.from([ + 0xca, 0xfe, 0xbe, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, + ]), + header: { + type: "Content-Type", + value: "application/octet-stream", + }, }; /** @@ -24,89 +20,89 @@ export const CastanetResponse = { */ export class PatchServer { - /** - * - * - * @static - * @type {PatchServer} - * @memberof PatchServer - */ - static _instance: PatchServer; + /** + * + * + * @static + * @type {PatchServer} + * @memberof PatchServer + */ + static _instance: PatchServer; - /** - * - * - * @private - * @type {import("pino").Logger} - */ - _log: import("pino").Logger; + /** + * + * + * @private + * @type {import("pino").Logger} + */ + _log: import("pino").Logger; - /** - * Creates an instance of PatchServer. - * Please use getInstance() instead - * @param {import("pino").Logger} log - * @memberof PatchServer - */ - constructor(log: import("pino").Logger) { - this._log = log; - } + /** + * Creates an instance of PatchServer. + * Please use getInstance() instead + * @param {import("pino").Logger} log + * @memberof PatchServer + */ + constructor(log: import("pino").Logger) { + this._log = log; + } - /** - * Return the instance of the PatchServer class - * - * @static - * @param {import("pino").Logger} log - * @return {PatchServer} - * @memberof PatchServer - */ - static getInstance(log: import("pino").Logger): PatchServer { - if (!PatchServer._instance) { - PatchServer._instance = new PatchServer(log); - } - return PatchServer._instance; - } + /** + * Return the instance of the PatchServer class + * + * @static + * @param {import("pino").Logger} log + * @return {PatchServer} + * @memberof PatchServer + */ + static getInstance(log: import("pino").Logger): PatchServer { + if (!PatchServer._instance) { + PatchServer._instance = new PatchServer(log); + } + return PatchServer._instance; + } - /** - * Returns the hard-coded value that tells the client there are no updates or patches - * @param {IncomingMessage} request - * @param {ServerResponse} response - * @returns {ServerResponse} - */ - castanetResponse( - request: IncomingMessage, - response: ServerResponse, - ): ServerResponse { - this._log.debug( - `[PATCH] Request from ${request.socket.remoteAddress} for ${request.method} ${request.url}.`, - ); + /** + * Returns the hard-coded value that tells the client there are no updates or patches + * @param {IncomingMessage} request + * @param {ServerResponse} response + * @returns {ServerResponse} + */ + castanetResponse( + request: IncomingMessage, + response: ServerResponse, + ): ServerResponse { + this._log.debug( + `[PATCH] Request from ${request.socket.remoteAddress} for ${request.method} ${request.url}.`, + ); - response.setHeader( - CastanetResponse.header.type, - CastanetResponse.header.value, - ); - return response.end(CastanetResponse.body); - } + response.setHeader( + CastanetResponse.header.type, + CastanetResponse.header.value, + ); + return response.end(CastanetResponse.body); + } - /** - * Routes incomming HTTP requests - * @param {IncomingMessage} request - * @param {ServerResponse} response - * @returns {ServerResponse} - */ - handleRequest( - request: IncomingMessage, - response: ServerResponse, - ): ServerResponse { - if ( - request.url === "/games/EA_Seattle/MotorCity/UpdateInfo" || - request.url === "/games/EA_Seattle/MotorCity/NPS" || - request.url === "/games/EA_Seattle/MotorCity/MCO" - ) { - return this.castanetResponse(request, response); - } - response.statusCode = 404; - return response.end(""); - } + /** + * Routes incomming HTTP requests + * @param {IncomingMessage} request + * @param {ServerResponse} response + * @returns {ServerResponse} + */ + handleRequest( + request: IncomingMessage, + response: ServerResponse, + ): ServerResponse { + if ( + request.url === "/games/EA_Seattle/MotorCity/UpdateInfo" || + request.url === "/games/EA_Seattle/MotorCity/NPS" || + request.url === "/games/EA_Seattle/MotorCity/MCO" + ) { + return this.castanetResponse(request, response); + } + response.statusCode = 404; + return response.end(""); + } } /** * Return the instance of the PatchServer class @@ -114,5 +110,5 @@ export class PatchServer { */ export function getPatchServer(): PatchServer { - return PatchServer.getInstance(getServerLogger({ module: "PatchServer" })); + return PatchServer.getInstance(getServerLogger({ module: "PatchServer" })); } diff --git a/packages/patch/test/PatchServer.test.ts b/packages/patch/test/PatchServer.test.ts index 69fe9786b..00a6c2b1f 100644 --- a/packages/patch/test/PatchServer.test.ts +++ b/packages/patch/test/PatchServer.test.ts @@ -1,35 +1,35 @@ +import { describe, expect, it, vi } from "vitest"; import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; -import { PatchServer, CastanetResponse } from "../src/PatchServer.js"; -import { describe, it, expect, vi } from "vitest"; +import { CastanetResponse, PatchServer } from "../src/PatchServer.js"; describe("PatchServer", () => { - it("should return the hard-coded value that tells the client there are no updates or patches", () => { - // Arrange - mockPino(); - const log = getServerLogger({ module: "Patch" }); - const patchServer = PatchServer.getInstance(log); - const request = { - socket: { - remoteAddress: "", - }, - method: "", - url: "", - }; - const response = { - setHeader: vi.fn(), - writeHead: vi.fn(), - end: vi.fn(), - }; + it("should return the hard-coded value that tells the client there are no updates or patches", () => { + // Arrange + mockPino(); + const log = getServerLogger({ module: "Patch" }); + const patchServer = PatchServer.getInstance(log); + const request = { + socket: { + remoteAddress: "", + }, + method: "", + url: "", + }; + const response = { + setHeader: vi.fn(), + writeHead: vi.fn(), + end: vi.fn(), + }; - // Act - patchServer.castanetResponse(request as any, response as any); + // Act + patchServer.castanetResponse(request as any, response as any); - // Assert - expect(response.setHeader).toHaveBeenCalledWith( - CastanetResponse.header.type, - CastanetResponse.header.value, - ); - expect(response.end).toHaveBeenCalledWith(CastanetResponse.body); - }); + // Assert + expect(response.setHeader).toHaveBeenCalledWith( + CastanetResponse.header.type, + CastanetResponse.header.value, + ); + expect(response.end).toHaveBeenCalledWith(CastanetResponse.body); + }); }); diff --git a/packages/patch/vite.config.ts b/packages/patch/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/patch/vite.config.ts +++ b/packages/patch/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/persona/src/BuddyInfoMessage.ts b/packages/persona/src/BuddyInfoMessage.ts index ea9047573..c8d03184f 100644 --- a/packages/persona/src/BuddyInfoMessage.ts +++ b/packages/persona/src/BuddyInfoMessage.ts @@ -15,120 +15,120 @@ import { RawMessage } from "../../shared/src/RawMessage.js"; */ export class BuddyInfoMessage extends RawMessage { - _buddyCount: number; // 2 bytes - _buddyList: BuddyList[] = []; - _longOne = 0x00000000; // 4 bytes - _longTwo = 0x00000000; // 4 bytes - constructor() { - super(0x614); - this._buddyCount = 0; - } + _buddyCount: number; // 2 bytes + _buddyList: BuddyList[] = []; + _longOne = 0x00000000; // 4 bytes + _longTwo = 0x00000000; // 4 bytes + constructor() { + super(0x614); + this._buddyCount = 0; + } - override get length(): number { - return super.length + 2 + this._buddyCount * 115; - } + override get length(): number { + return super.length + 2 + this._buddyCount * 115; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - super.serialize().copy(buffer, offset); - offset += super.length; - buffer.writeUInt16BE(this._buddyCount, offset); - offset += 2; - for (const buddy of this._buddyList) { - buddy.serialize().copy(buffer, offset); - offset += buddy.length; - } - return buffer; - } + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + super.serialize().copy(buffer, offset); + offset += super.length; + buffer.writeUInt16BE(this._buddyCount, offset); + offset += 2; + for (const buddy of this._buddyList) { + buddy.serialize().copy(buffer, offset); + offset += buddy.length; + } + return buffer; + } - add(buddy: BuddyList): void { - this._buddyList.push(buddy); - this._buddyCount++; - } + add(buddy: BuddyList): void { + this._buddyList.push(buddy); + this._buddyCount++; + } } export class BuddyCount extends NetworkMessage { - _buddyCount: number; // 2 bytes - constructor() { - super(0x614); - this._buddyCount = 0; - } + _buddyCount: number; // 2 bytes + constructor() { + super(0x614); + this._buddyCount = 0; + } - override get length(): number { - return super.length + 2; - } + override get length(): number { + return super.length + 2; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - buffer.writeUInt16BE(this.messageId, offset); - offset += 2; - buffer.writeUInt16BE(this.length, offset); - offset += 2; - buffer.writeUInt16BE(this.version, offset); - offset += 2; - buffer.writeUInt16BE(this.reserved, offset); - offset += 2; - buffer.writeUInt32BE(this.length, offset); - offset += 4; - buffer.writeUInt16BE(this._buddyCount, offset); - return buffer; - } + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + buffer.writeUInt16BE(this.messageId, offset); + offset += 2; + buffer.writeUInt16BE(this.length, offset); + offset += 2; + buffer.writeUInt16BE(this.version, offset); + offset += 2; + buffer.writeUInt16BE(this.reserved, offset); + offset += 2; + buffer.writeUInt32BE(this.length, offset); + offset += 4; + buffer.writeUInt16BE(this._buddyCount, offset); + return buffer; + } - set buddyCount(count: number) { - this._buddyCount = count; - } + set buddyCount(count: number) { + this._buddyCount = count; + } } export class BuddyList extends RawMessage { - // These are BuddyMap fields - // These are BuddyInfo fields - buddyName = ""; // 33 bytes - 32 + null terminator - gameName = ""; // 65 bytes - 64 + null terminator - isBuddy = false; // 1 byte - isOnline = false; // 1 byte - dnd = false; // 1 byte - dnb = false; // 1 byte - noEntry = false; // 1 byte - muteWhispers = false; // 1 byte - muteChat = false; // 1 byte + // These are BuddyMap fields + // These are BuddyInfo fields + buddyName = ""; // 33 bytes - 32 + null terminator + gameName = ""; // 65 bytes - 64 + null terminator + isBuddy = false; // 1 byte + isOnline = false; // 1 byte + dnd = false; // 1 byte + dnb = false; // 1 byte + noEntry = false; // 1 byte + muteWhispers = false; // 1 byte + muteChat = false; // 1 byte - constructor() { - super(0x608); - } + constructor() { + super(0x608); + } - override get length(): number { - return 115; - } + override get length(): number { + return 115; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - super.serialize().copy(buffer, offset); - offset += super.length; - buffer.writeUInt16BE(this.messageId, offset); - offset += 2; - offset = serializeStringRaw(this.buddyName, buffer, offset, 33); - offset = serializeStringRaw(this.gameName, buffer, offset, 65); - buffer.writeUInt8(this.isBuddy ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.isOnline ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.dnd ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.dnb ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.noEntry ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.muteWhispers ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.muteChat ? 1 : 0, offset); + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + super.serialize().copy(buffer, offset); + offset += super.length; + buffer.writeUInt16BE(this.messageId, offset); + offset += 2; + offset = serializeStringRaw(this.buddyName, buffer, offset, 33); + offset = serializeStringRaw(this.gameName, buffer, offset, 65); + buffer.writeUInt8(this.isBuddy ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.isOnline ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.dnd ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.dnb ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.noEntry ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.muteWhispers ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.muteChat ? 1 : 0, offset); - return buffer; - } + return buffer; + } - override toString(): string { - return this.serialize().toString("hex"); - } + override toString(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/persona/src/PersonaMapsMessage.ts b/packages/persona/src/PersonaMapsMessage.ts index aa33fda98..f35893b0b 100644 --- a/packages/persona/src/PersonaMapsMessage.ts +++ b/packages/persona/src/PersonaMapsMessage.ts @@ -1,5 +1,5 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; import { serializeString } from "../../core/src/serializationHelpers.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; import { NPSHeader, NPSMessage } from "../../shared/messageFactory.js"; /** @@ -7,338 +7,337 @@ import { NPSHeader, NPSMessage } from "../../shared/messageFactory.js"; * This is type UserGameData */ export class PersonaRecord { - customerId: number; - personaName: string; - serverDataId: number; - createDate: number; - lastLogin: number; - numberOfGames: number; - personaId: number; - isOnline: number; - purchaseTimestamp: number; - gameSerialNumber: string; - timeOnline: number; - timeInGame: number; - extraData: Buffer; - personaData: Buffer; - pictureData: Buffer; - dnd: number; - startedPlayingTimestamp: number; - hashedKey: string; - personaLevel: number; - shardId: number; - constructor() { - this.customerId = 0; - this.personaName = ""; - this.serverDataId = 0; - this.createDate = 0; - this.lastLogin = 0; - this.numberOfGames = 0; - this.personaId = 0; - this.isOnline = 0; - this.purchaseTimestamp = 0; - this.gameSerialNumber = ""; - this.timeOnline = 0; - this.timeInGame = 0; - this.extraData = Buffer.alloc(512); - this.personaData = Buffer.alloc(256); - this.pictureData = Buffer.alloc(1); - this.dnd = 0; - this.startedPlayingTimestamp = 0; - this.hashedKey = ""; - this.personaLevel = 0; - this.shardId = 0; - } + customerId: number; + personaName: string; + serverDataId: number; + createDate: number; + lastLogin: number; + numberOfGames: number; + personaId: number; + isOnline: number; + purchaseTimestamp: number; + gameSerialNumber: string; + timeOnline: number; + timeInGame: number; + extraData: Buffer; + personaData: Buffer; + pictureData: Buffer; + dnd: number; + startedPlayingTimestamp: number; + hashedKey: string; + personaLevel: number; + shardId: number; + constructor() { + this.customerId = 0; + this.personaName = ""; + this.serverDataId = 0; + this.createDate = 0; + this.lastLogin = 0; + this.numberOfGames = 0; + this.personaId = 0; + this.isOnline = 0; + this.purchaseTimestamp = 0; + this.gameSerialNumber = ""; + this.timeOnline = 0; + this.timeInGame = 0; + this.extraData = Buffer.alloc(512); + this.personaData = Buffer.alloc(256); + this.pictureData = Buffer.alloc(1); + this.dnd = 0; + this.startedPlayingTimestamp = 0; + this.hashedKey = ""; + this.personaLevel = 0; + this.shardId = 0; + } - /** - * - * @param {Buffer} buffer - * @returns {PersonaRecord} - */ - deserialize(buffer: Buffer): PersonaRecord { - let offset = 0; - this.customerId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.personaName = buffer.toString("utf8", offset, offset + 33); // 33 - offset += 33; - this.serverDataId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.createDate = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.lastLogin = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.numberOfGames = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.personaId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.isOnline = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.purchaseTimestamp = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.gameSerialNumber = buffer - .subarray(offset, offset + 33) - .toString("utf8"); // 33 - offset += 33; - this.timeOnline = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.timeInGame = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.extraData = buffer.subarray(offset, offset + 512); // 512 - offset += 512; - this.personaData = buffer.subarray(offset, offset + 256); // 256 - offset += 256; - this.pictureData = buffer.subarray(offset, offset + 1); // 1 - offset += 1; - this.dnd = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.startedPlayingTimestamp = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.hashedKey = buffer.subarray(offset, offset + 400).toString("utf8"); // 400 - offset += 400; - this.personaLevel = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.shardId = buffer.readUInt32BE(offset); // 2 - // Offset 1285 - return this; - } + /** + * + * @param {Buffer} buffer + * @returns {PersonaRecord} + */ + deserialize(buffer: Buffer): PersonaRecord { + let offset = 0; + this.customerId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.personaName = buffer.toString("utf8", offset, offset + 33); // 33 + offset += 33; + this.serverDataId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.createDate = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.lastLogin = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.numberOfGames = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.personaId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.isOnline = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.purchaseTimestamp = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.gameSerialNumber = buffer + .subarray(offset, offset + 33) + .toString("utf8"); // 33 + offset += 33; + this.timeOnline = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.timeInGame = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.extraData = buffer.subarray(offset, offset + 512); // 512 + offset += 512; + this.personaData = buffer.subarray(offset, offset + 256); // 256 + offset += 256; + this.pictureData = buffer.subarray(offset, offset + 1); // 1 + offset += 1; + this.dnd = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.startedPlayingTimestamp = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.hashedKey = buffer.subarray(offset, offset + 400).toString("utf8"); // 400 + offset += 400; + this.personaLevel = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.shardId = buffer.readUInt32BE(offset); // 2 + // Offset 1285 + return this; + } - /** - * - * @returns {Buffer} - */ - serialize(): Buffer { - const buffer = Buffer.alloc(PersonaRecord.size()); - try { - let offset = 0; - buffer.writeUInt32BE(this.customerId, offset); // 4 - Unknown if this is correct - offset += 4; // offset = 4 - buffer.writeUInt16BE(3341, offset); // 2 - unknown if this is correct - offset += 2; // offset = 6 - buffer.writeUInt32BE(this.personaId, offset); // 4 - Known to be correct - offset += 4; // offset = 10 - buffer.writeUInt32BE(this.shardId, offset); // 4 - Known to be correct - offset += 4; // offset = 14 - // We don't know what goes here yet - offset += 4; // offset = 18 - serializeString(this.personaName).copy(buffer, offset); // 34 - Known to be correct - // offset = 52 + /** + * + * @returns {Buffer} + */ + serialize(): Buffer { + const buffer = Buffer.alloc(PersonaRecord.size()); + try { + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); // 4 - Unknown if this is correct + offset += 4; // offset = 4 + buffer.writeUInt16BE(3341, offset); // 2 - unknown if this is correct + offset += 2; // offset = 6 + buffer.writeUInt32BE(this.personaId, offset); // 4 - Known to be correct + offset += 4; // offset = 10 + buffer.writeUInt32BE(this.shardId, offset); // 4 - Known to be correct + offset += 4; // offset = 14 + // We don't know what goes here yet + offset += 4; // offset = 18 + serializeString(this.personaName).copy(buffer, offset); // 34 - Known to be correct + // offset = 52 - // buffer.writeUInt32BE(this.serverDataId, offset); // 4 - // offset += 4; // offset = 56 - // buffer.writeUInt32BE(this.createDate, offset); // 4 - // offset += 4; // offset = 60 - // buffer.writeUInt32BE(this.lastLogin, offset); // 4 - // offset += 4; // offset = 64 - // buffer.writeUInt32BE(this.numberOfGames, offset); // 4 (Max personas)) - // offset += 4; // offset = 68 - // buffer.writeUInt16BE(this.isOnline, offset); // 2 - // offset += 2; // offset = 70 - // buffer.writeUInt32BE(this.purchaseTimestamp, offset); // 4 - // offset += 4; // offset = 74 - // buffer.write(this.gameSerialNumber, offset, 33, "utf8"); // 33 - // offset += 33; // offset = 107 - // buffer.writeUInt32BE(this.timeOnline, offset); // 4 - // offset += 4; // offset = 111 - // buffer.writeUInt32BE(this.timeInGame, offset); // 4 - // offset += 4; // offset = 115 - // this.extraData.copy(buffer, offset, 512); // 512 - // offset += 512; // offset = 627 - // this.personaData.copy(buffer, offset, 256); // 256 - // offset += 256; // offset = 883 - // this.pictureData.copy(buffer, offset, 1); // 1 - // offset += 1; // offset = 884 - // buffer.writeUInt16BE(this.dnd, offset); // 2 - // offset += 2; // offset = 886 - // buffer.writeUInt32BE(this.startedPlayingTimestamp, offset); // 4 - // offset += 4; // offset = 890 - // buffer.write(this.hashedKey, offset, 400, "utf8"); // 400 - // offset += 400; // offset = 1290 - // buffer.writeUInt16BE(this.personaLevel, offset); // 2 - // offset += 2; // offset = 1292 - } catch (error) { - throw new ServerError( - `Error serializing PersonaRecord buffer: ${String(error)}`, - ); - } - return buffer; - } + // buffer.writeUInt32BE(this.serverDataId, offset); // 4 + // offset += 4; // offset = 56 + // buffer.writeUInt32BE(this.createDate, offset); // 4 + // offset += 4; // offset = 60 + // buffer.writeUInt32BE(this.lastLogin, offset); // 4 + // offset += 4; // offset = 64 + // buffer.writeUInt32BE(this.numberOfGames, offset); // 4 (Max personas)) + // offset += 4; // offset = 68 + // buffer.writeUInt16BE(this.isOnline, offset); // 2 + // offset += 2; // offset = 70 + // buffer.writeUInt32BE(this.purchaseTimestamp, offset); // 4 + // offset += 4; // offset = 74 + // buffer.write(this.gameSerialNumber, offset, 33, "utf8"); // 33 + // offset += 33; // offset = 107 + // buffer.writeUInt32BE(this.timeOnline, offset); // 4 + // offset += 4; // offset = 111 + // buffer.writeUInt32BE(this.timeInGame, offset); // 4 + // offset += 4; // offset = 115 + // this.extraData.copy(buffer, offset, 512); // 512 + // offset += 512; // offset = 627 + // this.personaData.copy(buffer, offset, 256); // 256 + // offset += 256; // offset = 883 + // this.pictureData.copy(buffer, offset, 1); // 1 + // offset += 1; // offset = 884 + // buffer.writeUInt16BE(this.dnd, offset); // 2 + // offset += 2; // offset = 886 + // buffer.writeUInt32BE(this.startedPlayingTimestamp, offset); // 4 + // offset += 4; // offset = 890 + // buffer.write(this.hashedKey, offset, 400, "utf8"); // 400 + // offset += 400; // offset = 1290 + // buffer.writeUInt16BE(this.personaLevel, offset); // 2 + // offset += 2; // offset = 1292 + } catch (error) { + throw new ServerError( + `Error serializing PersonaRecord buffer: ${String(error)}`, + ); + } + return buffer; + } - static size() { - return 52; - } + static size() { + return 52; + } - toJSON() { - return { - customerId: this.customerId, - personaId: this.personaId, - personaName: this.personaName, - shardId: this.shardId, - serverDataId: this.serverDataId, - // createDate: this.createDate, - // lastLogin: this.lastLogin, - // numberOfGames: this.numberOfGames, - // isOnline: this.isOnline, - // purchaseTimestamp: this.purchaseTimestamp, - // gameSerialNumber: this.gameSerialNumber, - // timeOnline: this.timeOnline, - // timeInGame: this.timeInGame, - // extraData: this.extraData, - // personaData: this.personaData, - // pictureData: this.pictureData, - // dnd: this.dnd, - // startedPlayingTimestamp: this.startedPlayingTimestamp, - // hashedKey: this.hashedKey, - // personaLevel: this.personaLevel, - }; - } + toJSON() { + return { + customerId: this.customerId, + personaId: this.personaId, + personaName: this.personaName, + shardId: this.shardId, + serverDataId: this.serverDataId, + // createDate: this.createDate, + // lastLogin: this.lastLogin, + // numberOfGames: this.numberOfGames, + // isOnline: this.isOnline, + // purchaseTimestamp: this.purchaseTimestamp, + // gameSerialNumber: this.gameSerialNumber, + // timeOnline: this.timeOnline, + // timeInGame: this.timeInGame, + // extraData: this.extraData, + // personaData: this.personaData, + // pictureData: this.pictureData, + // dnd: this.dnd, + // startedPlayingTimestamp: this.startedPlayingTimestamp, + // hashedKey: this.hashedKey, + // personaLevel: this.personaLevel, + }; + } - asJSON() { - return this.toJSON(); - } + asJSON() { + return this.toJSON(); + } - toString() { - return `PersonaRecord: ${JSON.stringify(this.toJSON())}`; - } + toString() { + return `PersonaRecord: ${JSON.stringify(this.toJSON())}`; + } } export class PersonaList { - _personaRecords: PersonaRecord[]; - constructor() { - /** @type {PersonaRecord[]} */ - this._personaRecords = []; - } + _personaRecords: PersonaRecord[]; + constructor() { + /** @type {PersonaRecord[]} */ + this._personaRecords = []; + } - /** - * - * @param {Buffer} buffer - * @returns {PersonaList} - */ - deserialize(buffer: Buffer): PersonaList { - let offset = 0; - const personaRecordCount = buffer.readUInt16BE(offset); - offset += 2; - for (let i = 0; i < personaRecordCount; i++) { - const personaRecord = new PersonaRecord(); - personaRecord.deserialize(buffer.subarray(offset)); - offset += PersonaRecord.size(); - this._personaRecords.push(personaRecord); - } - return this; - } + /** + * + * @param {Buffer} buffer + * @returns {PersonaList} + */ + deserialize(buffer: Buffer): PersonaList { + let offset = 0; + const personaRecordCount = buffer.readUInt16BE(offset); + offset += 2; + for (let i = 0; i < personaRecordCount; i++) { + const personaRecord = new PersonaRecord(); + personaRecord.deserialize(buffer.subarray(offset)); + offset += PersonaRecord.size(); + this._personaRecords.push(personaRecord); + } + return this; + } - /** - * - * @returns {Buffer} - */ - serialize(): Buffer { - const NEEDED_SIZE = PersonaRecord.size() * this._personaRecords.length; - const buffer = Buffer.alloc(NEEDED_SIZE); - try { - let offset = 0; - if (!this._personaRecords) { - throw new ServerError("PersonaRecords is undefined"); - } - for (const personaRecord of this._personaRecords) { - personaRecord.serialize().copy(buffer, offset); - offset += PersonaRecord.size(); - } - } catch (error) { - throw new ServerError( - `Error serializing PersonaList buffer: ${String(error)}`, - ); - } - return buffer; - } + /** + * + * @returns {Buffer} + */ + serialize(): Buffer { + const NEEDED_SIZE = PersonaRecord.size() * this._personaRecords.length; + const buffer = Buffer.alloc(NEEDED_SIZE); + try { + let offset = 0; + if (!this._personaRecords) { + throw new ServerError("PersonaRecords is undefined"); + } + for (const personaRecord of this._personaRecords) { + personaRecord.serialize().copy(buffer, offset); + offset += PersonaRecord.size(); + } + } catch (error) { + throw new ServerError( + `Error serializing PersonaList buffer: ${String(error)}`, + ); + } + return buffer; + } - /** - * @param {PersonaRecord} personaRecord - */ - addPersonaRecord(personaRecord: PersonaRecord) { - this._personaRecords.push(personaRecord); - } + /** + * @param {PersonaRecord} personaRecord + */ + addPersonaRecord(personaRecord: PersonaRecord) { + this._personaRecords.push(personaRecord); + } - personaCount() { - return this._personaRecords.length; - } + personaCount() { + return this._personaRecords.length; + } - size() { - return PersonaRecord.size() * this._personaRecords.length; - } + size() { + return PersonaRecord.size() * this._personaRecords.length; + } - asJSON() { - return { - personaRecords: this._personaRecords, - }; - } + asJSON() { + return { + personaRecords: this._personaRecords, + }; + } - toString() { - return `PersonaList: ${JSON.stringify(this._personaRecords)}`; - } + toString() { + return `PersonaList: ${JSON.stringify(this._personaRecords)}`; + } } export class PersonaMapsMessage extends NPSMessage { - _personaRecords: PersonaList | undefined; - raw: Buffer | undefined; - constructor() { - super(); - /** @type {PersonaList | undefined} */ - this._personaRecords = undefined; - } + _personaRecords: PersonaList | undefined; + raw: Buffer | undefined; + constructor() { + super(); + /** @type {PersonaList | undefined} */ + this._personaRecords = undefined; + } - /** - * @param {Buffer} buffer - * @returns {PersonaMapsMessage} - */ - deserialize(buffer: Buffer): PersonaMapsMessage { - try { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(NPSHeader.size())); - this.raw = buffer; - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing PersonaMapsMessage", - ); - } - } + /** + * @param {Buffer} buffer + * @returns {PersonaMapsMessage} + */ + deserialize(buffer: Buffer): PersonaMapsMessage { + try { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(NPSHeader.size())); + this.raw = buffer; + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing PersonaMapsMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - if (!this._personaRecords) { - throw new ServerError("PersonaRecords is undefined"); - } - this._header.length = - NPSHeader.size() + 2 + this._personaRecords.size(); - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + if (!this._personaRecords) { + throw new ServerError("PersonaRecords is undefined"); + } + this._header.length = NPSHeader.size() + 2 + this._personaRecords.size(); + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); - // Write the persona count. This is known to be correct at offset 12 - buffer.writeUInt16BE(this._personaRecords.personaCount(), 12); - // This is a serialized PersonaList - this.data.copy(buffer, NPSHeader.size() + 2); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing PersonaMapsMessage", - ); - } - } + // Write the persona count. This is known to be correct at offset 12 + buffer.writeUInt16BE(this._personaRecords.personaCount(), 12); + // This is a serialized PersonaList + this.data.copy(buffer, NPSHeader.size() + 2); + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing PersonaMapsMessage", + ); + } + } - asJSON() { - return { - header: this._header, - personaRecords: this._personaRecords, - }; - } + asJSON() { + return { + header: this._header, + personaRecords: this._personaRecords, + }; + } - override toString() { - return `PersonaMapsMessage: ${JSON.stringify({ - header: this._header, - personaRecords: this._personaRecords, - })}`; - } + override toString() { + return `PersonaMapsMessage: ${JSON.stringify({ + header: this._header, + personaRecords: this._personaRecords, + })}`; + } } diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index d797b38c3..c9c2c5131 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -1,7 +1,7 @@ import { getServerLogger } from "../../shared/log.js"; import { - LegacyMessage, - SerializedBuffer, + LegacyMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; /** @@ -17,43 +17,43 @@ import { */ export async function _gameLogout({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsLogoutGameUser..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsLogoutGameUser', + log.debug("_npsLogoutGameUser..."); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: requestPacket.toString(), - })}`, - ); + NPSMsg: requestPacket.toString(), + })}`, + ); - // Build the packet - const responsePacket = new LegacyMessage(); - responsePacket._header.id = 519; - log.debug( - `NPSMsg response object from _npsLogoutGameUser', + // Build the packet + const responsePacket = new LegacyMessage(); + responsePacket._header.id = 519; + log.debug( + `NPSMsg response object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: responsePacket.toString(), - })}`, - ); + NPSMsg: responsePacket.toString(), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket._doSerialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket._doSerialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index 077a59bfb..d605ca89e 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -1,115 +1,115 @@ import { getServerLogger } from "../../shared/log.js"; import { - LegacyMessage, - NPSMessage, - SerializedBuffer, + LegacyMessage, + NPSMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; import { BuddyCount, BuddyInfoMessage, BuddyList } from "./BuddyInfoMessage.js"; export async function _getFirstBuddy({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - // This message is a versioned nps message - const incomingMessage = new NPSMessage(); - incomingMessage._doDeserialize(message._doSerialize()); + // This message is a versioned nps message + const incomingMessage = new NPSMessage(); + incomingMessage._doDeserialize(message._doSerialize()); - log.debug( - `in _getFirstBuddy, incomingMessage: ${incomingMessage - .serialize() - .toString("hex")}`, - ); + log.debug( + `in _getFirstBuddy, incomingMessage: ${incomingMessage + .serialize() + .toString("hex")}`, + ); - // extract the personaId - const personaId = incomingMessage.data.readUInt32BE(0); + // extract the personaId + const personaId = incomingMessage.data.readUInt32BE(0); - log.debug(`in _getFirstBuddy, personaId: ${personaId}`); + log.debug(`in _getFirstBuddy, personaId: ${personaId}`); - // TODO: Here we need to look up the buddies for the personaId + // TODO: Here we need to look up the buddies for the personaId - // First, send the BuddyCount message - const buddyCountMessage = new BuddyCount(); - buddyCountMessage.buddyCount = 0; + // First, send the BuddyCount message + const buddyCountMessage = new BuddyCount(); + buddyCountMessage.buddyCount = 0; - const outboundMessage1 = new SerializedBuffer(); - outboundMessage1._doDeserialize(buddyCountMessage.serialize()); + const outboundMessage1 = new SerializedBuffer(); + outboundMessage1._doDeserialize(buddyCountMessage.serialize()); - const buddyInfoMessage = new BuddyInfoMessage(); + const buddyInfoMessage = new BuddyInfoMessage(); - for (const buddy of buddies) { - const buddyInfo = new BuddyList(); - buddyInfo.buddyName = buddy.buddyName; - buddyInfo.gameName = buddy.gameName; - buddyInfo.isBuddy = buddy.isBuddy; - buddyInfo.isOnline = buddy.isOnline; - buddyInfo.dnd = buddy.dnd; - buddyInfo.dnb = buddy.dnb; - buddyInfo.noEntry = buddy.noEntry; - buddyInfo.muteWhispers = buddy.muteWhispers; - buddyInfo.muteChat = buddy.muteChat; + for (const buddy of buddies) { + const buddyInfo = new BuddyList(); + buddyInfo.buddyName = buddy.buddyName; + buddyInfo.gameName = buddy.gameName; + buddyInfo.isBuddy = buddy.isBuddy; + buddyInfo.isOnline = buddy.isOnline; + buddyInfo.dnd = buddy.dnd; + buddyInfo.dnb = buddy.dnb; + buddyInfo.noEntry = buddy.noEntry; + buddyInfo.muteWhispers = buddy.muteWhispers; + buddyInfo.muteChat = buddy.muteChat; - buddyInfoMessage.add(buddyInfo); - } + buddyInfoMessage.add(buddyInfo); + } - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(buddyInfoMessage.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(buddyInfoMessage.serialize()); - log.debug( - `in _getFirstBuddy, outboundMessage: ${outboundMessage1.toString()}`, - ); + log.debug( + `in _getFirstBuddy, outboundMessage: ${outboundMessage1.toString()}`, + ); - return { - connectionId, - messages: [outboundMessage1], - }; + return { + connectionId, + messages: [outboundMessage1], + }; } interface BuddyInfoRecord { - buddyId: number; - buddyName: string; - gameName: string; - isBuddy: boolean; - isOnline: boolean; - dnd: boolean; - dnb: boolean; - noEntry: boolean; - muteWhispers: boolean; - muteChat: boolean; + buddyId: number; + buddyName: string; + gameName: string; + isBuddy: boolean; + isOnline: boolean; + dnd: boolean; + dnb: boolean; + noEntry: boolean; + muteWhispers: boolean; + muteChat: boolean; } export const buddies: BuddyInfoRecord[] = [ - { - buddyId: 2, - buddyName: "Einstein", - gameName: "Good Woof", - isBuddy: true, - isOnline: true, - dnd: false, - dnb: false, - noEntry: false, - muteWhispers: false, - muteChat: false, - }, - { - buddyId: 3, - buddyName: "Marty", - gameName: "That kid", - isBuddy: true, - isOnline: true, - dnd: false, - dnb: false, - noEntry: false, - muteWhispers: false, - muteChat: false, - }, + { + buddyId: 2, + buddyName: "Einstein", + gameName: "Good Woof", + isBuddy: true, + isOnline: true, + dnd: false, + dnb: false, + noEntry: false, + muteWhispers: false, + muteChat: false, + }, + { + buddyId: 3, + buddyName: "Marty", + gameName: "That kid", + isBuddy: true, + isOnline: true, + dnd: false, + dnb: false, + noEntry: false, + muteWhispers: false, + muteChat: false, + }, ]; diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index 20d529204..f77ee1edc 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -1,7 +1,7 @@ import { getServerLogger } from "../../shared/log.js"; import { - LegacyMessage, - SerializedBuffer, + LegacyMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; /** @@ -17,47 +17,47 @@ import { */ export async function _selectGamePersona({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsSelectGamePersona..."); - const requestPacket = message; - log.debug( - `LegacyMsg request object from _npsSelectGamePersona ${requestPacket - ._doSerialize() - .toString("hex")}`, - ); + log.debug("_npsSelectGamePersona..."); + const requestPacket = message; + log.debug( + `LegacyMsg request object from _npsSelectGamePersona ${requestPacket + ._doSerialize() + .toString("hex")}`, + ); - // Create the packet content - const packetContent = Buffer.alloc(251); + // Create the packet content + const packetContent = Buffer.alloc(251); - // Build the packet - // Response Code - // 207 = success - const responsePacket = new LegacyMessage(); - responsePacket._header.id = 519; - responsePacket.setBuffer(packetContent); - log.debug( - `LegacyMsg response object from _npsSelectGamePersona ${responsePacket - ._doSerialize() - .toString("hex")} `, - ); + // Build the packet + // Response Code + // 207 = success + const responsePacket = new LegacyMessage(); + responsePacket._header.id = 519; + responsePacket.setBuffer(packetContent); + log.debug( + `LegacyMsg response object from _npsSelectGamePersona ${responsePacket + ._doSerialize() + .toString("hex")} `, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage.setBuffer(responsePacket._doSerialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage.setBuffer(responsePacket._doSerialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/getPersonasByPersonaId.ts b/packages/persona/src/getPersonasByPersonaId.ts index 3d3fd7c9b..b726387b7 100644 --- a/packages/persona/src/getPersonasByPersonaId.ts +++ b/packages/persona/src/getPersonasByPersonaId.ts @@ -9,20 +9,20 @@ import { personaRecords } from "./internal.js"; */ export async function getPersonasByPersonaId({ - personas = personaRecords, - id, + personas = personaRecords, + id, }: { - personas?: PersonaRecord[]; - id: number; + personas?: PersonaRecord[]; + id: number; }): Promise { - const results = personaRecords.filter((persona) => { - const match = id === persona.id.readInt32BE(0); - return match; - }); - if (results.length === 0) { - const err = new ServerError(`Unable to locate a persona for id: ${id}`); - throw err; - } + const results = personaRecords.filter((persona) => { + const match = id === persona.id.readInt32BE(0); + return match; + }); + if (results.length === 0) { + const err = new ServerError(`Unable to locate a persona for id: ${id}`); + throw err; + } - return results; + return results; } diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 9e033d75f..00fb31b57 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -1,7 +1,7 @@ import { getServerLogger } from "../../../shared/log.js"; import { - LegacyMessage, - SerializedBuffer, + LegacyMessage, + SerializedBuffer, } from "../../../shared/messageFactory.js"; import { RawMessage } from "../../../shared/src/RawMessage.js"; @@ -10,42 +10,42 @@ import { RawMessage } from "../../../shared/src/RawMessage.js"; */ export async function validatePersonaName({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsLogoutGameUser..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsLogoutGameUser', + log.debug("_npsLogoutGameUser..."); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: requestPacket.toString(), - })}`, - ); + NPSMsg: requestPacket.toString(), + })}`, + ); - // Build the packet - const responsePacket = new RawMessage(522); // 0x020a - NPS_DUP_USER - log.debug( - `NPSMsg response object from _npsLogoutGameUser', + // Build the packet + const responsePacket = new RawMessage(522); // 0x020a - NPS_DUP_USER + log.debug( + `NPSMsg response object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: responsePacket.toString(), - })}`, - ); + NPSMsg: responsePacket.toString(), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/index.js b/packages/persona/src/index.js index 092921910..d10bdfbfd 100644 --- a/packages/persona/src/index.js +++ b/packages/persona/src/index.js @@ -23,24 +23,24 @@ import { NPSMessage } from "../../shared/messageFactory.js"; * @returns {Promise} */ export async function handleSelectGamePersona(requestPacket, log) { - log.debug("_npsSelectGamePersona..."); + log.debug("_npsSelectGamePersona..."); - log.debug( - `[npsSelectGamePersona] requestPacket's data prior to sending: ${requestPacket.toString()}`, - ); + log.debug( + `[npsSelectGamePersona] requestPacket's data prior to sending: ${requestPacket.toString()}`, + ); - // Create the packet content - const packetContent = Buffer.alloc(251); + // Create the packet content + const packetContent = Buffer.alloc(251); - // Build the packet - // Response Code - // 207 = success - const responsePacket = new NPSMessage(); - responsePacket._header.id = 0x207; - responsePacket.setBuffer(packetContent); + // Build the packet + // Response Code + // 207 = success + const responsePacket = new NPSMessage(); + responsePacket._header.id = 0x207; + responsePacket.setBuffer(packetContent); - log.debug( - `[npsSelectGamePersona] responsePacket's data prior to sending: ${responsePacket.toString()}`, - ); - return responsePacket; + log.debug( + `[npsSelectGamePersona] responsePacket's data prior to sending: ${responsePacket.toString()}`, + ); + return responsePacket; } diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index 416ce52db..65196efad 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -14,23 +14,23 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { getServerLogger } from "../../shared/log.js"; import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../shared/log.js"; -import { - PersonaList, - PersonaMapsMessage, - PersonaRecord, -} from "./PersonaMapsMessage.js"; +import { Logger } from "pino"; import { getServerConfiguration } from "../../shared/Configuration.js"; import { - LegacyMessage, - SerializedBuffer, + LegacyMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; -import { Logger } from "pino"; -import { _selectGamePersona } from "./_selectGamePersona.js"; +import { + PersonaList, + PersonaMapsMessage, + PersonaRecord, +} from "./PersonaMapsMessage.js"; import { _gameLogout } from "./_gameLogout.js"; import { _getFirstBuddy } from "./_getFirstBuddy.js"; +import { _selectGamePersona } from "./_selectGamePersona.js"; import { validatePersonaName } from "./handlers/validatePersonaName.js"; const NAME_BUFFER_SIZE = 30; @@ -51,51 +51,51 @@ const NAME_BUFFER_SIZE = 30; * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: LegacyMessage; - log: Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 1283, // 0x503 - name: "Game login", - handler: _selectGamePersona, - }, - { - opCode: 1295, // 0x50F - name: "Game logout", - handler: _gameLogout, - }, - { - opCode: 1330, // 0x532 - name: "Get persona maps", - handler: getPersonaMaps, - }, - { - opCode: 1331, // 0x533 - name: "Validate persona name", - handler: validatePersonaName, - }, - { - opCode: 1291, // 0x50B - name: "Get first buddy", - handler: _getFirstBuddy, - }, + { + opCode: 1283, // 0x503 + name: "Game login", + handler: _selectGamePersona, + }, + { + opCode: 1295, // 0x50F + name: "Game logout", + handler: _gameLogout, + }, + { + opCode: 1330, // 0x532 + name: "Get persona maps", + handler: getPersonaMaps, + }, + { + opCode: 1331, // 0x533 + name: "Validate persona name", + handler: validatePersonaName, + }, + { + opCode: 1291, // 0x50B + name: "Get first buddy", + handler: _getFirstBuddy, + }, ]; /** * Return string as buffer */ export function generateNameBuffer(name: string, size: number): Buffer { - const nameBuffer = Buffer.alloc(size); - Buffer.from(name, "utf8").copy(nameBuffer); - return nameBuffer; + const nameBuffer = Buffer.alloc(size); + Buffer.from(name, "utf8").copy(nameBuffer); + return nameBuffer; } /** @@ -104,24 +104,24 @@ export function generateNameBuffer(name: string, size: number): Buffer { * @type {import("../../interfaces/index.js").PersonaRecord[]} */ export const personaRecords: import("../../interfaces/index.js").PersonaRecord[] = - [ - { - customerId: 2868969472, - id: Buffer.from([0x00, 0x00, 0x00, 0x01]), - maxPersonas: Buffer.from([0x01]), - name: generateNameBuffer("Doc Joe", NAME_BUFFER_SIZE), - personaCount: Buffer.from([0x00, 0x01]), - shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), - }, - { - customerId: 5551212, // 0x54 0xB4 0x6C - id: Buffer.from([0x00, 0x84, 0x5f, 0xed]), - maxPersonas: Buffer.from([0x02]), - name: generateNameBuffer("Dr Brown", NAME_BUFFER_SIZE), - personaCount: Buffer.from([0x00, 0x01]), - shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), - }, - ]; + [ + { + customerId: 2868969472, + id: Buffer.from([0x00, 0x00, 0x00, 0x01]), + maxPersonas: Buffer.from([0x01]), + name: generateNameBuffer("Doc Joe", NAME_BUFFER_SIZE), + personaCount: Buffer.from([0x00, 0x01]), + shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), + }, + { + customerId: 5551212, // 0x54 0xB4 0x6C + id: Buffer.from([0x00, 0x84, 0x5f, 0xed]), + maxPersonas: Buffer.from([0x02]), + name: generateNameBuffer("Dr Brown", NAME_BUFFER_SIZE), + personaCount: Buffer.from([0x00, 0x01]), + shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), + }, + ]; /** * @@ -129,12 +129,12 @@ export const personaRecords: import("../../interfaces/index.js").PersonaRecord[] // * @return {Promise} */ async function getPersonasByCustomerId( - customerId: number, + customerId: number, ): Promise { - const results = personaRecords.filter( - (persona) => persona.customerId === customerId, - ); - return results; + const results = personaRecords.filter( + (persona) => persona.customerId === customerId, + ); + return results; } /** @@ -146,14 +146,14 @@ async function getPersonasByCustomerId( * @return {Promise} */ async function getPersonaMapsByCustomerId( - customerId: number, + customerId: number, ): Promise { - switch (customerId) { - case 5551212: - return getPersonasByCustomerId(customerId); - default: - return []; - } + switch (customerId) { + case 5551212: + return getPersonasByCustomerId(customerId); + default: + return []; + } } /** @@ -168,95 +168,93 @@ async function getPersonaMapsByCustomerId( * }>} */ async function getPersonaMaps({ - connectionId, - message, - log = getServerLogger({ module: "PersonaServer" }), + connectionId, + message, + log = getServerLogger({ module: "PersonaServer" }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsGetPersonaMaps..."); + log.debug("_npsGetPersonaMaps..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsGetPersonaMaps ${requestPacket - ._doSerialize() - .toString("hex")} `, - ); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsGetPersonaMaps ${requestPacket + ._doSerialize() + .toString("hex")} `, + ); - const customerId = requestPacket.data.readUInt32BE(8); + const customerId = requestPacket.data.readUInt32BE(8); - const personas = await getPersonaMapsByCustomerId(customerId); - log.debug(`${personas.length} personas found for ${customerId}`); + const personas = await getPersonaMapsByCustomerId(customerId); + log.debug(`${personas.length} personas found for ${customerId}`); - const personaMapsMessage = new PersonaMapsMessage(); + const personaMapsMessage = new PersonaMapsMessage(); - // this is a GLDP_PersonaList::GLDP_PersonaList + // this is a GLDP_PersonaList::GLDP_PersonaList - try { - /** @type {PersonaList} */ - let personaList: PersonaList = new PersonaList(); + try { + /** @type {PersonaList} */ + let personaList: PersonaList = new PersonaList(); - if (personas.length > 1) { - log.warn( - `More than one persona found for customer Id: ${customerId}`, - ); - } + if (personas.length > 1) { + log.warn(`More than one persona found for customer Id: ${customerId}`); + } - personas.forEach((persona) => { - const personaRecord = new PersonaRecord(); + personas.forEach((persona) => { + const personaRecord = new PersonaRecord(); - personaRecord.customerId = persona.customerId; - personaRecord.personaId = persona.id.readUInt32BE(0); - personaRecord.personaName = persona.name.toString("utf8"); - personaRecord.shardId = persona.shardId.readUInt32BE(0); - personaRecord.numberOfGames = personas.length; + personaRecord.customerId = persona.customerId; + personaRecord.personaId = persona.id.readUInt32BE(0); + personaRecord.personaName = persona.name.toString("utf8"); + personaRecord.shardId = persona.shardId.readUInt32BE(0); + personaRecord.numberOfGames = personas.length; - personaList.addPersonaRecord(personaRecord); + personaList.addPersonaRecord(personaRecord); - log.debug( - `Persona record: ${JSON.stringify({ - personaRecord: personaRecord.toJSON(), - })}`, - ); - }); + log.debug( + `Persona record: ${JSON.stringify({ + personaRecord: personaRecord.toJSON(), + })}`, + ); + }); - personaMapsMessage._header.id = 0x607; - personaMapsMessage._personaRecords = personaList; - personaMapsMessage.setBuffer(personaList.serialize()); - log.debug( - `PersonaMapsMessage object from _npsGetPersonaMaps', + personaMapsMessage._header.id = 0x607; + personaMapsMessage._personaRecords = personaList; + personaMapsMessage.setBuffer(personaList.serialize()); + log.debug( + `PersonaMapsMessage object from _npsGetPersonaMaps', ${JSON.stringify({ - personaMapsMessage: personaMapsMessage - .serialize() - .toString("hex"), - })}`, - ); + personaMapsMessage: personaMapsMessage + .serialize() + .toString("hex"), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(personaMapsMessage.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(personaMapsMessage.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; - } catch (error) { - if (error instanceof Error) { - const err = new ServerError( - `Error serializing personaMapsMsg: ${error.message}`, - ); - throw err; - } + return { + connectionId, + messages: [outboundMessage], + }; + } catch (error) { + if (error instanceof Error) { + const err = new ServerError( + `Error serializing personaMapsMsg: ${error.message}`, + ); + throw err; + } - const err = new ServerError( - "Error serializing personaMapsMsg, error unknonw", - ); - throw err; - } + const err = new ServerError( + "Error serializing personaMapsMsg, error unknonw", + ); + throw err; + } } /** @@ -273,56 +271,56 @@ async function getPersonaMaps({ * @throws {Error} Unknown code was received */ export async function receivePersonaData({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - const { data } = message; - log.debug( - `Received Persona packet', + log.level = getServerConfiguration({}).logLevel ?? "info"; + const { data } = message; + log.debug( + `Received Persona packet', ${JSON.stringify({ - data: data.toString("hex"), - })}`, - ); + data: data.toString("hex"), + })}`, + ); - // The packet needs to be an NPSMessage - const inboundMessage = new LegacyMessage(); - inboundMessage._doDeserialize(message.data); + // The packet needs to be an NPSMessage + const inboundMessage = new LegacyMessage(); + inboundMessage._doDeserialize(message.data); - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } - try { - const result = await supportedHandler.handler({ - connectionId, - message: inboundMessage, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving receivePersonaDatadleData"); - return result; - } catch (error) { - throw ServerError.fromUnknown( - error, - `Error handling persona data: ${String(error)}`, - ); - } + try { + const result = await supportedHandler.handler({ + connectionId, + message: inboundMessage, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving receivePersonaDatadleData"); + return result; + } catch (error) { + throw ServerError.fromUnknown( + error, + `Error handling persona data: ${String(error)}`, + ); + } } diff --git a/packages/persona/test/getPersonasByPersonaId.test.ts b/packages/persona/test/getPersonasByPersonaId.test.ts index fe2841eb3..547ae9c07 100644 --- a/packages/persona/test/getPersonasByPersonaId.test.ts +++ b/packages/persona/test/getPersonasByPersonaId.test.ts @@ -1,28 +1,28 @@ +import { describe, expect, it } from "vitest"; import { PersonaRecord } from "../../interfaces/index.js"; import { getPersonasByPersonaId } from "../src/getPersonasByPersonaId.js"; -import { describe, it, expect } from "vitest"; describe("getPersonasByPersonaId", () => { - it("returns a persona", async () => { - // arrange - const personaRecord: PersonaRecord = { - id: Buffer.alloc(4), - name: Buffer.from("test"), - customerId: 6767, - maxPersonas: Buffer.alloc(4), - personaCount: Buffer.alloc(4), - shardId: Buffer.alloc(4), - }; - const id = 1; + it("returns a persona", async () => { + // arrange + const personaRecord: PersonaRecord = { + id: Buffer.alloc(4), + name: Buffer.from("test"), + customerId: 6767, + maxPersonas: Buffer.alloc(4), + personaCount: Buffer.alloc(4), + shardId: Buffer.alloc(4), + }; + const id = 1; - // act - const result = await getPersonasByPersonaId({ - personas: [personaRecord], - id, - }); + // act + const result = await getPersonasByPersonaId({ + personas: [personaRecord], + id, + }); - // assert - expect(result).toBeInstanceOf(Array); - expect(result[0].id.readInt32BE(0)).toBe(id); - }); + // assert + expect(result).toBeInstanceOf(Array); + expect(result[0].id.readInt32BE(0)).toBe(id); + }); }); diff --git a/packages/shard/package.json b/packages/shard/package.json index 3d24d015d..f71df4894 100644 --- a/packages/shard/package.json +++ b/packages/shard/package.json @@ -1,27 +1,27 @@ { - "name": "rusty-motors-shard", - "version": "1.0.0", - "description": "The shard service exposing the following endpoints to the gateway service:", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - }, - "directories": { - "test": "test" - } + "name": "rusty-motors-shard", + "version": "1.0.0", + "description": "The shard service exposing the following endpoints to the gateway service:", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + } } diff --git a/packages/shard/src/ShardServer.ts b/packages/shard/src/ShardServer.ts index 57d8c23a0..d3d4087bf 100644 --- a/packages/shard/src/ShardServer.ts +++ b/packages/shard/src/ShardServer.ts @@ -6,50 +6,50 @@ import { ShardEntry } from "./shard-entry.js"; * @param {string} shardHost */ export function generateShardList(shardHost: string) { - const shardClockTower = new ShardEntry( - "The Clocktower", - "The Clocktower", - 44, - shardHost, - 8226, - shardHost, - 7003, - shardHost, - 0, - "", - "Group-1", - 88, - 2, - shardHost, - 80, - ); + const shardClockTower = new ShardEntry( + "The Clocktower", + "The Clocktower", + 44, + shardHost, + 8226, + shardHost, + 7003, + shardHost, + 0, + "", + "Group-1", + 88, + 2, + shardHost, + 80, + ); - let _possibleShards = []; - _possibleShards.push(shardClockTower.formatForShardList()); + let _possibleShards = []; + _possibleShards.push(shardClockTower.formatForShardList()); - const shardTwinPinesMall = new ShardEntry( - "Twin Pines Mall", - "Twin Pines Mall", - 88, - shardHost, - 8226, - shardHost, - 7003, - shardHost, - 0, - "", - "Group-1", - 88, - 2, - shardHost, - 80, - ); + const shardTwinPinesMall = new ShardEntry( + "Twin Pines Mall", + "Twin Pines Mall", + 88, + shardHost, + 8226, + shardHost, + 7003, + shardHost, + 0, + "", + "Group-1", + 88, + 2, + shardHost, + 80, + ); - _possibleShards.push(shardTwinPinesMall.formatForShardList()); + _possibleShards.push(shardTwinPinesMall.formatForShardList()); - /** @type {string[]} */ - const activeShardList: string[] = []; - activeShardList.push(_possibleShards[0]); + /** @type {string[]} */ + const activeShardList: string[] = []; + activeShardList.push(_possibleShards[0]); - return activeShardList.join("\n"); + return activeShardList.join("\n"); } diff --git a/packages/shard/src/index.ts b/packages/shard/src/index.ts index 87f0ce81c..7cac77957 100644 --- a/packages/shard/src/index.ts +++ b/packages/shard/src/index.ts @@ -27,15 +27,15 @@ import { ServerError } from "../../shared/errors/ServerError.js"; * @return {string} */ export function handleGetCert(config: Configuration): string { - if (config.certificateFile === undefined) { - throw new ServerError("Certificate file not defined"); - } - try { - const cert = readFileSync(config.certificateFile, "utf8"); - return cert; - } catch (err) { - throw new ServerError(`Error reading certificate file: ${String(err)}`); - } + if (config.certificateFile === undefined) { + throw new ServerError("Certificate file not defined"); + } + try { + const cert = readFileSync(config.certificateFile, "utf8"); + return cert; + } catch (err) { + throw new ServerError(`Error reading certificate file: ${String(err)}`); + } } /** @@ -44,11 +44,11 @@ export function handleGetCert(config: Configuration): string { * @return {string} */ export function handleGetRegistry(config: Configuration): string { - const externalHost = config.host; - const patchHost = externalHost; - const authHost = externalHost; - const shardHost = externalHost; - return `Windows Registry Editor Version 5.00 + const externalHost = config.host; + const patchHost = externalHost; + const authHost = externalHost; + const shardHost = externalHost; + return `Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\EACom\\AuthAuth] "AuthLoginBaseService"="AuthLogin" @@ -83,13 +83,13 @@ export function handleGetRegistry(config: Configuration): string { * @return {string} */ export function handleGetKey(config: Configuration): string { - if (config.publicKeyFile === undefined) { - throw new ServerError("Public key file not defined"); - } - try { - const key = readFileSync(config.publicKeyFile, "utf8"); - return key; - } catch (err) { - throw new ServerError(`Error reading public key file: ${String(err)}`); - } + if (config.publicKeyFile === undefined) { + throw new ServerError("Public key file not defined"); + } + try { + const key = readFileSync(config.publicKeyFile, "utf8"); + return key; + } catch (err) { + throw new ServerError(`Error reading public key file: ${String(err)}`); + } } diff --git a/packages/shard/src/shard-entry.ts b/packages/shard/src/shard-entry.ts index 5097c5381..b956fcffd 100644 --- a/packages/shard/src/shard-entry.ts +++ b/packages/shard/src/shard-entry.ts @@ -15,80 +15,80 @@ // along with this program. If not, see . export class ShardEntry { - name: string; - description: string; - id: number; - loginServerIp: string; - loginServerPort: number; - lobbyServerIp: string; - lobbyServerPort: number; - mcotsServerIp: string; - statusId: number; - statusReason: string; - serverGroupName: string; - population: number; - maxPersonasPerUser: number; - diagnosticServerHost: string; - diagnosticServerPort: number; - /** - * - * @param {string} name - * @param {string} description - * @param {number} id - * @param {string} loginServerIp - * @param {number} loginServerPort - * @param {string} lobbyServerIp - * @param {number} lobbyServerPort - * @param {string} mcotsServerIp - * @param {number} statusId - * @param {string} statusReason - * @param {string} serverGroupName - * @param {number} population - * @param {number} maxPersonasPerUser - * @param {string} diagnosticServerHost - * @param {number} diagnosticServerPort - */ - constructor( - name: string, - description: string, - id: number, - loginServerIp: string, - loginServerPort: number, - lobbyServerIp: string, - lobbyServerPort: number, - mcotsServerIp: string, - statusId: number, - statusReason: string, - serverGroupName: string, - population: number, - maxPersonasPerUser: number, - diagnosticServerHost: string, - diagnosticServerPort: number, - ) { - this.name = name; - this.description = description; - this.id = id; - this.loginServerIp = loginServerIp; - this.loginServerPort = loginServerPort; - this.lobbyServerIp = lobbyServerIp; - this.lobbyServerPort = lobbyServerPort; - this.mcotsServerIp = mcotsServerIp; - this.statusId = statusId; - this.statusReason = statusReason; - this.serverGroupName = serverGroupName; - this.population = population; - this.maxPersonasPerUser = maxPersonasPerUser; - this.diagnosticServerHost = diagnosticServerHost; - this.diagnosticServerPort = diagnosticServerPort; - } + name: string; + description: string; + id: number; + loginServerIp: string; + loginServerPort: number; + lobbyServerIp: string; + lobbyServerPort: number; + mcotsServerIp: string; + statusId: number; + statusReason: string; + serverGroupName: string; + population: number; + maxPersonasPerUser: number; + diagnosticServerHost: string; + diagnosticServerPort: number; + /** + * + * @param {string} name + * @param {string} description + * @param {number} id + * @param {string} loginServerIp + * @param {number} loginServerPort + * @param {string} lobbyServerIp + * @param {number} lobbyServerPort + * @param {string} mcotsServerIp + * @param {number} statusId + * @param {string} statusReason + * @param {string} serverGroupName + * @param {number} population + * @param {number} maxPersonasPerUser + * @param {string} diagnosticServerHost + * @param {number} diagnosticServerPort + */ + constructor( + name: string, + description: string, + id: number, + loginServerIp: string, + loginServerPort: number, + lobbyServerIp: string, + lobbyServerPort: number, + mcotsServerIp: string, + statusId: number, + statusReason: string, + serverGroupName: string, + population: number, + maxPersonasPerUser: number, + diagnosticServerHost: string, + diagnosticServerPort: number, + ) { + this.name = name; + this.description = description; + this.id = id; + this.loginServerIp = loginServerIp; + this.loginServerPort = loginServerPort; + this.lobbyServerIp = lobbyServerIp; + this.lobbyServerPort = lobbyServerPort; + this.mcotsServerIp = mcotsServerIp; + this.statusId = statusId; + this.statusReason = statusReason; + this.serverGroupName = serverGroupName; + this.population = population; + this.maxPersonasPerUser = maxPersonasPerUser; + this.diagnosticServerHost = diagnosticServerHost; + this.diagnosticServerPort = diagnosticServerPort; + } - /** - * Return the entry in a formatted string - * - * @return {string} - */ - formatForShardList(): string { - return `[${this.name}] + /** + * Return the entry in a formatted string + * + * @return {string} + */ + formatForShardList(): string { + return `[${this.name}] Description=${this.description} ShardId=${this.id} LoginServerIP=${this.loginServerIp} @@ -103,5 +103,5 @@ export class ShardEntry { MaxPersonasPerUser=${this.maxPersonasPerUser} DiagnosticServerHost=${this.diagnosticServerHost} DiagnosticServerPort=${this.diagnosticServerPort}`; - } + } } diff --git a/packages/shard/test/shard-entry.test.ts b/packages/shard/test/shard-entry.test.ts index 894c7ae3c..8d419cd8b 100644 --- a/packages/shard/test/shard-entry.test.ts +++ b/packages/shard/test/shard-entry.test.ts @@ -1,32 +1,32 @@ -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; import { ShardEntry } from "../src/shard-entry.js"; describe("ShardEntry#formatForShardList()", () => { - it("should return a formatted list", () => { - // arrange - const expectedText = "LoginServerIP=0.0.0.0"; - const entry = new ShardEntry( - "TestEntry", - "Not a real shard", - 999, - "0.0.0.0", - 0, - "0.0.0.0", - 0, - "0.0.0.0", - -1, - "Test only, no login", - "TestShards", - 0, - 0, - "0.0.0.0", - 0, - ); + it("should return a formatted list", () => { + // arrange + const expectedText = "LoginServerIP=0.0.0.0"; + const entry = new ShardEntry( + "TestEntry", + "Not a real shard", + 999, + "0.0.0.0", + 0, + "0.0.0.0", + 0, + "0.0.0.0", + -1, + "Test only, no login", + "TestShards", + 0, + 0, + "0.0.0.0", + 0, + ); - // act - const result = entry.formatForShardList(); + // act + const result = entry.formatForShardList(); - // assert - expect(result).to.be.contain(expectedText); - }); + // assert + expect(result).to.be.contain(expectedText); + }); }); diff --git a/packages/shard/vite.config.ts b/packages/shard/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/shard/vite.config.ts +++ b/packages/shard/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/shared-packets/index.ts b/packages/shared-packets/index.ts index 622d72450..1786df049 100644 --- a/packages/shared-packets/index.ts +++ b/packages/shared-packets/index.ts @@ -1,10 +1,10 @@ export * from "./src/interfaces.js"; export { - ServerMessage, - ServerMessageHeader, - ServerGenericRequest, - ServerGenericResponse, - ServerMessagePayload, + ServerMessage, + ServerMessageHeader, + ServerGenericRequest, + ServerGenericResponse, + ServerMessagePayload, } from "./src/ServerMessage.js"; export { Serializable } from "./src/BasePacket.js"; diff --git a/packages/shared-packets/package.json b/packages/shared-packets/package.json index 9433de639..7d4aadb9b 100644 --- a/packages/shared-packets/package.json +++ b/packages/shared-packets/package.json @@ -1,22 +1,22 @@ { - "name": "rusty-motors-shared-packets", - "private": true, - "version": "1.0.0", - "type": "module", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "description": "" + "name": "rusty-motors-shared-packets", + "private": true, + "version": "1.0.0", + "type": "module", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "description": "" } diff --git a/packages/shared-packets/src/BasePacket.ts b/packages/shared-packets/src/BasePacket.ts index fb33cdc62..1893a3095 100644 --- a/packages/shared-packets/src/BasePacket.ts +++ b/packages/shared-packets/src/BasePacket.ts @@ -2,47 +2,47 @@ import type { ISerializable } from "./interfaces.js"; import { getAsHex } from "./utils.js"; export class Serializable implements ISerializable { - protected _data: Buffer = Buffer.alloc(4); + protected _data: Buffer = Buffer.alloc(4); - protected _asHex(bytes: Buffer): string { - return bytes.length % 2 === 0 - ? bytes.toString("hex") - : bytes.toString("hex") + "0"; - } + protected _asHex(bytes: Buffer): string { + return bytes.length % 2 === 0 + ? bytes.toString("hex") + : bytes.toString("hex") + "0"; + } - protected _assertEnoughData(data: Buffer, expected: number) { - if (data.length < expected) { - throw new Error( - `Data is too short. Expected at least ${expected} bytes, got ${data.length} bytes`, - ); - } - } + protected _assertEnoughData(data: Buffer, expected: number) { + if (data.length < expected) { + throw new Error( + `Data is too short. Expected at least ${expected} bytes, got ${data.length} bytes`, + ); + } + } - serialize(): Buffer { - return this._data; - } - deserialize(data: Buffer): void { - this._data = data; - } - getByteSize(): number { - return this._data.length; - } - toHexString(): string { - return getAsHex(this.serialize()); - } + serialize(): Buffer { + return this._data; + } + deserialize(data: Buffer): void { + this._data = data; + } + getByteSize(): number { + return this._data.length; + } + toHexString(): string { + return getAsHex(this.serialize()); + } } export class BasePacket extends Serializable implements ISerializable { - private header: ISerializable = new Serializable(); + private header: ISerializable = new Serializable(); - override serialize(): Buffer { - return Buffer.concat([this.header.serialize(), this._data]); - } - override deserialize(data: Buffer): void { - this.header.deserialize(data); - this._data = data.subarray(this.header.getByteSize()); - } - override getByteSize(): number { - return this.header.getByteSize() + this._data.length; - } + override serialize(): Buffer { + return Buffer.concat([this.header.serialize(), this._data]); + } + override deserialize(data: Buffer): void { + this.header.deserialize(data); + this._data = data.subarray(this.header.getByteSize()); + } + override getByteSize(): number { + return this.header.getByteSize() + this._data.length; + } } diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts index 7aaed363f..0bef3fa64 100644 --- a/packages/shared-packets/src/ServerMessage.ts +++ b/packages/shared-packets/src/ServerMessage.ts @@ -1,6 +1,6 @@ -import { Serializable } from "./BasePacket.js"; -import type { ISerializable, IMessage } from "./interfaces.js"; import { McosEncryptionPair, getServerLogger } from "rusty-motors-shared"; +import { Serializable } from "./BasePacket.js"; +import type { IMessage, ISerializable } from "./interfaces.js"; const log = getServerLogger(); @@ -8,365 +8,373 @@ const log = getServerLogger(); * */ export class ServerMessageHeader extends Serializable implements ISerializable { - // All fields are little-endian - private length: number = 0; // 2 bytes - private signature: string = ""; // 4 bytes - private sequence: number = 0; // 4 bytes - private flags: number = 0; // 1 - - getDataOffset(): number { - return 11; - } - override getByteSize(): number { - return 11; - } - - getLength(): number { - return this.length; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.length, 0); - buffer.write(this.signature, 2, 4, "ascii"); - buffer.writeUInt32LE(this.sequence, 6); - buffer.writeUInt8(this.flags, 10); - - return buffer; - } - - override deserialize(data: Buffer): ServerMessageHeader { - this._assertEnoughData(data, this.getByteSize()); - - this.length = data.readUInt16LE(0); - this.signature = data.toString("utf8", 2, 6); - this.sequence = data.readUInt32LE(6); - this.flags = data.readUInt8(10); - - return this; - } - - isValidSignature(): boolean { - return this.signature === "TOMC"; - } - - isPayloadEncrypted(): boolean { - // Does the flags bitmask contain have 0x08 set? - return this.flags >= 0x08; - } - - setPayloadEncryption(encrypted: boolean): ServerMessageHeader { - if (encrypted) { - this.flags |= 0x08; - } else { - this.flags &= ~0x08; - } - return this; - } - - toString(): string { - return `ServerMessageHeader {length: ${this.length}, signature: ${this.signature}, sequence: ${this.sequence}, flags: ${this.flags}}`; - } - - toHexString(): string { - return this.serialize().toString("hex"); - } - - getSequence(): number { - return this.sequence; - } - - setSequence(sequence: number): ServerMessageHeader { - this.sequence = sequence; - return this; - } - - setLength(length: number): ServerMessageHeader { - this.length = length; - return this; - } - - setSignature(signature: string): ServerMessageHeader { - this.signature = signature; - return this; - } + // All fields are little-endian + private length: number = 0; // 2 bytes + private signature: string = ""; // 4 bytes + private sequence: number = 0; // 4 bytes + private flags: number = 0; // 1 + + getDataOffset(): number { + return 11; + } + override getByteSize(): number { + return 11; + } + + getLength(): number { + return this.length; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.length, 0); + buffer.write(this.signature, 2, 4, "ascii"); + buffer.writeUInt32LE(this.sequence, 6); + buffer.writeUInt8(this.flags, 10); + + return buffer; + } + + override deserialize(data: Buffer): ServerMessageHeader { + this._assertEnoughData(data, this.getByteSize()); + + this.length = data.readUInt16LE(0); + this.signature = data.toString("utf8", 2, 6); + this.sequence = data.readUInt32LE(6); + this.flags = data.readUInt8(10); + + return this; + } + + isValidSignature(): boolean { + return this.signature === "TOMC"; + } + + isPayloadEncrypted(): boolean { + // Does the flags bitmask contain have 0x08 set? + return this.flags >= 0x08; + } + + setPayloadEncryption(encrypted: boolean): ServerMessageHeader { + if (encrypted) { + this.flags |= 0x08; + } else { + this.flags &= ~0x08; + } + return this; + } + + toString(): string { + return `ServerMessageHeader {length: ${this.length}, signature: ${this.signature}, sequence: ${this.sequence}, flags: ${this.flags}}`; + } + + toHexString(): string { + return this.serialize().toString("hex"); + } + + getSequence(): number { + return this.sequence; + } + + setSequence(sequence: number): ServerMessageHeader { + this.sequence = sequence; + return this; + } + + setLength(length: number): ServerMessageHeader { + this.length = length; + return this; + } + + setSignature(signature: string): ServerMessageHeader { + this.signature = signature; + return this; + } } export class ServerMessagePayload - extends Serializable - implements ISerializable + extends Serializable + implements ISerializable { - protected messageId: number = 0; // 2 bytes + protected messageId: number = 0; // 2 bytes - override getByteSize(): number { - return 2 + this._data.length; - } + override getByteSize(): number { + return 2 + this._data.length; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - this._data.copy(buffer, 2); + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + this._data.copy(buffer, 2); - return buffer; - } + return buffer; + } - override deserialize(data: Buffer): ServerMessagePayload { - this._assertEnoughData(data, 2); + override deserialize(data: Buffer): ServerMessagePayload { + this._assertEnoughData(data, 2); - this.messageId = data.readUInt16LE(0); - this._data = data.subarray(2); + this.messageId = data.readUInt16LE(0); + this._data = data.subarray(2); - return this; - } + return this; + } - getMessageId(): number { - return this.messageId; - } + getMessageId(): number { + return this.messageId; + } - setMessageId(messageId: number): ServerMessagePayload { - this.messageId = messageId; - return this; - } + setMessageId(messageId: number): ServerMessagePayload { + this.messageId = messageId; + return this; + } } export class ServerGenericRequest extends ServerMessagePayload { - private _data2: Buffer = Buffer.alloc(4); - - override getByteSize(): number { - return 2 + 4 + 4; - } - - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - buffer.writeUInt32LE(this._data.readUInt32LE(0), 2); - buffer.writeUInt32LE(this._data2.readUInt32LE(0), 6); - - return buffer; - } catch (error) { - log.error( - `Error serializing ServerGenericRequest: ${error as string}`, - ); - throw error; - } - } - - override deserialize(data: Buffer): ServerGenericRequest { - try { - this._assertEnoughData(data, this.getByteSize()); - - this.messageId = data.readUInt16LE(0); - this._data = data.subarray(2, 6); - this._data2 = data.subarray(6, 10); - - return this; - } catch (error) { - log.error( - `Error deserializing ServerGenericRequest: ${error as string}`, - ); - throw error; - } - } - - getData() { - return this._data; - } - - getData2() { - return this._data2; - } - - toString(): string { - return `ServerGenericRequest {messageId: ${this.messageId}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; - } + private _data2: Buffer = Buffer.alloc(4); + + override getByteSize(): number { + return 2 + 4 + 4; + } + + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + buffer.writeUInt32LE(this._data.readUInt32LE(0), 2); + buffer.writeUInt32LE(this._data2.readUInt32LE(0), 6); + + return buffer; + } catch (error) { + log.error(`Error serializing ServerGenericRequest: ${error as string}`); + throw error; + } + } + + override deserialize(data: Buffer): ServerGenericRequest { + try { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + this._data = data.subarray(2, 6); + this._data2 = data.subarray(6, 10); + + return this; + } catch (error) { + log.error(`Error deserializing ServerGenericRequest: ${error as string}`); + throw error; + } + } + + getData() { + return this._data; + } + + getData2() { + return this._data2; + } + + toString(): string { + return `ServerGenericRequest {messageId: ${this.messageId}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; + } } export class ServerGenericResponse extends ServerMessagePayload { - private _msgReply: number = 0; // 2 bytes - private _result: number = 0; // 4 - private _data2: Buffer = Buffer.alloc(4); - - override getByteSize(): number { - return 2 + 2 + 4 + 4 + 4; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - buffer.writeUInt16LE(this._msgReply, 2); - buffer.writeUInt32LE(this._result, 4); - buffer.writeUInt32LE(this._data.readUInt32LE(0), 8); - buffer.writeUInt32LE(this._data2.readUInt32LE(0), 12); - - return buffer; - } - - override deserialize(data: Buffer): ServerGenericResponse { - this._assertEnoughData(data, this.getByteSize()); - - this.messageId = data.readUInt16LE(0); - this._msgReply = data.readUInt16LE(2); - this._result = data.readUInt32LE(4); - this._data = data.subarray(2, 6); - this._data = data.subarray(6, 10); - - return this; - } - - getMessageReply(): number { - return this._msgReply; - } - - getResult(): number { - return this._result; - } - - setMsgReply(msgReply: number): ServerGenericResponse { - this._msgReply = msgReply; - return this; - } - - toString(): string { - return `ServerGenericResponse {messageId: ${this.messageId}, msgReply: ${this._msgReply}, result: ${this._result}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; - } + private _msgReply: number = 0; // 2 bytes + private _result: number = 0; // 4 + private _data2: Buffer = Buffer.alloc(4); + + override getByteSize(): number { + return 2 + 2 + 4 + 4 + 4; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + buffer.writeUInt16LE(this._msgReply, 2); + buffer.writeUInt32LE(this._result, 4); + buffer.writeUInt32LE(this._data.readUInt32LE(0), 8); + buffer.writeUInt32LE(this._data2.readUInt32LE(0), 12); + + return buffer; + } + + override deserialize(data: Buffer): ServerGenericResponse { + this._assertEnoughData(data, this.getByteSize()); + + this.messageId = data.readUInt16LE(0); + this._msgReply = data.readUInt16LE(2); + this._result = data.readUInt32LE(4); + this._data = data.subarray(2, 6); + this._data = data.subarray(6, 10); + + return this; + } + + getMessageReply(): number { + return this._msgReply; + } + + getResult(): number { + return this._result; + } + + setMsgReply(msgReply: number): ServerGenericResponse { + this._msgReply = msgReply; + return this; + } + + toString(): string { + return `ServerGenericResponse {messageId: ${this.messageId}, msgReply: ${this._msgReply}, result: ${this._result}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; + } } export class ServerMessage extends Serializable implements IMessage { - header: ServerMessageHeader; - data: ServerMessagePayload; - private _preDecryptedMessageId: number = -1; - private _preEncryptedMessageId: number = -1; - - constructor(messageId: number) { - super(); - this.header = new ServerMessageHeader(); - this.data = new ServerMessagePayload().setMessageId(messageId); - } - getDataBuffer(): Buffer { - return this.data.serialize(); - } - setDataBuffer(data: Buffer): ServerMessage { - this.data.deserialize(data); - return this; - } - /** The message length is the length of the message data, not including the id */ - override getByteSize(): number { - return this.header.getByteSize() + this.data.getByteSize(); - } - - populateHeader(seq?: number): ServerMessage { - this.header.setLength(this.header.getByteSize() + this.data.getByteSize() - 2); - this.header.setSignature("TOMC"); - this.header.setSequence(seq || 0); - - return this; - } - - getData(): ISerializable { - return this.data; - } - setData(data: ServerMessagePayload): ServerMessage { - this.data = data; - return this; - } - override serialize(): Buffer { - try { - - if (this.header.getSequence() === 0) { - throw new Error("ServerMessage sequence is 0, it must be set to a non-zero value before serializing"); - } - - if (!this.header.isValidSignature()) { - throw new Error("ServerMessage signature is invalid, it must be set to 'TOMC' before serializing"); - } - - if (this.header.getByteSize() === 0) { - throw new Error("ServerMessage header byte size is 0, it must be set before serializing"); - } - - const buffer = Buffer.alloc(this.getByteSize()); - const headerBuffer = this.header.serialize(); - const dataBuffer = this.getDataBuffer(); - - headerBuffer.copy(buffer); - dataBuffer.copy(buffer, this.header.getDataOffset()); - - return buffer; - } catch (error) { - log.error(`Error serializing ServerMessage: ${error as string}`); - throw error; - } - - } - override deserialize(data: Buffer): ServerMessage { - this._assertEnoughData(data, this.header.getByteSize()); - - this.header.deserialize(data); - this.setDataBuffer(data.subarray(this.header.getDataOffset())); - - return this; - } - - isEncrypted() { - return this.header.isPayloadEncrypted(); - } - - decrypt(cipherPair: McosEncryptionPair): ServerMessage { - log.setName("ServerMessage::decrypt"); - if (this.isEncrypted()) { - try { - this._preDecryptedMessageId = this.data.getMessageId(); - log.debug(`Decrypting ServerMessage with message id ${this.data.getMessageId()}`); - this.setDataBuffer(cipherPair.decrypt(this.getDataBuffer())); - log.debug(`Decrypted ServerMessage with message id ${this._preDecryptedMessageId}, new message id: ${this.data.getMessageId()}`); - this.header.setPayloadEncryption(false); - } catch (error) { - log.error(`Error decrypting ServerMessage: ${error as string}`); - throw error; - } - } - log.resetName(); - return this; - } - - encrypt(cipherPair: McosEncryptionPair): ServerMessage { - log.setName("ServerMessage::encrypt"); - if (!this.isEncrypted()) { - try { - this._preEncryptedMessageId = this.data.getMessageId(); - log.debug(`Encrypting ServerMessage with message id ${this.data.getMessageId()}`); - this.setDataBuffer(cipherPair.encrypt(this.getDataBuffer())); - log.debug(`Encrypted ServerMessage with message id ${this._preEncryptedMessageId}, new message id: ${this.data.getMessageId()}`); - this.header.setPayloadEncryption(true); - } catch (error) { - log.error(`Error encrypting ServerMessage: ${error as string}`); - throw error; - } - } - log.resetName(); - return this; - } - - getId() { - return this.data.getMessageId(); - } - - getSequence() { - return this.header.getSequence(); - } - - toString(): string { - return `ServerMessage {length: ${this.header.getLength()}, id: ${this.data.getMessageId()}}`; - } - - getPreDecryptedMessageId() { - return this._preDecryptedMessageId; - } - - - getPreEncryptedMessageId() { - return this._preEncryptedMessageId; - } - + header: ServerMessageHeader; + data: ServerMessagePayload; + private _preDecryptedMessageId: number = -1; + private _preEncryptedMessageId: number = -1; + + constructor(messageId: number) { + super(); + this.header = new ServerMessageHeader(); + this.data = new ServerMessagePayload().setMessageId(messageId); + } + getDataBuffer(): Buffer { + return this.data.serialize(); + } + setDataBuffer(data: Buffer): ServerMessage { + this.data.deserialize(data); + return this; + } + /** The message length is the length of the message data, not including the id */ + override getByteSize(): number { + return this.header.getByteSize() + this.data.getByteSize(); + } + + populateHeader(seq?: number): ServerMessage { + this.header.setLength( + this.header.getByteSize() + this.data.getByteSize() - 2, + ); + this.header.setSignature("TOMC"); + this.header.setSequence(seq || 0); + + return this; + } + + getData(): ISerializable { + return this.data; + } + setData(data: ServerMessagePayload): ServerMessage { + this.data = data; + return this; + } + override serialize(): Buffer { + try { + if (this.header.getSequence() === 0) { + throw new Error( + "ServerMessage sequence is 0, it must be set to a non-zero value before serializing", + ); + } + + if (!this.header.isValidSignature()) { + throw new Error( + "ServerMessage signature is invalid, it must be set to 'TOMC' before serializing", + ); + } + + if (this.header.getByteSize() === 0) { + throw new Error( + "ServerMessage header byte size is 0, it must be set before serializing", + ); + } + + const buffer = Buffer.alloc(this.getByteSize()); + const headerBuffer = this.header.serialize(); + const dataBuffer = this.getDataBuffer(); + + headerBuffer.copy(buffer); + dataBuffer.copy(buffer, this.header.getDataOffset()); + + return buffer; + } catch (error) { + log.error(`Error serializing ServerMessage: ${error as string}`); + throw error; + } + } + override deserialize(data: Buffer): ServerMessage { + this._assertEnoughData(data, this.header.getByteSize()); + + this.header.deserialize(data); + this.setDataBuffer(data.subarray(this.header.getDataOffset())); + + return this; + } + + isEncrypted() { + return this.header.isPayloadEncrypted(); + } + + decrypt(cipherPair: McosEncryptionPair): ServerMessage { + log.setName("ServerMessage::decrypt"); + if (this.isEncrypted()) { + try { + this._preDecryptedMessageId = this.data.getMessageId(); + log.debug( + `Decrypting ServerMessage with message id ${this.data.getMessageId()}`, + ); + this.setDataBuffer(cipherPair.decrypt(this.getDataBuffer())); + log.debug( + `Decrypted ServerMessage with message id ${this._preDecryptedMessageId}, new message id: ${this.data.getMessageId()}`, + ); + this.header.setPayloadEncryption(false); + } catch (error) { + log.error(`Error decrypting ServerMessage: ${error as string}`); + throw error; + } + } + log.resetName(); + return this; + } + + encrypt(cipherPair: McosEncryptionPair): ServerMessage { + log.setName("ServerMessage::encrypt"); + if (!this.isEncrypted()) { + try { + this._preEncryptedMessageId = this.data.getMessageId(); + log.debug( + `Encrypting ServerMessage with message id ${this.data.getMessageId()}`, + ); + this.setDataBuffer(cipherPair.encrypt(this.getDataBuffer())); + log.debug( + `Encrypted ServerMessage with message id ${this._preEncryptedMessageId}, new message id: ${this.data.getMessageId()}`, + ); + this.header.setPayloadEncryption(true); + } catch (error) { + log.error(`Error encrypting ServerMessage: ${error as string}`); + throw error; + } + } + log.resetName(); + return this; + } + + getId() { + return this.data.getMessageId(); + } + + getSequence() { + return this.header.getSequence(); + } + + toString(): string { + return `ServerMessage {length: ${this.header.getLength()}, id: ${this.data.getMessageId()}}`; + } + + getPreDecryptedMessageId() { + return this._preDecryptedMessageId; + } + + getPreEncryptedMessageId() { + return this._preEncryptedMessageId; + } } diff --git a/packages/shared-packets/src/interfaces.ts b/packages/shared-packets/src/interfaces.ts index 5d7086fe3..43c4a0a29 100644 --- a/packages/shared-packets/src/interfaces.ts +++ b/packages/shared-packets/src/interfaces.ts @@ -1,15 +1,15 @@ export interface ISerializable { - serialize(): Buffer; - deserialize(data: Buffer): void; - getByteSize(): number; - toString(): string; - toHexString(): string; + serialize(): Buffer; + deserialize(data: Buffer): void; + getByteSize(): number; + toString(): string; + toHexString(): string; } export interface IMessage extends ISerializable { - header: ISerializable; - getData(): ISerializable; - getDataBuffer(): Buffer; - setData(data: ISerializable): void; - setDataBuffer(data: Buffer): void; + header: ISerializable; + getData(): ISerializable; + getDataBuffer(): Buffer; + setData(data: ISerializable): void; + setDataBuffer(data: Buffer): void; } diff --git a/packages/shared-packets/src/utils.ts b/packages/shared-packets/src/utils.ts index 482d28dd5..1ddc6cbaa 100644 --- a/packages/shared-packets/src/utils.ts +++ b/packages/shared-packets/src/utils.ts @@ -1,5 +1,4 @@ export function getAsHex(bytes: Buffer): string { - return bytes.length % 2 === 0 - ? bytes.toString("hex") - : bytes.toString("hex") + "0"; + const hexString = bytes.toString("hex"); + return hexString.length % 2 === 0 ? hexString : `0${hexString}`; } diff --git a/packages/shared-packets/test/index.test.ts b/packages/shared-packets/test/index.test.ts index f01d2f75d..1b1ba700e 100644 --- a/packages/shared-packets/test/index.test.ts +++ b/packages/shared-packets/test/index.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; describe("example", () => { - it("should pass", () => { - expect(true).toBe(true); - }); + it("should pass", () => { + expect(true).toBe(true); + }); }); diff --git a/packages/shared-packets/tsconfig.json b/packages/shared-packets/tsconfig.json index eeb3f6426..a1200ebec 100644 --- a/packages/shared-packets/tsconfig.json +++ b/packages/shared-packets/tsconfig.json @@ -1,109 +1,14 @@ { - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "es2016" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, - // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs" /* Specify what module code is generated. */, - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - // "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist" /* Specify an output folder for all emitted files. */, - // "removeComments": true, /* Disable emitting comments. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, - - /* Type Checking */ - "strict": true /* Enable all strict type-checking options. */, - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - } + "compilerOptions": { + "target": "es2016", + "module": "commonjs", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "noImplicitAny": true, + "strictNullChecks": true, + "noUnusedLocals": true + } } diff --git a/packages/shared-packets/vite.config.ts b/packages/shared-packets/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/shared-packets/vite.config.ts +++ b/packages/shared-packets/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/shared/Configuration.ts b/packages/shared/Configuration.ts index 6494d1693..e86247800 100644 --- a/packages/shared/Configuration.ts +++ b/packages/shared/Configuration.ts @@ -7,52 +7,52 @@ import { getServerLogger } from "./log.js"; */ export class Configuration { - certificateFile!: string; - privateKeyFile!: string; - publicKeyFile!: string; - host!: string; - logLevel!: string; - static instance: Configuration | undefined; - /** - * - * @param {object} args - * @param {string} [args.host="localhost"] - * @param {string} [args.certificateFile="certificates/certificate.pem"] - * @param {string} [args.privateKeyFile="certificates/privatekey.pem"] - * @param {string} [args.publicKeyFile="certificates/publickey.pem"] - * @param {string} [args.logLevel="info"] - * @param {module:pino.Logger} [args.logger=getServerLogger({})] - */ - constructor({ - host = "localhost", - certificateFile = "certificates/certificate.pem", - privateKeyFile = "certificates/privatekey.pem", - publicKeyFile = "certificates/publickey.pem", - logLevel = "info", - logger = getServerLogger({}), - }: { - host?: string; - certificateFile?: string; - privateKeyFile?: string; - publicKeyFile?: string; - logLevel?: string; - logger?: Logger; - }) { - try { - this.certificateFile = certificateFile; + certificateFile!: string; + privateKeyFile!: string; + publicKeyFile!: string; + host!: string; + logLevel!: string; + static instance: Configuration | undefined; + /** + * + * @param {object} args + * @param {string} [args.host="localhost"] + * @param {string} [args.certificateFile="certificates/certificate.pem"] + * @param {string} [args.privateKeyFile="certificates/privatekey.pem"] + * @param {string} [args.publicKeyFile="certificates/publickey.pem"] + * @param {string} [args.logLevel="info"] + * @param {module:pino.Logger} [args.logger=getServerLogger({})] + */ + constructor({ + host = "localhost", + certificateFile = "certificates/certificate.pem", + privateKeyFile = "certificates/privatekey.pem", + publicKeyFile = "certificates/publickey.pem", + logLevel = "info", + logger = getServerLogger({}), + }: { + host?: string; + certificateFile?: string; + privateKeyFile?: string; + publicKeyFile?: string; + logLevel?: string; + logger?: Logger; + }) { + try { + this.certificateFile = certificateFile; - this.privateKeyFile = privateKeyFile; + this.privateKeyFile = privateKeyFile; - this.publicKeyFile = publicKeyFile; + this.publicKeyFile = publicKeyFile; - this.host = host; + this.host = host; - this.logLevel = logLevel; - Configuration.instance = this; - } catch (error) { - logger.fatal(`Error in core server: ${String(error)}`); - } - } + this.logLevel = logLevel; + Configuration.instance = this; + } catch (error) { + logger.fatal(`Error in core server: ${String(error)}`); + } + } } /** @@ -68,30 +68,30 @@ export class Configuration { * @returns {Configuration} */ export function getServerConfiguration({ - host, - certificateFile, - privateKeyFile, - publicKeyFile, - logLevel, - logger, + host, + certificateFile, + privateKeyFile, + publicKeyFile, + logLevel, + logger, }: { - host?: string; - certificateFile?: string; - privateKeyFile?: string; - publicKeyFile?: string; - logLevel?: string; - logger?: Logger; + host?: string; + certificateFile?: string; + privateKeyFile?: string; + publicKeyFile?: string; + logLevel?: string; + logger?: Logger; }): Configuration { - if (typeof Configuration.instance === "undefined") { - Configuration.instance = new Configuration({ - host, - certificateFile, - privateKeyFile, - publicKeyFile, - logLevel, - logger, - }); - } + if (typeof Configuration.instance === "undefined") { + Configuration.instance = new Configuration({ + host, + certificateFile, + privateKeyFile, + publicKeyFile, + logLevel, + logger, + }); + } - return Configuration.instance; + return Configuration.instance; } diff --git a/packages/shared/MessageNode.ts b/packages/shared/MessageNode.ts index 0be88592d..5d24e34f5 100644 --- a/packages/shared/MessageNode.ts +++ b/packages/shared/MessageNode.ts @@ -2,99 +2,99 @@ import { ServerError } from "./errors/ServerError.js"; import { SerializedBuffer } from "./messageFactory.js"; export class MessageNode { - header: { - length: number; // 2 bytes - mcoSig: string; - }; - seq: number; - flags: number; - data: Buffer; - msgNo: number; - constructor() { - this.header = { - length: 0, // 2 bytes - mcoSig: "", // 4 bytes - }; - this.seq = 999; // 2 bytes - this.flags = 0; // 1 byte - this.data = Buffer.alloc(0); - this.msgNo = 999; // 2 bytes - } + header: { + length: number; // 2 bytes + mcoSig: string; + }; + seq: number; + flags: number; + data: Buffer; + msgNo: number; + constructor() { + this.header = { + length: 0, // 2 bytes + mcoSig: "", // 4 bytes + }; + this.seq = 999; // 2 bytes + this.flags = 0; // 1 byte + this.data = Buffer.alloc(0); + this.msgNo = 999; // 2 bytes + } - /** - * @static - * @param {module:shared/RawMessage} rawMessage - * @return {MessageNode} - */ - static fromRawMessage(rawMessage: SerializedBuffer): MessageNode { - const messageNode = new MessageNode(); - messageNode.deserialize(rawMessage.serialize()); + /** + * @static + * @param {module:shared/RawMessage} rawMessage + * @return {MessageNode} + */ + static fromRawMessage(rawMessage: SerializedBuffer): MessageNode { + const messageNode = new MessageNode(); + messageNode.deserialize(rawMessage.serialize()); - if (messageNode.data.length > 2) { - messageNode.msgNo = messageNode.data.readInt16LE(0); - } + if (messageNode.data.length > 2) { + messageNode.msgNo = messageNode.data.readInt16LE(0); + } - return messageNode; - } + return messageNode; + } - get size() { - return this.data.length + 9; - } + get size() { + return this.data.length + 9; + } - /** - * - * @param {Buffer} packet - */ - deserialize(packet: Buffer) { - const length = packet.readInt16LE(0); - if (length !== packet.length) { - throw new ServerError( - `[MessageNode] Length of packet ${length.toString()} does not match length of buffer ${packet.length.toString()}`, - ); - } - this.header.length = length; - let offset = 2; - this.header.mcoSig = packet.subarray(offset, offset + 4).toString(); - offset += 4; - this.seq = packet.readInt16LE(offset); - offset += 2; - this.flags = packet.readInt8(offset); - offset += 1; // offset = 9 - this.data = packet.subarray(offset, offset + length - 9); - if (this.data.length > 2) { - this.msgNo = this.data.readInt16LE(0); - } - } + /** + * + * @param {Buffer} packet + */ + deserialize(packet: Buffer) { + const length = packet.readInt16LE(0); + if (length !== packet.length) { + throw new ServerError( + `[MessageNode] Length of packet ${length.toString()} does not match length of buffer ${packet.length.toString()}`, + ); + } + this.header.length = length; + let offset = 2; + this.header.mcoSig = packet.subarray(offset, offset + 4).toString(); + offset += 4; + this.seq = packet.readInt16LE(offset); + offset += 2; + this.flags = packet.readInt8(offset); + offset += 1; // offset = 9 + this.data = packet.subarray(offset, offset + length - 9); + if (this.data.length > 2) { + this.msgNo = this.data.readInt16LE(0); + } + } - /** - * - * @return {Buffer} - */ - serialize(): Buffer { - const packet = Buffer.alloc(this.header.length); - let offset = 0; - packet.writeInt16LE(this.header.length, offset); - offset += 2; - packet.write(this.header.mcoSig, offset, 4); - offset += 4; - packet.writeInt16LE(this.seq, offset); - offset += 2; - packet.writeInt8(this.flags, offset); - offset += 1; - if (typeof this.data === "undefined") { - throw new ServerError("MessageNode data is undefined"); - } - this.data.copy(packet, offset); - return packet; - } + /** + * + * @return {Buffer} + */ + serialize(): Buffer { + const packet = Buffer.alloc(this.header.length); + let offset = 0; + packet.writeInt16LE(this.header.length, offset); + offset += 2; + packet.write(this.header.mcoSig, offset, 4); + offset += 4; + packet.writeInt16LE(this.seq, offset); + offset += 2; + packet.writeInt8(this.flags, offset); + offset += 1; + if (typeof this.data === "undefined") { + throw new ServerError("MessageNode data is undefined"); + } + this.data.copy(packet, offset); + return packet; + } - toString() { - return `MessageNode: ${JSON.stringify({ - header: this.header, - seq: this.seq, - flags: this.flags, - data: this.data.toString("hex"), - msgNo: this.msgNo, - })}`; - } + toString() { + return `MessageNode: ${JSON.stringify({ + header: this.header, + seq: this.seq, + flags: this.flags, + data: this.data.toString("hex"), + msgNo: this.msgNo, + })}`; + } } diff --git a/packages/shared/NPSMessage.js b/packages/shared/NPSMessage.js index 9ea25fe10..7d26604a2 100644 --- a/packages/shared/NPSMessage.js +++ b/packages/shared/NPSMessage.js @@ -8,77 +8,77 @@ import { ServerError } from "./errors/ServerError.js"; * @class NPSMessage */ export class NPSMessage { - constructor() { - this.msgNo = 0; - this.msgVersion = 0; - this.reserved = 0; - this.data = Buffer.alloc(0); - this.msgLength = 0; - } + constructor() { + this.msgNo = 0; + this.msgVersion = 0; + this.reserved = 0; + this.data = Buffer.alloc(0); + this.msgLength = 0; + } - /** - * - * @param {Buffer} buffer - */ - setContent(buffer) { - this.data = buffer; - this.msgLength = this.data.length + 12; // skipcq: JS-0377 - } + /** + * + * @param {Buffer} buffer + */ + setContent(buffer) { + this.data = buffer; + this.msgLength = this.data.length + 12; // skipcq: JS-0377 + } - /** - * - * @return {Buffer} - */ - serialize() { - try { - const packet = Buffer.alloc(this.msgLength); - packet.writeInt16BE(this.msgNo, 0); - packet.writeInt16BE(this.msgLength, 2); - if (this.msgLength > 4) { - packet.writeInt16BE(this.msgVersion, 4); - packet.writeInt16BE(this.reserved, 6); - } + /** + * + * @return {Buffer} + */ + serialize() { + try { + const packet = Buffer.alloc(this.msgLength); + packet.writeInt16BE(this.msgNo, 0); + packet.writeInt16BE(this.msgLength, 2); + if (this.msgLength > 4) { + packet.writeInt16BE(this.msgVersion, 4); + packet.writeInt16BE(this.reserved, 6); + } - if (this.msgLength > 8) { - packet.writeInt32BE(this.msgLength, 8); - this.data.copy(packet, 12); - } + if (this.msgLength > 8) { + packet.writeInt32BE(this.msgLength, 8); + this.data.copy(packet, 12); + } - return packet; - } catch (error) { - if (error instanceof Error) { - const err = new ServerError( - `[NPSMsg] Error in serialize(): ${error.message}`, - ); - throw err; - } - const err = new ServerError( - "[NPSMsg] Error in serialize(), error unknown", - ); - throw err; - } - } + return packet; + } catch (error) { + if (error instanceof Error) { + const err = new ServerError( + `[NPSMsg] Error in serialize(): ${error.message}`, + ); + throw err; + } + const err = new ServerError( + "[NPSMsg] Error in serialize(), error unknown", + ); + throw err; + } + } - /** - * - * @param {Buffer} packet - * @return {NPSMessage} - */ - deserialize(packet) { - this.msgNo = packet.readInt16BE(0); - this.msgLength = packet.readInt16BE(2); - this.msgVersion = packet.readInt16BE(4); - this.data = packet.subarray(12); - return this; - } + /** + * + * @param {Buffer} packet + * @return {NPSMessage} + */ + deserialize(packet) { + this.msgNo = packet.readInt16BE(0); + this.msgLength = packet.readInt16BE(2); + this.msgVersion = packet.readInt16BE(4); + this.data = packet.subarray(12); + return this; + } - toString() { - return `NPSMessage: ${JSON.stringify({ - msgNo: this.msgNo, - msgLength: this.msgLength, - msgVersion: this.msgVersion, - reserved: this.reserved, - content: this.data.toString("hex"), - })}`; - } + toString() { + return `NPSMessage: ${JSON.stringify({ + msgNo: this.msgNo, + msgLength: this.msgLength, + msgVersion: this.msgVersion, + reserved: this.reserved, + content: this.data.toString("hex"), + })}`; + } } diff --git a/packages/shared/RawMessageHeader.js b/packages/shared/RawMessageHeader.js index 436ab33a7..18770b44f 100644 --- a/packages/shared/RawMessageHeader.js +++ b/packages/shared/RawMessageHeader.js @@ -1,58 +1,56 @@ import { ServerError } from "./errors/ServerError.js"; export class RawMessageHeader { - constructor() { - this.id = 0; // 2 bytes - this.length = 0; // 2 bytes - this.version = 257; // 2 bytes (0x0101) - this.reserved = 0; // 2 bytes - this.checksum = 0; // 4 bytes - } + constructor() { + this.id = 0; // 2 bytes + this.length = 0; // 2 bytes + this.version = 257; // 2 bytes (0x0101) + this.reserved = 0; // 2 bytes + this.checksum = 0; // 4 bytes + } - /** - * @param {Buffer} buffer - * @returns {RawMessageHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - deserialize(buffer) { - if (buffer.length < 4) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } + /** + * @param {Buffer} buffer + * @returns {RawMessageHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + deserialize(buffer) { + if (buffer.length < 4) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - } catch (error) { - throw new ServerError( - `Error deserializing buffer: ${String(error)}`, - ); - } - return this; - } + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + } catch (error) { + throw new ServerError(`Error deserializing buffer: ${String(error)}`); + } + return this; + } - /** - * @returns {Buffer} - * @throws {Error} If there is an error serializing the buffer - */ - serialize() { - const buffer = Buffer.alloc(RawMessageHeader.size()); - this.checksum = this.length; - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - buffer.writeInt16BE(this.version, 4); - buffer.writeInt16BE(this.reserved, 6); - buffer.writeInt32BE(this.checksum, 8); - return buffer; - } + /** + * @returns {Buffer} + * @throws {Error} If there is an error serializing the buffer + */ + serialize() { + const buffer = Buffer.alloc(RawMessageHeader.size()); + this.checksum = this.length; + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + buffer.writeInt16BE(this.version, 4); + buffer.writeInt16BE(this.reserved, 6); + buffer.writeInt32BE(this.checksum, 8); + return buffer; + } - static size() { - return 12; - } + static size() { + return 12; + } - toString() { - return `id: ${this.id}, length: ${this.length}`; - } + toString() { + return `id: ${this.id}, length: ${this.length}`; + } } diff --git a/packages/shared/ServerMessage.test.ts b/packages/shared/ServerMessage.test.ts index e7546ab66..fa4924182 100644 --- a/packages/shared/ServerMessage.test.ts +++ b/packages/shared/ServerMessage.test.ts @@ -1,31 +1,31 @@ +import { describe, expect, it } from "vitest"; import { OldServerMessage } from "./messageFactory.js"; -import { describe, it, expect } from "vitest"; describe("ServerMessage", () => { - describe(".byteLength", () => { - it("should have the correct size", () => { - // Arrange - const testMessage = new OldServerMessage(); - // Assert - expect(testMessage.size()).toBe(11); - }); - }); - it("should serialize and deserialize correctly", () => { - // Arrange - const testMessage = new OldServerMessage(); - testMessage._header.mcoSig = "MCOX"; - testMessage._header.sequence = 1; - testMessage._header.flags = 3; - testMessage._msgNo = 613; - // Act - const buffer = testMessage.serialize(); - const result = new OldServerMessage(); - result._doDeserialize(buffer); - result._msgNo = testMessage._msgNo; - // Assert - expect(result._header.mcoSig).toEqual(testMessage._header.mcoSig); - expect(result._header.sequence).toEqual(testMessage._header.sequence); - expect(result._header.flags).toEqual(testMessage._header.flags); - expect(result._msgNo).toEqual(testMessage._msgNo); - }); + describe(".byteLength", () => { + it("should have the correct size", () => { + // Arrange + const testMessage = new OldServerMessage(); + // Assert + expect(testMessage.size()).toBe(11); + }); + }); + it("should serialize and deserialize correctly", () => { + // Arrange + const testMessage = new OldServerMessage(); + testMessage._header.mcoSig = "MCOX"; + testMessage._header.sequence = 1; + testMessage._header.flags = 3; + testMessage._msgNo = 613; + // Act + const buffer = testMessage.serialize(); + const result = new OldServerMessage(); + result._doDeserialize(buffer); + result._msgNo = testMessage._msgNo; + // Assert + expect(result._header.mcoSig).toEqual(testMessage._header.mcoSig); + expect(result._header.sequence).toEqual(testMessage._header.sequence); + expect(result._header.flags).toEqual(testMessage._header.flags); + expect(result._msgNo).toEqual(testMessage._msgNo); + }); }); diff --git a/packages/shared/State.ts b/packages/shared/State.ts index db9797ab6..d28615b51 100644 --- a/packages/shared/State.ts +++ b/packages/shared/State.ts @@ -7,9 +7,9 @@ // eslint-disable-next-line no-unused-vars import { Cipher, Decipher } from "crypto"; -import { SerializedBuffer } from "./messageFactory.js"; import { Socket } from "node:net"; import { Logger } from "pino"; +import { SerializedBuffer } from "./messageFactory.js"; /** * @external RawMessage @@ -44,105 +44,105 @@ import { Logger } from "pino"; * A pair of encryption ciphers. */ export class McosEncryptionPair { - _cipher: Cipher; - _decipher: Decipher; - /** - * Create a new encryption pair. - * - * This function creates a new encryption pair. It is used to encrypt and - * decrypt data sent to and from the client. - * - * @param {module:crypto.Cipher} cipher The cipher to use for encryption. - * @param {module:crypto.Decipher} decipher The decipher to use for decryption. - */ - constructor(cipher: Cipher, decipher: Decipher) { - this._cipher = cipher; - this._decipher = decipher; - } - - /** - * @param {Buffer} data The data to encrypt. - * @returns {Buffer} The encrypted data. - */ - encrypt(data: Buffer): Buffer { - return this._cipher.update(data); - } - - /** - * @param {Buffer} data The data to decrypt. - * @returns {Buffer} The decrypted data. - */ - decrypt(data: Buffer): Buffer { - return this._decipher.update(data); - } + _cipher: Cipher; + _decipher: Decipher; + /** + * Create a new encryption pair. + * + * This function creates a new encryption pair. It is used to encrypt and + * decrypt data sent to and from the client. + * + * @param {module:crypto.Cipher} cipher The cipher to use for encryption. + * @param {module:crypto.Decipher} decipher The decipher to use for decryption. + */ + constructor(cipher: Cipher, decipher: Decipher) { + this._cipher = cipher; + this._decipher = decipher; + } + + /** + * @param {Buffer} data The data to encrypt. + * @returns {Buffer} The encrypted data. + */ + encrypt(data: Buffer): Buffer { + return this._cipher.update(data); + } + + /** + * @param {Buffer} data The data to decrypt. + * @returns {Buffer} The decrypted data. + */ + decrypt(data: Buffer): Buffer { + return this._decipher.update(data); + } } /** * The encryption settings for a session. */ export class McosEncryption { - connectionId: string; - _commandEncryptionPair: McosEncryptionPair; - _dataEncryptionPair: McosEncryptionPair; - /** - * Create a new encryption object. - * - * @param {object} args - * @param {string} args.connectionId The connection id of the session that - * this encryption is for. - * @param {McosEncryptionPair} args.commandEncryptionPair The encryption - * pair for - * command packets. - * @param {McosEncryptionPair} args.dataEncryptionPair The encryption pair - * for data packets. - */ - constructor({ - connectionId, - commandEncryptionPair, - dataEncryptionPair, - }: { - connectionId: string; - commandEncryptionPair: McosEncryptionPair; - dataEncryptionPair: McosEncryptionPair; - }) { - this.connectionId = connectionId; - this._commandEncryptionPair = commandEncryptionPair; - this._dataEncryptionPair = dataEncryptionPair; - } - - get commandEncryption() { - return this._commandEncryptionPair; - } - - get dataEncryption() { - return this._dataEncryptionPair; - } + connectionId: string; + _commandEncryptionPair: McosEncryptionPair; + _dataEncryptionPair: McosEncryptionPair; + /** + * Create a new encryption object. + * + * @param {object} args + * @param {string} args.connectionId The connection id of the session that + * this encryption is for. + * @param {McosEncryptionPair} args.commandEncryptionPair The encryption + * pair for + * command packets. + * @param {McosEncryptionPair} args.dataEncryptionPair The encryption pair + * for data packets. + */ + constructor({ + connectionId, + commandEncryptionPair, + dataEncryptionPair, + }: { + connectionId: string; + commandEncryptionPair: McosEncryptionPair; + dataEncryptionPair: McosEncryptionPair; + }) { + this.connectionId = connectionId; + this._commandEncryptionPair = commandEncryptionPair; + this._dataEncryptionPair = dataEncryptionPair; + } + + get commandEncryption() { + return this._commandEncryptionPair; + } + + get dataEncryption() { + return this._dataEncryptionPair; + } } /** * A client session. */ export class McosSession { - connectionId: string; - gameId: number; - /** - * Create a new session. - * - * @param {object} args - * @param {string} args.connectionId A unique identifier for this session. - * @param {number} args.username The username of the user who owns this - * session. - */ - constructor({ - connectionId, - gameId, - }: { - connectionId: string; - gameId: number; - }) { - this.connectionId = connectionId; - this.gameId = gameId; - } + connectionId: string; + gameId: number; + /** + * Create a new session. + * + * @param {object} args + * @param {string} args.connectionId A unique identifier for this session. + * @param {number} args.username The username of the user who owns this + * session. + */ + constructor({ + connectionId, + gameId, + }: { + connectionId: string; + gameId: number; + }) { + this.connectionId = connectionId; + this.gameId = gameId; + } } /** @@ -157,8 +157,8 @@ export class McosSession { * @interface */ interface WrappedSocket { - socket: Socket; - connectionId: string; + socket: Socket; + connectionId: string; } /** @@ -169,29 +169,29 @@ interface WrappedSocket { * @returns {WrappedSocket} The wrapped socket. */ export function wrapSocket( - socket: Socket, - connectionId: string, + socket: Socket, + connectionId: string, ): WrappedSocket { - return { - socket, - connectionId, - }; + return { + socket, + connectionId, + }; } interface OnDataHandlerArgs { - args: { - connectionId: string; - message: SerializedBuffer; - log?: Logger; - }; + args: { + connectionId: string; + message: SerializedBuffer; + log?: Logger; + }; } /** * @requires module:packages/shared/RawMessage */ export interface ServiceResponse { - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; } export type OnDataHandler = Function; @@ -217,13 +217,13 @@ export type OnDataHandler = Function; * @interface */ export interface State { - filePaths: Record; - sockets: Record; - encryptions: Record; - sessions: Record; - queuedConnections: Record; - onDataHandlers: Record; - save: (state?: State) => void; + filePaths: Record; + sockets: Record; + encryptions: Record; + sessions: Record; + queuedConnections: Record; + onDataHandlers: Record; + save: (state?: State) => void; } /** @@ -243,28 +243,28 @@ export interface State { * @returns The initial state. */ export function createInitialState({ - saveFunction = saveStateToDatabase, + saveFunction = saveStateToDatabase, }: { - saveFunction?: (state: State) => void; + saveFunction?: (state: State) => void; }): State { - return { - filePaths: {}, - sockets: {}, - encryptions: {}, - sessions: {}, - queuedConnections: {}, - onDataHandlers: {}, - save: function (state?: State) { - if (typeof state === "undefined") { - state = this as State; - } - if (typeof saveFunction === "undefined") { - saveStateToDatabase(state); - return; - } - saveFunction(state); - }, - }; + return { + filePaths: {}, + sockets: {}, + encryptions: {}, + sessions: {}, + queuedConnections: {}, + onDataHandlers: {}, + save: function (state?: State) { + if (typeof state === "undefined") { + state = this as State; + } + if (typeof saveFunction === "undefined") { + saveStateToDatabase(state); + return; + } + saveFunction(state); + }, + }; } /** @@ -283,17 +283,17 @@ export function createInitialState({ * @returns {State} The state with the data handler added. */ export function addOnDataHandler( - state: State, - port: number, - handler: OnDataHandler, + state: State, + port: number, + handler: OnDataHandler, ): State { - const onDataHandlers = state.onDataHandlers; - onDataHandlers[port.toString()] = handler; - const newState = { - ...state, - onDataHandlers, - }; - return newState; + const onDataHandlers = state.onDataHandlers; + onDataHandlers[port.toString()] = handler; + const newState = { + ...state, + onDataHandlers, + }; + return newState; } /** @@ -313,10 +313,10 @@ export function addOnDataHandler( * handler exists */ export function getOnDataHandler( - state: State, - port: number, + state: State, + port: number, ): OnDataHandler | undefined { - return state.onDataHandlers[port.toString()]; + return state.onDataHandlers[port.toString()]; } /** @@ -332,12 +332,12 @@ export function getOnDataHandler( * @returns {State} The state with the socket added. */ export function addSocket(state: State, socket: WrappedSocket): State { - const sockets = state.sockets; - sockets[socket.connectionId] = socket; - return { - ...state, - sockets, - }; + const sockets = state.sockets; + sockets[socket.connectionId] = socket; + return { + ...state, + sockets, + }; } /** @@ -350,10 +350,10 @@ export function addSocket(state: State, socket: WrappedSocket): State { * @returns {WrappedSocket | undefined} The socket with the given connection id, or undefined if no socket */ export function getSocket( - state: State, - connectionId: string, + state: State, + connectionId: string, ): WrappedSocket | undefined { - return state.sockets[connectionId]; + return state.sockets[connectionId]; } /** @@ -365,7 +365,7 @@ export function getSocket( * @returns {Record} An array of all the sockets in the state. */ export function getSockets(state: State): Record { - return state.sockets; + return state.sockets; } /** @@ -381,12 +381,12 @@ export function getSockets(state: State): Record { * @returns {State} The state with the socket removed. */ export function removeSocket(state: State, connectionId: string): State { - const sockets = state.sockets; - delete sockets[connectionId]; - return { - ...state, - sockets, - }; + const sockets = state.sockets; + delete sockets[connectionId]; + return { + ...state, + sockets, + }; } /** @@ -402,15 +402,15 @@ export function removeSocket(state: State, connectionId: string): State { * @returns {State} The state with the queued connection added. */ export function addQueuedConnection( - state: State, - socket: WrappedSocket, + state: State, + socket: WrappedSocket, ): State { - const queuedConnections = state.queuedConnections; - queuedConnections[socket.connectionId] = socket; - return { - ...state, - queuedConnections, - }; + const queuedConnections = state.queuedConnections; + queuedConnections[socket.connectionId] = socket; + return { + ...state, + queuedConnections, + }; } /** @@ -422,7 +422,7 @@ export function addQueuedConnection( * @returns {string[]} An array of all the queued connections in the state. */ export function getQueuedConnections(state: State): string[] { - return Object.keys(state.queuedConnections); + return Object.keys(state.queuedConnections); } /** @@ -438,15 +438,15 @@ export function getQueuedConnections(state: State): string[] { * @returns {State} The state with the queued connection removed. */ export function removeQueuedConnection( - state: State, - connectionId: string, + state: State, + connectionId: string, ): State { - const queuedConnections = state.queuedConnections; - delete queuedConnections[connectionId]; - return { - ...state, - queuedConnections, - }; + const queuedConnections = state.queuedConnections; + delete queuedConnections[connectionId]; + return { + ...state, + queuedConnections, + }; } /** @@ -462,12 +462,12 @@ export function removeQueuedConnection( * @returns {State} - The state with the encryption added. */ export function addEncryption(state: State, encryption: McosEncryption): State { - const encryptions = state.encryptions; - encryptions[encryption.connectionId] = encryption; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + encryptions[encryption.connectionId] = encryption; + return { + ...state, + encryptions, + }; } /** @@ -480,10 +480,10 @@ export function addEncryption(state: State, encryption: McosEncryption): State { * @returns {McosEncryption | undefined} The encryption with the given connection id, or undefined if no encryption */ export function getEncryption( - state: State, - connectionId: string, + state: State, + connectionId: string, ): McosEncryption | undefined { - return state.encryptions[connectionId]; + return state.encryptions[connectionId]; } /** @@ -499,15 +499,15 @@ export function getEncryption( * @returns {State} The state with the encryption updated. */ export function updateEncryption( - state: State, - encryption: McosEncryption, + state: State, + encryption: McosEncryption, ): State { - const encryptions = state.encryptions; - encryptions[encryption.connectionId] = encryption; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + encryptions[encryption.connectionId] = encryption; + return { + ...state, + encryptions, + }; } /** @@ -523,12 +523,12 @@ export function updateEncryption( * @returns {State} The state with the encryption removed. */ export function removeEncryption(state: State, connectionId: string): State { - const encryptions = state.encryptions; - delete encryptions[connectionId]; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + delete encryptions[connectionId]; + return { + ...state, + encryptions, + }; } /** @@ -544,12 +544,12 @@ export function removeEncryption(state: State, connectionId: string): State { * @returns {State} The state with the session added. */ export function addSession(state: State, session: McosSession): State { - const sessions = state.sessions; - sessions[session.connectionId] = session; - return { - ...state, - sessions, - }; + const sessions = state.sessions; + sessions[session.connectionId] = session; + return { + ...state, + sessions, + }; } /** @@ -566,19 +566,19 @@ export function addSession(state: State, session: McosSession): State { * @returns {State} The state with the session removed. */ export function removeSession(state: State, connectionId: string): State { - const sessions = state.sessions; - delete sessions[connectionId]; - return { - ...state, - sessions, - }; + const sessions = state.sessions; + delete sessions[connectionId]; + return { + ...state, + sessions, + }; } export function findSessionByConnectionId( - state: State, - connectionId: string, + state: State, + connectionId: string, ): McosSession | undefined { - return state.sessions[connectionId]; + return state.sessions[connectionId]; } /** @@ -589,7 +589,7 @@ export function findSessionByConnectionId( * @returns {State} The state from the database. */ export function fetchStateFromDatabase(): State { - return globalStateDatabase; + return globalStateDatabase; } /** @@ -600,7 +600,7 @@ export function fetchStateFromDatabase(): State { * @param {State} state The state to save to the database. */ function saveStateToDatabase(state: State) { - globalStateDatabase = state; + globalStateDatabase = state; } let globalStateDatabase = createInitialState({}); diff --git a/packages/shared/SubThread.ts b/packages/shared/SubThread.ts index 8592bf221..116d772e2 100644 --- a/packages/shared/SubThread.ts +++ b/packages/shared/SubThread.ts @@ -3,45 +3,45 @@ */ import { EventEmitter } from "node:events"; -import { getServerLogger } from "./log.js"; import { Logger } from "pino"; +import { getServerLogger } from "./log.js"; export class SubThread extends EventEmitter { - name: any; - log: any; - loopInterval: number; - timer: any; - /** - * @param {string} name - * @param {module:shared/log.ServerLogger} log - * @param {number} [loopInterval=100] - */ - constructor( - name: string, - log: Logger = getServerLogger({ module: "SubThread" }), - loopInterval: number = 100, - ) { - super(); - this.name = name; - this.log = log; - this.loopInterval = loopInterval; - this.init(); - } + name: any; + log: any; + loopInterval: number; + timer: any; + /** + * @param {string} name + * @param {module:shared/log.ServerLogger} log + * @param {number} [loopInterval=100] + */ + constructor( + name: string, + log: Logger = getServerLogger({ module: "SubThread" }), + loopInterval: number = 100, + ) { + super(); + this.name = name; + this.log = log; + this.loopInterval = loopInterval; + this.init(); + } - init() { - this.emit("initialized"); - // @ts-ignore - this.timer = setInterval(this.run.bind(this), this.loopInterval); - } + init() { + this.emit("initialized"); + // @ts-ignore + this.timer = setInterval(this.run.bind(this), this.loopInterval); + } - run() { - // Intentionally left blank - } + run() { + // Intentionally left blank + } - shutdown() { - if (this.timer) { - clearInterval(this.timer); - } - this.emit("shutdownComplete"); - } + shutdown() { + if (this.timer) { + clearInterval(this.timer); + } + this.emit("shutdownComplete"); + } } diff --git a/packages/shared/TimeStamp.ts b/packages/shared/TimeStamp.ts index f45500b3f..1664cc835 100644 --- a/packages/shared/TimeStamp.ts +++ b/packages/shared/TimeStamp.ts @@ -1,76 +1,76 @@ import { SerializedBuffer } from "./messageFactory.js"; export class Timestamp extends SerializedBuffer { - _year: number; - _month: number; - _day: number; - _hour: number; - _minute: number; - _second: number; - _fraction: number; - constructor() { - super(); - this._year = 0; // 2 bytes - this._month = 0; // 2 bytes - this._day = 0; // 2 bytes - this._hour = 0; // 2 bytes - this._minute = 0; // 2 bytes - this._second = 0; // 2 bytes - this._fraction = 0; // 2 bytes - // total: 14 bytes - } + _year: number; + _month: number; + _day: number; + _hour: number; + _minute: number; + _second: number; + _fraction: number; + constructor() { + super(); + this._year = 0; // 2 bytes + this._month = 0; // 2 bytes + this._day = 0; // 2 bytes + this._hour = 0; // 2 bytes + this._minute = 0; // 2 bytes + this._second = 0; // 2 bytes + this._fraction = 0; // 2 bytes + // total: 14 bytes + } - override size() { - return 14; - } + override size() { + return 14; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt16LE(this._year, offset); - offset += 2; - buffer.writeUInt16LE(this._month, offset); - offset += 2; - buffer.writeUInt16LE(this._day, offset); - offset += 2; - buffer.writeUInt16LE(this._hour, offset); - offset += 2; - buffer.writeUInt16LE(this._minute, offset); - offset += 2; - buffer.writeUInt16LE(this._second, offset); - offset += 2; - buffer.writeUInt8(this._fraction, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt16LE(this._year, offset); + offset += 2; + buffer.writeUInt16LE(this._month, offset); + offset += 2; + buffer.writeUInt16LE(this._day, offset); + offset += 2; + buffer.writeUInt16LE(this._hour, offset); + offset += 2; + buffer.writeUInt16LE(this._minute, offset); + offset += 2; + buffer.writeUInt16LE(this._second, offset); + offset += 2; + buffer.writeUInt8(this._fraction, offset); - return buffer; - } + return buffer; + } - override toString() { - return `TimeStamp: year=${this._year} month=${this._month} day=${this._day} hour=${this._hour} minute=${this._minute} second=${this._second} fraction=${this._fraction}`; - } + override toString() { + return `TimeStamp: year=${this._year} month=${this._month} day=${this._day} hour=${this._hour} minute=${this._minute} second=${this._second} fraction=${this._fraction}`; + } - as64BitNumber() { - const year = this._year * 100000000000000; - const month = this._month * 1000000000000; - const day = this._day * 10000000000; - const hour = this._hour * 100000000; - const minute = this._minute * 1000000; - const second = this._second * 10000; - const fraction = this._fraction; + as64BitNumber() { + const year = this._year * 100000000000000; + const month = this._month * 1000000000000; + const day = this._day * 10000000000; + const hour = this._hour * 100000000; + const minute = this._minute * 1000000; + const second = this._second * 10000; + const fraction = this._fraction; - return year + month + day + hour + minute + second + fraction; - } + return year + month + day + hour + minute + second + fraction; + } - static now() { - const now = new Date(); - const timestamp = new Timestamp(); - timestamp._year = now.getFullYear(); - timestamp._month = now.getMonth() + 1; - timestamp._day = now.getDate(); - timestamp._hour = now.getHours(); - timestamp._minute = now.getMinutes(); - timestamp._second = now.getSeconds(); - timestamp._fraction = now.getMilliseconds(); + static now() { + const now = new Date(); + const timestamp = new Timestamp(); + timestamp._year = now.getFullYear(); + timestamp._month = now.getMonth() + 1; + timestamp._day = now.getDate(); + timestamp._hour = now.getHours(); + timestamp._minute = now.getMinutes(); + timestamp._second = now.getSeconds(); + timestamp._fraction = now.getMilliseconds(); - return timestamp; - } + return timestamp; + } } diff --git a/packages/shared/errors/ServerError.ts b/packages/shared/errors/ServerError.ts index 041fdd74b..018f2abd9 100644 --- a/packages/shared/errors/ServerError.ts +++ b/packages/shared/errors/ServerError.ts @@ -14,99 +14,99 @@ import { getServerLogger } from "../log.js"; * @property {module:shared/log.ServerLogger} log The logger */ export class ServerError extends Error { - code: number; - /** - * Creates an instance of ServerError. - * @param {string} message The error message - */ - constructor(message: string) { - super(message); - this.code = 500; - this.name = "ServerError"; - } + code: number; + /** + * Creates an instance of ServerError. + * @param {string} message The error message + */ + constructor(message: string) { + super(message); + this.code = 500; + this.name = "ServerError"; + } - /** - * Convert the error to JSON - * - * @returns {{name: string, message: string, stack: string}} - */ - toJSON(): { name: string; message: string; stack: string } { - return { - name: this.name, - message: this.message, - stack: this.stack ?? "", - }; - } + /** + * Convert the error to JSON + * + * @returns {{name: string, message: string, stack: string}} + */ + toJSON(): { name: string; message: string; stack: string } { + return { + name: this.name, + message: this.message, + stack: this.stack ?? "", + }; + } - /** - * Convert the error to a string - * @override - */ - override toString() { - return JSON.stringify(this.toJSON()); - } + /** + * Convert the error to a string + * @override + */ + override toString() { + return JSON.stringify(this.toJSON()); + } - /** - * Convert a JSON object to a ServerError - * - * @static - * @param {{ - * name: string, - * message: string, - * stack: string - * }} json The JSON object - * @returns {ServerError} - */ - static fromJSON(json: { - name: string; - message: string; - stack: string; - }): ServerError { - const { name, message, stack } = json; - const newError = new ServerError(String(message)); - newError.name = name; - newError.stack = stack; - getServerLogger({ level: "error" }).error(json, message); - return newError; - } + /** + * Convert a JSON object to a ServerError + * + * @static + * @param {{ + * name: string, + * message: string, + * stack: string + * }} json The JSON object + * @returns {ServerError} + */ + static fromJSON(json: { + name: string; + message: string; + stack: string; + }): ServerError { + const { name, message, stack } = json; + const newError = new ServerError(String(message)); + newError.name = name; + newError.stack = stack; + getServerLogger({ level: "error" }).error(json, message); + return newError; + } - /** - * @static - * @param {string} jsonString - * @returns {ServerError} - */ - static fromString(jsonString: string): ServerError { - getServerLogger({ level: "error" }).error(jsonString); - return ServerError.fromJSON(JSON.parse(jsonString)); - } + /** + * @static + * @param {string} jsonString + * @returns {ServerError} + */ + static fromString(jsonString: string): ServerError { + getServerLogger({ level: "error" }).error(jsonString); + return ServerError.fromJSON(JSON.parse(jsonString)); + } - /** - * @static - * @param {Error} error - * @returns {ServerError} - */ - static fromError(error: Error): ServerError { - const newError = new ServerError(error.message); - newError.name = error.name; - newError.stack = error.stack; - getServerLogger({ level: "error" }).error(error, error.message); - return newError; - } + /** + * @static + * @param {Error} error + * @returns {ServerError} + */ + static fromError(error: Error): ServerError { + const newError = new ServerError(error.message); + newError.name = error.name; + newError.stack = error.stack; + getServerLogger({ level: "error" }).error(error, error.message); + return newError; + } - /** - * @static - * @param {unknown} error - * @param {string} message - * @returns {ServerError} - */ - static fromUnknown(error: unknown, message: string): ServerError { - if (error instanceof Error) { - return ServerError.fromError(error); - } - if (typeof error === "string") { - return ServerError.fromString(error); - } - getServerLogger({ level: "error" }).error(error, message); - return new ServerError(`Unknown error: ${String(error)}`); - } + /** + * @static + * @param {unknown} error + * @param {string} message + * @returns {ServerError} + */ + static fromUnknown(error: unknown, message: string): ServerError { + if (error instanceof Error) { + return ServerError.fromError(error); + } + if (typeof error === "string") { + return ServerError.fromString(error); + } + getServerLogger({ level: "error" }).error(error, message); + return new ServerError(`Unknown error: ${String(error)}`); + } } diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 554e1f4b4..67173364c 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -8,24 +8,24 @@ export { ServerMessage } from "./src/ServerMessage.js"; export type * from "./src/types.js"; export interface KeypressEvent { - sequence: string; - name: string; - ctrl: boolean; - meta: boolean; - shift: boolean; + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; } export interface ConnectionRecord { - customerId: number; - connectionId: string; - sessionKey: string; - sKey: string; - contextId: string; + customerId: number; + connectionId: string; + sessionKey: string; + sKey: string; + contextId: string; } export { - McosEncryptionPair, - createCommandEncryptionPair, - createDataEncryptionPair, - verifyLegacyCipherSupport, + McosEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, + verifyLegacyCipherSupport, } from "./src/encryption.js"; diff --git a/packages/shared/log.ts b/packages/shared/log.ts index b596953f7..74da6d6d4 100644 --- a/packages/shared/log.ts +++ b/packages/shared/log.ts @@ -1,9 +1,9 @@ import { Logger, LoggerOptions, pino } from "pino"; type ServerLoggerOptions = { - level?: string; - module?: string; - name?: string; + level?: string; + module?: string; + name?: string; }; /** @@ -11,74 +11,74 @@ type ServerLoggerOptions = { * @property {ServerLogger} instance */ export class ServerLogger { - logger: any; - static instance: ServerLogger | undefined; - /** - * Creates an instance of ServerLogger. - * @param {ServerLoggerOptions} options - */ - constructor(options: ServerLoggerOptions) { - this.logger = pino(options); - this.logger.level = options.level ?? "info"; - ServerLogger.instance = this; - } + logger: any; + static instance: ServerLogger | undefined; + /** + * Creates an instance of ServerLogger. + * @param {ServerLoggerOptions} options + */ + constructor(options: ServerLoggerOptions) { + this.logger = pino(options); + this.logger.level = options.level ?? "info"; + ServerLogger.instance = this; + } - /** - * @param {string} message - */ - fatal(message: string) { - this.logger.fatal(message); - } + /** + * @param {string} message + */ + fatal(message: string) { + this.logger.fatal(message); + } - /** - * @param {string} message - */ - error(message: string) { - this.logger.error(message); - } + /** + * @param {string} message + */ + error(message: string) { + this.logger.error(message); + } - /** - * @param {string} message - */ - warn(message: string) { - this.logger.warn(message); - } + /** + * @param {string} message + */ + warn(message: string) { + this.logger.warn(message); + } - /** - * @param {string} message - */ - info(message: string) { - this.logger.info(message); - } + /** + * @param {string} message + */ + info(message: string) { + this.logger.info(message); + } - /** - * @param {string} message - */ - debug(message: string) { - this.logger.debug(message); - } + /** + * @param {string} message + */ + debug(message: string) { + this.logger.debug(message); + } - /** - * @param {string} message - */ - trace(message: string) { - this.logger.trace(message); - } + /** + * @param {string} message + */ + trace(message: string) { + this.logger.trace(message); + } - /** - * @global - * @external pino - * @see {@link https://www.npmjs.com/package/pino} - */ + /** + * @global + * @external pino + * @see {@link https://www.npmjs.com/package/pino} + */ - /** - * @param {module:pino.LoggerOptions} options - * @returns {module:pino.Logger} - */ - child(options: LoggerOptions): Logger { - const child = this.logger.child(options); - return child; - } + /** + * @param {module:pino.LoggerOptions} options + * @returns {module:pino.Logger} + */ + child(options: LoggerOptions): Logger { + const child = this.logger.child(options); + return child; + } } /** @@ -88,17 +88,17 @@ export class ServerLogger { * @return {module:pino.Logger} */ export function getServerLogger(options: ServerLoggerOptions): Logger { - const logLevel = options.level ?? "info"; - const moduleName = options.module ?? "core"; - if (typeof ServerLogger.instance === "undefined") { - ServerLogger.instance = new ServerLogger({ - name: "mcos", - level: logLevel, // This isn't used by the logger, but it's used by the constructor - module: moduleName, - }); - } + const logLevel = options.level ?? "info"; + const moduleName = options.module ?? "core"; + if (typeof ServerLogger.instance === "undefined") { + ServerLogger.instance = new ServerLogger({ + name: "mcos", + level: logLevel, // This isn't used by the logger, but it's used by the constructor + module: moduleName, + }); + } - const child = ServerLogger.instance.child(options); - child.level = logLevel; - return child; + const child = ServerLogger.instance.child(options); + child.level = logLevel; + return child; } diff --git a/packages/shared/messageFactory.ts b/packages/shared/messageFactory.ts index 4ce71b86a..a57baba78 100644 --- a/packages/shared/messageFactory.ts +++ b/packages/shared/messageFactory.ts @@ -16,48 +16,48 @@ import { ServerError } from "./errors/ServerError.js"; * @property {number} Size */ class AbstractSerializable { - internalBuffer: Buffer; - constructor() { - if (this.constructor === AbstractSerializable) { - throw new TypeError( - "Abstract class 'AbstractSerializable' cannot be instantiated directly.", - ); - } - /** @private */ - this.internalBuffer = Buffer.alloc(0); - } - - _doSerialize() { - throw new ServerError("Method '_doSerialize()' must be implemented."); - } - - /** - * @param {Buffer} _buffer - * @returns {AbstractSerializable} - */ - // eslint-disable-next-line no-unused-vars - _doDeserialize(_buffer: Buffer): AbstractSerializable { - throw new ServerError("Method '_doDeserialize()' must be implemented."); - } - - get data() { - return this.internalBuffer; - } - - /** - * @param {Buffer} buffer - */ - setBuffer(buffer: Buffer) { - this.internalBuffer = Buffer.alloc(buffer.length); - this.internalBuffer = buffer; - } - - /** - * @returns {number} - */ - static get Size(): number { - throw new ServerError("Method 'Size' must be implemented."); - } + internalBuffer: Buffer; + constructor() { + if (this.constructor === AbstractSerializable) { + throw new TypeError( + "Abstract class 'AbstractSerializable' cannot be instantiated directly.", + ); + } + /** @private */ + this.internalBuffer = Buffer.alloc(0); + } + + _doSerialize() { + throw new ServerError("Method '_doSerialize()' must be implemented."); + } + + /** + * @param {Buffer} _buffer + * @returns {AbstractSerializable} + */ + // eslint-disable-next-line no-unused-vars + _doDeserialize(_buffer: Buffer): AbstractSerializable { + throw new ServerError("Method '_doDeserialize()' must be implemented."); + } + + get data() { + return this.internalBuffer; + } + + /** + * @param {Buffer} buffer + */ + setBuffer(buffer: Buffer) { + this.internalBuffer = Buffer.alloc(buffer.length); + this.internalBuffer = buffer; + } + + /** + * @returns {number} + */ + static get Size(): number { + throw new ServerError("Method 'Size' must be implemented."); + } } /** @@ -66,43 +66,43 @@ class AbstractSerializable { * @returns {typeof AbstractSerializable} */ const SerializableMixin = ( - Base: typeof AbstractSerializable, + Base: typeof AbstractSerializable, ): typeof AbstractSerializable => - class extends Base { - constructor() { - super(); - } - - serialize() { - return this._doSerialize(); - } - - /** - * @param {Buffer} buffer - * @returns {AbstractSerializable} - */ - deserialize(buffer: Buffer): AbstractSerializable { - return this._doDeserialize(buffer); - } - }; + class extends Base { + constructor() { + super(); + } + + serialize() { + return this._doSerialize(); + } + + /** + * @param {Buffer} buffer + * @returns {AbstractSerializable} + */ + deserialize(buffer: Buffer): AbstractSerializable { + return this._doDeserialize(buffer); + } + }; /** * @param {Buffer} buffer * @returns {string} */ export function deserializeString(buffer: Buffer): string { - try { - const stringLength = buffer.readInt32BE(0); - const stringBuffer = buffer.subarray(4, 4 + (stringLength - 1)); - - const string = stringBuffer.toString("utf8").trim(); - return string; - } catch (error) { - throw ServerError.fromUnknown( - error, - `Error deserializing string from buffer ${buffer.toString("hex")}`, - ); - } + try { + const stringLength = buffer.readInt32BE(0); + const stringBuffer = buffer.subarray(4, 4 + (stringLength - 1)); + + const string = stringBuffer.toString("utf8").trim(); + return string; + } catch (error) { + throw ServerError.fromUnknown( + error, + `Error deserializing string from buffer ${buffer.toString("hex")}`, + ); + } } /** @@ -113,17 +113,17 @@ export function deserializeString(buffer: Buffer): string { * @returns {number} */ export function serializeString( - string: string, - targetBuffer: Buffer, - offset: number, + string: string, + targetBuffer: Buffer, + offset: number, ): number { - const buffer = Buffer.alloc(4 + string.length + 1); - buffer.writeInt32BE(string.length + 1, 0); - const stringToWrite = string + "\0"; - buffer.write(stringToWrite, 4, stringToWrite.length, "utf8"); - buffer.copy(targetBuffer, offset); - offset += buffer.length; - return offset; + const buffer = Buffer.alloc(4 + string.length + 1); + buffer.writeInt32BE(string.length + 1, 0); + const stringToWrite = string + "\0"; + buffer.write(stringToWrite, 4, stringToWrite.length, "utf8"); + buffer.copy(targetBuffer, offset); + offset += buffer.length; + return offset; } /** @@ -135,15 +135,15 @@ export function serializeString( * @returns {number} */ export function serializeStringRaw( - string: string, - targetBuffer: Buffer, - offset: number, - length: number, + string: string, + targetBuffer: Buffer, + offset: number, + length: number, ): number { - const stringToWrite = string; - targetBuffer.write(stringToWrite, offset, string.length, "utf8"); - offset += stringToWrite.length; - return offset; + const stringToWrite = string; + targetBuffer.write(stringToWrite, offset, string.length, "utf8"); + offset += stringToWrite.length; + return offset; } /** @@ -154,54 +154,52 @@ export function serializeStringRaw( * */ class legacyHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; - length: any; - constructor() { - super(); - this._size = 4; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - } - - /** - * @param {Buffer} buffer - */ - override _doDeserialize(buffer: Buffer) { - if (buffer.length < 4) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - } catch (error) { - throw new ServerError( - `Error deserializing buffer: ${String(error)}`, - ); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - return buffer; - } - - override toString() { - return `LegacyHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - })}`; - } - - static override get Size() { - return 4; - } + _size: number; + id: number; + length: any; + constructor() { + super(); + this._size = 4; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + } + + /** + * @param {Buffer} buffer + */ + override _doDeserialize(buffer: Buffer) { + if (buffer.length < 4) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + } catch (error) { + throw new ServerError(`Error deserializing buffer: ${String(error)}`); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + return buffer; + } + + override toString() { + return `LegacyHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + })}`; + } + + static override get Size() { + return 4; + } } /** @@ -212,49 +210,47 @@ class legacyHeader extends SerializableMixin(AbstractSerializable) { * - 2 bytes - gameMessageLength */ export class GameMessageHeader extends legacyHeader { - _gameMessageId: number; // 2 bytes - _gameMessageLength: number; // 2 bytes - - constructor(gameMessageId: number) { - super(); - this._size = 8; - this.id = 0x1101; // 2 bytes - this._gameMessageId = gameMessageId; // 2 bytes - this._gameMessageLength = 0; // 2 bytes - } - - size() { - return 8; - } - - deserialize(buffer: Buffer) { - if (buffer.length < 8) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - this._gameMessageId = buffer.readInt16BE(4); - this._gameMessageLength = buffer.readInt16BE(6); - } catch (error) { - throw new ServerError( - `Error deserializing buffer: ${String(error)}`, - ); - } - return this; - } - - serialize() { - const buffer = Buffer.alloc(8); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - buffer.writeInt16BE(this._gameMessageId, 4); - buffer.writeInt16BE(this._gameMessageLength, 6); - return buffer; - } + _gameMessageId: number; // 2 bytes + _gameMessageLength: number; // 2 bytes + + constructor(gameMessageId: number) { + super(); + this._size = 8; + this.id = 0x1101; // 2 bytes + this._gameMessageId = gameMessageId; // 2 bytes + this._gameMessageLength = 0; // 2 bytes + } + + size() { + return 8; + } + + deserialize(buffer: Buffer) { + if (buffer.length < 8) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + this._gameMessageId = buffer.readInt16BE(4); + this._gameMessageLength = buffer.readInt16BE(6); + } catch (error) { + throw new ServerError(`Error deserializing buffer: ${String(error)}`); + } + return this; + } + + serialize() { + const buffer = Buffer.alloc(8); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + buffer.writeInt16BE(this._gameMessageId, 4); + buffer.writeInt16BE(this._gameMessageLength, 6); + return buffer; + } } /** @@ -268,73 +264,71 @@ export class GameMessageHeader extends legacyHeader { * @mixin {SerializableMixin} */ export class NPSHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; // 2 bytes - length: number; // 2 bytes - version: number; // 2 bytes - reserved: number; // 2 bytes - checksum: number; // 4 bytes - constructor() { - super(); - this._size = 12; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - this.version = 257; // 2 bytes (0x0101) - this.reserved = 0; // 2 bytes - this.checksum = 0; // 4 bytes - } - - /** - * @param {Buffer} buffer - * @returns {NPSHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): NPSHeader { - if (buffer.length < this._size) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - } catch (error) { - throw new ServerError( - `Error deserializing buffer: ${String(error)}`, - ); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - buffer.writeInt16BE(this.version, 4); - buffer.writeInt16BE(this.reserved, 6); - buffer.writeInt32BE(this.checksum, 8); - return buffer; - } - - static size() { - return 12; - } - - static override get Size() { - return 12; - } - - override toString() { - return `NPSHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - version: this.version, - reserved: this.reserved, - checksum: this.checksum, - })}`; - } + _size: number; + id: number; // 2 bytes + length: number; // 2 bytes + version: number; // 2 bytes + reserved: number; // 2 bytes + checksum: number; // 4 bytes + constructor() { + super(); + this._size = 12; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + this.version = 257; // 2 bytes (0x0101) + this.reserved = 0; // 2 bytes + this.checksum = 0; // 4 bytes + } + + /** + * @param {Buffer} buffer + * @returns {NPSHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + override _doDeserialize(buffer: Buffer): NPSHeader { + if (buffer.length < this._size) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + } catch (error) { + throw new ServerError(`Error deserializing buffer: ${String(error)}`); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + buffer.writeInt16BE(this.version, 4); + buffer.writeInt16BE(this.reserved, 6); + buffer.writeInt32BE(this.checksum, 8); + return buffer; + } + + static size() { + return 12; + } + + static override get Size() { + return 12; + } + + override toString() { + return `NPSHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + version: this.version, + reserved: this.reserved, + checksum: this.checksum, + })}`; + } } /** @@ -345,67 +339,65 @@ export class NPSHeader extends SerializableMixin(AbstractSerializable) { * - 1 byte - flags */ export class serverHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - length: any; - mcoSig: string; - sequence: number; - flags: number; - constructor() { - super(); - this._size = 11; - this.length = this._size; // 2 bytes - this.mcoSig = "TOMC"; // 4 bytes - this.sequence = 0; // 4 bytes - this.flags = 0; // 1 byte - } - - size() { - return this._size; - } - - /** - * @param {Buffer} buffer - * @returns {serverHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): serverHeader { - if (buffer.length < this._size) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.length = buffer.readInt16LE(0); - this.mcoSig = buffer.toString("utf8", 2, 6); - this.sequence = buffer.readInt32LE(6); - this.flags = buffer.readInt8(10); - } catch (error) { - throw new ServerError( - `Error deserializing buffer: ${String(error)}`, - ); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16LE(this.length, 0); - buffer.write(this.mcoSig, 2, 6, "utf8"); - buffer.writeInt32LE(this.sequence, 6); - buffer.writeInt8(this.flags, 10); - return buffer; - } - - override toString() { - return `ServerHeader: ${JSON.stringify({ - length: this.length, - mcoSig: this.mcoSig, - sequence: this.sequence, - flags: this.flags, - })}`; - } + _size: number; + length: any; + mcoSig: string; + sequence: number; + flags: number; + constructor() { + super(); + this._size = 11; + this.length = this._size; // 2 bytes + this.mcoSig = "TOMC"; // 4 bytes + this.sequence = 0; // 4 bytes + this.flags = 0; // 1 byte + } + + size() { + return this._size; + } + + /** + * @param {Buffer} buffer + * @returns {serverHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + override _doDeserialize(buffer: Buffer): serverHeader { + if (buffer.length < this._size) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.length = buffer.readInt16LE(0); + this.mcoSig = buffer.toString("utf8", 2, 6); + this.sequence = buffer.readInt32LE(6); + this.flags = buffer.readInt8(10); + } catch (error) { + throw new ServerError(`Error deserializing buffer: ${String(error)}`); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16LE(this.length, 0); + buffer.write(this.mcoSig, 2, 6, "utf8"); + buffer.writeInt32LE(this.sequence, 6); + buffer.writeInt8(this.flags, 10); + return buffer; + } + + override toString() { + return `ServerHeader: ${JSON.stringify({ + length: this.length, + mcoSig: this.mcoSig, + sequence: this.sequence, + flags: this.flags, + })}`; + } } /** @@ -414,58 +406,58 @@ export class serverHeader extends SerializableMixin(AbstractSerializable) { * @mixin {SerializableMixin} */ export class LegacyMessage extends SerializableMixin(AbstractSerializable) { - _header: legacyHeader; - constructor() { - super(); - this._header = new legacyHeader(); - } - - /** - * @param {Buffer} buffer - * @returns {LegacyMessage} - */ - override _doDeserialize(buffer: Buffer): LegacyMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } - - deserialize(buffer: Buffer) { - return this._doDeserialize(buffer); - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - super.data.copy(buffer, this._header._size); - return buffer; - } - - serialize() { - return this._doSerialize(); - } - - /** - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + 4; - } - - asJSON() { - return { - header: this._header, - data: super.data.toString("hex"), - }; - } - - override toString() { - return `LegacyMessage: ${JSON.stringify({ - header: this._header.toString(), - data: super.data.toString("hex"), - })}`; - } + _header: legacyHeader; + constructor() { + super(); + this._header = new legacyHeader(); + } + + /** + * @param {Buffer} buffer + * @returns {LegacyMessage} + */ + override _doDeserialize(buffer: Buffer): LegacyMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } + + deserialize(buffer: Buffer) { + return this._doDeserialize(buffer); + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + super.data.copy(buffer, this._header._size); + return buffer; + } + + serialize() { + return this._doSerialize(); + } + + /** + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + 4; + } + + asJSON() { + return { + header: this._header, + data: super.data.toString("hex"), + }; + } + + override toString() { + return `LegacyMessage: ${JSON.stringify({ + header: this._header.toString(), + data: super.data.toString("hex"), + })}`; + } } /** @@ -474,39 +466,39 @@ export class LegacyMessage extends SerializableMixin(AbstractSerializable) { * @mixin {SerializableMixin} */ export class NPSMessage extends SerializableMixin(AbstractSerializable) { - _header: NPSHeader; - constructor() { - super(); - this._header = new NPSHeader(); - } - - /** - * @param {Buffer} buffer - * @returns {NPSMessage} - */ - override _doDeserialize(buffer: Buffer): NPSMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } - - serialize() { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } - - size() { - return this._header.length + this.data.length; - } - - override toString() { - return `NPSMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } + _header: NPSHeader; + constructor() { + super(); + this._header = new NPSHeader(); + } + + /** + * @param {Buffer} buffer + * @returns {NPSMessage} + */ + override _doDeserialize(buffer: Buffer): NPSMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } + + serialize() { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } + + size() { + return this._header.length + this.data.length; + } + + override toString() { + return `NPSMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString("hex"), + })}`; + } } /** @@ -516,95 +508,95 @@ export class NPSMessage extends SerializableMixin(AbstractSerializable) { * @mixin {SerializableMixin} */ export class SerializedBuffer extends SerializableMixin(AbstractSerializable) { - constructor() { - super(); - } - - /** - * @param {Buffer} buffer - * @returns {SerializedBuffer} - */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { - this.setBuffer(buffer); - return this; - } - - serialize() { - return this.data; - } - - override toString() { - return `SerializedBuffer: ${this.serialize().toString("hex")}`; - } - - size() { - return this.data.length; - } + constructor() { + super(); + } + + /** + * @param {Buffer} buffer + * @returns {SerializedBuffer} + */ + override _doDeserialize(buffer: Buffer): SerializedBuffer { + this.setBuffer(buffer); + return this; + } + + serialize() { + return this.data; + } + + override toString() { + return `SerializedBuffer: ${this.serialize().toString("hex")}`; + } + + size() { + return this.data.length; + } } export class GameMessage extends SerializedBuffer { - _header: GameMessageHeader; - _recordData: Buffer; - constructor(gameMessageId: number) { - super(); - this._header = new GameMessageHeader(gameMessageId); - this._recordData = Buffer.alloc(0); - } - - setRecordData(buffer: Buffer) { - this._recordData = Buffer.alloc(buffer.length); - buffer.copy(this._recordData); - } - - /** @deprecated - Use setRecordData instead */ - override setBuffer(buffer: Buffer) { - this._recordData = Buffer.alloc(buffer.length); - buffer.copy(this._recordData); - } - - /** @deprecated - Use deserialize instead */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { - this._header._doDeserialize(buffer); - this._recordData = Buffer.alloc(this._header._gameMessageLength - 4); - buffer.copy(this._recordData, 0, 8); - return this; - } - - deserialize(buffer: Buffer) { - this._header._doDeserialize(buffer); - this._recordData = Buffer.alloc(this._header.length - 4); - buffer.copy(this._recordData, 0, 8); - return this; - } - - /** @deprecated - Use serialize instead */ - override _doSerialize(): void { - this._header._gameMessageLength = 4 + this._recordData.length; - this._header.length = this._header._gameMessageLength + 4; - const buffer = Buffer.alloc(this._header.length); - let offset = 0; // offset is 0 - this._header.serialize().copy(buffer); - offset += this._header.size(); // offset is 8 - - this._recordData.copy(buffer, offset); - this.setBuffer(buffer); - } - - override serialize() { - this._header._gameMessageLength = 4 + this._recordData.length; - this._header.length = this._header._gameMessageLength + 4; - const buffer = Buffer.alloc(this._header.length); - let offset = 0; // offset is 0 - this._header.serialize().copy(buffer); - offset += this._header.size(); // offset is 8 - - this._recordData.copy(buffer, offset); - return buffer; - } - - override toString() { - return `GameMessage: ${this.serialize().toString("hex")})}`; - } + _header: GameMessageHeader; + _recordData: Buffer; + constructor(gameMessageId: number) { + super(); + this._header = new GameMessageHeader(gameMessageId); + this._recordData = Buffer.alloc(0); + } + + setRecordData(buffer: Buffer) { + this._recordData = Buffer.alloc(buffer.length); + buffer.copy(this._recordData); + } + + /** @deprecated - Use setRecordData instead */ + override setBuffer(buffer: Buffer) { + this._recordData = Buffer.alloc(buffer.length); + buffer.copy(this._recordData); + } + + /** @deprecated - Use deserialize instead */ + override _doDeserialize(buffer: Buffer): SerializedBuffer { + this._header._doDeserialize(buffer); + this._recordData = Buffer.alloc(this._header._gameMessageLength - 4); + buffer.copy(this._recordData, 0, 8); + return this; + } + + deserialize(buffer: Buffer) { + this._header._doDeserialize(buffer); + this._recordData = Buffer.alloc(this._header.length - 4); + buffer.copy(this._recordData, 0, 8); + return this; + } + + /** @deprecated - Use serialize instead */ + override _doSerialize(): void { + this._header._gameMessageLength = 4 + this._recordData.length; + this._header.length = this._header._gameMessageLength + 4; + const buffer = Buffer.alloc(this._header.length); + let offset = 0; // offset is 0 + this._header.serialize().copy(buffer); + offset += this._header.size(); // offset is 8 + + this._recordData.copy(buffer, offset); + this.setBuffer(buffer); + } + + override serialize() { + this._header._gameMessageLength = 4 + this._recordData.length; + this._header.length = this._header._gameMessageLength + 4; + const buffer = Buffer.alloc(this._header.length); + let offset = 0; // offset is 0 + this._header.serialize().copy(buffer); + offset += this._header.size(); // offset is 8 + + this._recordData.copy(buffer, offset); + return buffer; + } + + override toString() { + return `GameMessage: ${this.serialize().toString("hex")})}`; + } } /** @@ -613,255 +605,255 @@ export class GameMessage extends SerializedBuffer { * @mixin {SerializableMixin} */ export class ListMessage extends SerializedBuffer { - _msgNo: number; - _listCount: number; - _shouldExpectMoreMessages: boolean; - _list: SerializedBuffer[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._listCount = 0; // 2 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {SerializedBuffer[]} */ - this._list = []; // this.itemsType bytes each - } - - /** - * @param {SerializedBuffer} item - */ - add(item: SerializedBuffer) { - this._list.push(item); - this._listCount++; - } - - override serialize() { - let neededSize; - if (this._list.length === 0) { - neededSize = 5; - } else { - neededSize = 5 + this._list.length * this._list[0].size(); - } - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16BE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeInt8(this._listCount, offset); - offset += 1; // offset is 3 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 4 - for (const item of this._list) { - item.serialize().copy(buffer, offset); - offset += item.size(); - } - // offset is now 4 + this._list.length * this._list[0].size() - return buffer; - } - - override size() { - return 5 + this._list.length * this._list[0].size(); - } - - override toString() { - return `ListMessage: msgNo=${this._msgNo} listCount=${this._listCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} list=${this._list}`; - } + _msgNo: number; + _listCount: number; + _shouldExpectMoreMessages: boolean; + _list: SerializedBuffer[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._listCount = 0; // 2 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {SerializedBuffer[]} */ + this._list = []; // this.itemsType bytes each + } + + /** + * @param {SerializedBuffer} item + */ + add(item: SerializedBuffer) { + this._list.push(item); + this._listCount++; + } + + override serialize() { + let neededSize; + if (this._list.length === 0) { + neededSize = 5; + } else { + neededSize = 5 + this._list.length * this._list[0].size(); + } + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16BE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeInt8(this._listCount, offset); + offset += 1; // offset is 3 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 4 + for (const item of this._list) { + item.serialize().copy(buffer, offset); + offset += item.size(); + } + // offset is now 4 + this._list.length * this._list[0].size() + return buffer; + } + + override size() { + return 5 + this._list.length * this._list[0].size(); + } + + override toString() { + return `ListMessage: msgNo=${this._msgNo} listCount=${this._listCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} list=${this._list}`; + } } export class MessageHeader extends SerializedBuffer { - _size: number; - _messageId: number; - _messageLength: number; - constructor() { - super(); - this._size = 4; - this._messageId = 0; // 4 bytes - this._messageLength = 0; // 4 bytes - } - - get messageId() { - return this._messageId; - } - - get messageLength() { - return this._messageLength; - } - - serializeSizeOf() { - return this._size; - } - - override size() { - return this._size; - } - - get id() { - return this._messageId; - } - - get length() { - return this._messageLength; - } - - /** - * @param {Buffer} buffer - * @returns {MessageHeader} - */ - deserialize(buffer: Buffer): MessageHeader { - this._messageId = buffer.readInt16BE(0); - this._messageLength = buffer.readInt16BE(2); - return this; - } - - override serialize() { - const buffer = Buffer.alloc(4); - buffer.writeInt16BE(this._messageId, 0); - buffer.writeInt16BE(this._messageLength, 2); - return buffer; - } - - /** - * @param {Buffer} buffer - * @returns {MessageHeader} - */ - override _doDeserialize(buffer: Buffer): MessageHeader { - return this.deserialize(buffer); - } - - override _doSerialize() { - return this.serialize(); - } - - override toString() { - return `MessageHeader: ${JSON.stringify({ - messageId: this._messageId, - messageLength: this._messageLength, - })}`; - } + _size: number; + _messageId: number; + _messageLength: number; + constructor() { + super(); + this._size = 4; + this._messageId = 0; // 4 bytes + this._messageLength = 0; // 4 bytes + } + + get messageId() { + return this._messageId; + } + + get messageLength() { + return this._messageLength; + } + + serializeSizeOf() { + return this._size; + } + + override size() { + return this._size; + } + + get id() { + return this._messageId; + } + + get length() { + return this._messageLength; + } + + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + deserialize(buffer: Buffer): MessageHeader { + this._messageId = buffer.readInt16BE(0); + this._messageLength = buffer.readInt16BE(2); + return this; + } + + override serialize() { + const buffer = Buffer.alloc(4); + buffer.writeInt16BE(this._messageId, 0); + buffer.writeInt16BE(this._messageLength, 2); + return buffer; + } + + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + override _doDeserialize(buffer: Buffer): MessageHeader { + return this.deserialize(buffer); + } + + override _doSerialize() { + return this.serialize(); + } + + override toString() { + return `MessageHeader: ${JSON.stringify({ + messageId: this._messageId, + messageLength: this._messageLength, + })}`; + } } export class MessageBuffer extends SerializedBuffer { - _header: MessageHeader; - _buffer: Buffer; - constructor() { - super(); - this._header = new MessageHeader(); - this._buffer = Buffer.alloc(4); - } - - /** - * @param {number} id - The ID of the message - * @param {Buffer} buffer - The buffer to deserialize - * @returns {MessageBuffer} - */ - static createGameMessage(id: number, buffer: Buffer): MessageBuffer { - const message = new MessageBuffer(); - message._header._messageId = id; - message.buffer = buffer; - return message; - } - - get messageId() { - return this._header.messageId; - } - - get messageLength() { - return this._header.messageLength; - } - - override get data() { - return this._buffer; - } - - override set data(buffer) { - this.buffer = buffer; - } - - /** - * @param {Buffer} buffer - */ - set buffer(buffer: Buffer) { - // const log = getServerLogger({ module: "MessageBuffer" }); - // log.level = getServerConfiguration({}).logLevel ?? "info"; - - this._buffer = Buffer.alloc(buffer.length); - this._buffer = buffer; - this._header._messageLength = 4 + buffer.length; - // log.debug(`Message length: ${this._header._messageLength}`); - // log.debug(`Buffer length: ${this._buffer.length}`); - // Pad the buffer to a multiple of 8 bytes - // let extraBytes = 0; - // const x = (this._buffer.length + 4) % 8; - // extraBytes = 8 - x; - // log.debug(`Extra bytes: ${extraBytes}`); - // if (extraBytes !== 0) { - // this._buffer = Buffer.concat([ - // this._buffer, - // Buffer.alloc(extraBytes), - // ]); - // log.debug(`Buffer length: ${this._buffer.length}`); - this._header._messageLength = this._buffer.length + 4; - // log.debug(`Message length: ${this._header._messageLength}`); - // } - } - - /** @param {Buffer} buffer */ - override setBuffer(buffer: Buffer) { - return (this.buffer = buffer); - } - - get buffer() { - return this._buffer; - } - - serializeSizeOf() { - return 4 + this._buffer.length; - } - - /** - * @param {Buffer} buffer - * @returns {MessageBuffer} - */ - deserialize(buffer: Buffer): MessageBuffer { - this._header.deserialize(buffer.subarray(0, 8)); - if (buffer.length < 4 + this._header.messageLength) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - this.buffer = buffer.subarray(4); - return this; - } - - override serialize() { - const buffer = Buffer.alloc(4 + this._buffer.length); - if (this.buffer.length < 0) { - throw new ServerError( - `Buffer length ${this.buffer.length} is too short to serialize`, - ); - } - if (this.messageId <= 0) { - throw new ServerError( - `Message ID ${this.messageId} is invalid to serialize`, - ); - } - this._header.serialize().copy(buffer); - this._buffer.copy(buffer, 4); - return buffer; - } - - override toString() { - return `MessageBuffer: ${JSON.stringify({ - header: this._header.toString(), - bufferLength: this._buffer.length, - buffer: this._buffer.toString("hex"), - })}`; - } - - asJSON() { - return { - header: this._header, - buffer: this._buffer.toString("hex"), - }; - } + _header: MessageHeader; + _buffer: Buffer; + constructor() { + super(); + this._header = new MessageHeader(); + this._buffer = Buffer.alloc(4); + } + + /** + * @param {number} id - The ID of the message + * @param {Buffer} buffer - The buffer to deserialize + * @returns {MessageBuffer} + */ + static createGameMessage(id: number, buffer: Buffer): MessageBuffer { + const message = new MessageBuffer(); + message._header._messageId = id; + message.buffer = buffer; + return message; + } + + get messageId() { + return this._header.messageId; + } + + get messageLength() { + return this._header.messageLength; + } + + override get data() { + return this._buffer; + } + + override set data(buffer) { + this.buffer = buffer; + } + + /** + * @param {Buffer} buffer + */ + set buffer(buffer: Buffer) { + // const log = getServerLogger({ module: "MessageBuffer" }); + // log.level = getServerConfiguration({}).logLevel ?? "info"; + + this._buffer = Buffer.alloc(buffer.length); + this._buffer = buffer; + this._header._messageLength = 4 + buffer.length; + // log.debug(`Message length: ${this._header._messageLength}`); + // log.debug(`Buffer length: ${this._buffer.length}`); + // Pad the buffer to a multiple of 8 bytes + // let extraBytes = 0; + // const x = (this._buffer.length + 4) % 8; + // extraBytes = 8 - x; + // log.debug(`Extra bytes: ${extraBytes}`); + // if (extraBytes !== 0) { + // this._buffer = Buffer.concat([ + // this._buffer, + // Buffer.alloc(extraBytes), + // ]); + // log.debug(`Buffer length: ${this._buffer.length}`); + this._header._messageLength = this._buffer.length + 4; + // log.debug(`Message length: ${this._header._messageLength}`); + // } + } + + /** @param {Buffer} buffer */ + override setBuffer(buffer: Buffer) { + return (this.buffer = buffer); + } + + get buffer() { + return this._buffer; + } + + serializeSizeOf() { + return 4 + this._buffer.length; + } + + /** + * @param {Buffer} buffer + * @returns {MessageBuffer} + */ + deserialize(buffer: Buffer): MessageBuffer { + this._header.deserialize(buffer.subarray(0, 8)); + if (buffer.length < 4 + this._header.messageLength) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + this.buffer = buffer.subarray(4); + return this; + } + + override serialize() { + const buffer = Buffer.alloc(4 + this._buffer.length); + if (this.buffer.length < 0) { + throw new ServerError( + `Buffer length ${this.buffer.length} is too short to serialize`, + ); + } + if (this.messageId <= 0) { + throw new ServerError( + `Message ID ${this.messageId} is invalid to serialize`, + ); + } + this._header.serialize().copy(buffer); + this._buffer.copy(buffer, 4); + return buffer; + } + + override toString() { + return `MessageBuffer: ${JSON.stringify({ + header: this._header.toString(), + bufferLength: this._buffer.length, + buffer: this._buffer.toString("hex"), + })}`; + } + + asJSON() { + return { + header: this._header, + buffer: this._buffer.toString("hex"), + }; + } } /** @@ -870,54 +862,54 @@ export class MessageBuffer extends SerializedBuffer { * @mixin {SerializableMixin} */ export class OldServerMessage extends SerializedBuffer { - _header: serverHeader; - _msgNo: number; - constructor() { - super(); - this._header = new serverHeader(); - this._msgNo = 0; // 2 bytes - } - - override size(): number { - return this._header.length + this.data.length; - } - - /** - * @param {Buffer} buffer - * @returns {OldServerMessage} - */ - override _doDeserialize(buffer: Buffer): OldServerMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - if (this.data.length > 2) { - this._msgNo = this.data.readInt16LE(0); - } - return this; - } - - override serialize() { - const buffer = Buffer.alloc(this._header.length + 2); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } - - /** - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + this._header._size - 2; - } - - updateMsgNo() { - this._msgNo = this.data.readInt16LE(0); - } - - override toString() { - return `ServerMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } + _header: serverHeader; + _msgNo: number; + constructor() { + super(); + this._header = new serverHeader(); + this._msgNo = 0; // 2 bytes + } + + override size(): number { + return this._header.length + this.data.length; + } + + /** + * @param {Buffer} buffer + * @returns {OldServerMessage} + */ + override _doDeserialize(buffer: Buffer): OldServerMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + if (this.data.length > 2) { + this._msgNo = this.data.readInt16LE(0); + } + return this; + } + + override serialize() { + const buffer = Buffer.alloc(this._header.length + 2); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } + + /** + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + this._header._size - 2; + } + + updateMsgNo() { + this._msgNo = this.data.readInt16LE(0); + } + + override toString() { + return `ServerMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString("hex"), + })}`; + } } diff --git a/packages/shared/package.json b/packages/shared/package.json index 52f3f9ace..a9dbcf93e 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,34 +1,34 @@ { - "name": "rusty-motors-shared", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - }, - "./test": { - "import": "./test/index.js", - "require": "./test/index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "fastify": "^4.27.0", - "pino": "^9.0.0", - "pino-pretty": "^11.0.0", - "vitest": "^1.6.0" - }, - "directories": { - "test": "test" - }, - "description": "" + "name": "rusty-motors-shared", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + }, + "./test": { + "import": "./test/index.js", + "require": "./test/index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "fastify": "^4.27.0", + "pino": "^9.0.0", + "pino-pretty": "^11.0.0", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" } diff --git a/packages/shared/src/BaseSerialized.ts b/packages/shared/src/BaseSerialized.ts index d0e85cd0c..0ec4bde99 100644 --- a/packages/shared/src/BaseSerialized.ts +++ b/packages/shared/src/BaseSerialized.ts @@ -1,12 +1,12 @@ import { ServerError } from "../errors/ServerError.js"; export interface Serializable { - data: Buffer; - serialize(): Buffer; - deserialize(buffer: Buffer): Serializable; - length: number; - toString(): string; - asHex(): string; + data: Buffer; + serialize(): Buffer; + deserialize(buffer: Buffer): Serializable; + length: number; + toString(): string; + asHex(): string; } /** @@ -14,37 +14,37 @@ export interface Serializable { * Just a wrapper around a buffer */ export class BaseSerialized implements Serializable { - protected _data: Buffer; + protected _data: Buffer; - constructor(data?: Buffer) { - this._data = data || Buffer.alloc(0); - } + constructor(data?: Buffer) { + this._data = data || Buffer.alloc(0); + } - get data(): Buffer { - return this._data; - } + get data(): Buffer { + return this._data; + } - set data(data: Buffer) { - this._data = Buffer.from(data); - } + set data(data: Buffer) { + this._data = Buffer.from(data); + } - serialize(): Buffer { - throw new ServerError("Not implemented"); - } + serialize(): Buffer { + throw new ServerError("Not implemented"); + } - deserialize(buffer: Buffer): Serializable { - throw new ServerError("Not implemented"); - } + deserialize(_buffer: Buffer): Serializable { + throw new ServerError("Not implemented"); + } - get length(): number { - return this._data.length; - } + get length(): number { + return this._data.length; + } - toString(): string { - return this.asHex(); - } + toString(): string { + return this.asHex(); + } - asHex(): string { - return this._data.toString("hex"); - } + asHex(): string { + return this._data.toString("hex"); + } } diff --git a/packages/shared/src/NetworkMessage.ts b/packages/shared/src/NetworkMessage.ts index 577d15b16..cc4624216 100644 --- a/packages/shared/src/NetworkMessage.ts +++ b/packages/shared/src/NetworkMessage.ts @@ -11,58 +11,58 @@ import { SerializedBuffer } from "./SerializedBuffer.js"; * - data */ export class NetworkMessage extends SerializedBuffer { - private _messageId: number; - version: number = 0x101; - reserved: number = 0x0000; - private _checksum: number = 0x00000000; - constructor(messageId: number, data?: Buffer) { - super(data); - this._messageId = messageId; - } - override serialize() { - const buffer = Buffer.alloc(12 + this._data.length); - buffer.writeUInt16BE(this._messageId, 0); - buffer.writeUInt16BE(this._data.length + 12, 2); - buffer.writeUInt16BE(this.version, 4); - buffer.writeUInt16BE(this.reserved, 6); - buffer.writeUInt32BE(this._data.length + 12, 8); - this._data.copy(buffer, 12); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 12) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16BE(2); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._messageId = buffer.readUInt16BE(0); - // Skip the length, we already know it - this.version = buffer.readUInt16BE(4); - this.reserved = buffer.readUInt16BE(6); - this._checksum = buffer.readUInt32BE(8); - this._data = buffer.subarray(4, 4 + length); - return this; - } + private _messageId: number; + version: number = 0x101; + reserved: number = 0x0000; + private _checksum: number = 0x00000000; + constructor(messageId: number, data?: Buffer) { + super(data); + this._messageId = messageId; + } + override serialize() { + const buffer = Buffer.alloc(12 + this._data.length); + buffer.writeUInt16BE(this._messageId, 0); + buffer.writeUInt16BE(this._data.length + 12, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(this.reserved, 6); + buffer.writeUInt32BE(this._data.length + 12, 8); + this._data.copy(buffer, 12); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 12) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16BE(2); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._messageId = buffer.readUInt16BE(0); + // Skip the length, we already know it + this.version = buffer.readUInt16BE(4); + this.reserved = buffer.readUInt16BE(6); + this._checksum = buffer.readUInt32BE(8); + this._data = buffer.subarray(4, 4 + length); + return this; + } - override set data(data: Buffer) { - this._data = Buffer.from(data); - } + override set data(data: Buffer) { + this._data = Buffer.from(data); + } - get messageId(): number { - return this._messageId; - } + get messageId(): number { + return this._messageId; + } - override get length(): number { - return 12 + this._data.length; - } + override get length(): number { + return 12 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/shared/src/RawMessage.ts b/packages/shared/src/RawMessage.ts index 22e2e5890..71367250d 100644 --- a/packages/shared/src/RawMessage.ts +++ b/packages/shared/src/RawMessage.ts @@ -5,44 +5,44 @@ import { SerializedBuffer } from "./SerializedBuffer.js"; * A serialized buffer, prefixed with a 2-byte message id and a 2-byte total length. */ export class RawMessage extends SerializedBuffer { - private _messageId: number; - constructor(messageId: number, data?: Buffer) { - super(data); - this._messageId = messageId; - } - override serialize() { - const buffer = Buffer.alloc(4 + this._data.length); - buffer.writeUInt16BE(this._messageId, 0); - buffer.writeUInt16BE(this._data.length + 4, 2); - this._data.copy(buffer, 4); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 4) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16BE(2); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._messageId = buffer.readUInt16BE(0); - this._data = buffer.subarray(4, 4 + length); - return this; - } + private _messageId: number; + constructor(messageId: number, data?: Buffer) { + super(data); + this._messageId = messageId; + } + override serialize() { + const buffer = Buffer.alloc(4 + this._data.length); + buffer.writeUInt16BE(this._messageId, 0); + buffer.writeUInt16BE(this._data.length + 4, 2); + this._data.copy(buffer, 4); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 4) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16BE(2); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._messageId = buffer.readUInt16BE(0); + this._data = buffer.subarray(4, 4 + length); + return this; + } - get messageId(): number { - return this._messageId; - } + get messageId(): number { + return this._messageId; + } - override get length(): number { - return 4 + this._data.length; - } + override get length(): number { + return 4 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/shared/src/SerializedBuffer.ts b/packages/shared/src/SerializedBuffer.ts index 7ac437a15..c4fda93a4 100644 --- a/packages/shared/src/SerializedBuffer.ts +++ b/packages/shared/src/SerializedBuffer.ts @@ -1,40 +1,35 @@ -import { BaseSerialized } from "./BaseSerialized.js"; import { ServerError } from "../errors/ServerError.js"; +import { BaseSerialized } from "./BaseSerialized.js"; /** * A serialized buffer, prefixed with its 2-byte length. */ export class SerializedBuffer extends BaseSerialized { - constructor(data?: Buffer) { - super(data); - } - override serialize() { - try { - const buffer = Buffer.alloc(2 + this._data.length); - buffer.writeUInt16BE(this._data.length, 0); - this._data.copy(buffer, 2); - return buffer; - } catch (error) { - throw ServerError.fromUnknown(error, "Unable to serialize buffer"); - } - } - override deserialize(buffer: Buffer) { - try { - const length = buffer.readUInt16BE(0); - if (buffer.length < 2 + length) { - throw new ServerError( - `Expected buffer of length ${2 + length}, got ${ - buffer.length - }`, - ); - } - this._data = buffer.subarray(2, 2 + length); - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Unable to deserialize buffer", - ); - } - } + constructor(data?: Buffer) { + super(data); + } + override serialize() { + try { + const buffer = Buffer.alloc(2 + this._data.length); + buffer.writeUInt16BE(this._data.length, 0); + this._data.copy(buffer, 2); + return buffer; + } catch (error) { + throw ServerError.fromUnknown(error, "Unable to serialize buffer"); + } + } + override deserialize(buffer: Buffer) { + try { + const length = buffer.readUInt16BE(0); + if (buffer.length < 2 + length) { + throw new ServerError( + `Expected buffer of length ${2 + length}, got ${buffer.length}`, + ); + } + this._data = buffer.subarray(2, 2 + length); + return this; + } catch (error) { + throw ServerError.fromUnknown(error, "Unable to deserialize buffer"); + } + } } diff --git a/packages/shared/src/ServerMessage.ts b/packages/shared/src/ServerMessage.ts index 852a4191d..fff7b9f40 100644 --- a/packages/shared/src/ServerMessage.ts +++ b/packages/shared/src/ServerMessage.ts @@ -2,19 +2,19 @@ import { ServerError } from "../errors/ServerError.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; class HeaderShim { - private _realObject: ServerMessage; + private _realObject: ServerMessage; - constructor(realObject: ServerMessage) { - this._realObject = realObject; - } + constructor(realObject: ServerMessage) { + this._realObject = realObject; + } - get flags(): number { - return this._realObject.flags; - } + get flags(): number { + return this._realObject.flags; + } - set flags(value: number) { - this._realObject.flags = value; - } + set flags(value: number) { + this._realObject.flags = value; + } } /** @@ -26,70 +26,70 @@ class HeaderShim { * - data */ export class ServerMessage extends SerializedBuffer { - private _signature = "TOMC"; - private _sequence: number = 0; - private _flags: number = 0; - _header: HeaderShim; + private _signature = "TOMC"; + private _sequence: number = 0; + private _flags: number = 0; + _header: HeaderShim; - constructor(sequence: number = 0, flags: number = 0, data?: Buffer) { - super(); - this._sequence = sequence; - this._flags = flags; - this._data = data || Buffer.alloc(0); - this._header = new HeaderShim(this); - } - override serialize() { - const buffer = Buffer.alloc(11 + this._data.length); - buffer.writeInt16LE(this._data.length + 9, 0); - buffer.write(this._signature, 2); - buffer.writeInt32LE(this._sequence, 6); - buffer.writeInt8(this._flags, 10); - this._data.copy(buffer, 11); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 11) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16LE(0); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._signature = buffer.toString("ascii", 2, 6); - this._sequence = buffer.readInt32LE(6); - this._flags = buffer.readInt8(10); - this._data = buffer.subarray(11, 11 + length); - return this; - } + constructor(sequence: number = 0, flags: number = 0, data?: Buffer) { + super(); + this._sequence = sequence; + this._flags = flags; + this._data = data || Buffer.alloc(0); + this._header = new HeaderShim(this); + } + override serialize() { + const buffer = Buffer.alloc(11 + this._data.length); + buffer.writeInt16LE(this._data.length + 9, 0); + buffer.write(this._signature, 2); + buffer.writeInt32LE(this._sequence, 6); + buffer.writeInt8(this._flags, 10); + this._data.copy(buffer, 11); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 11) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16LE(0); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._signature = buffer.toString("ascii", 2, 6); + this._sequence = buffer.readInt32LE(6); + this._flags = buffer.readInt8(10); + this._data = buffer.subarray(11, 11 + length); + return this; + } - override get data(): Buffer { - return this._data; - } + override get data(): Buffer { + return this._data; + } - override set data(data: Buffer) { - this._data = Buffer.from(data); - } + override set data(data: Buffer) { + this._data = Buffer.from(data); + } - setBuffer(buffer: Buffer) { - this._data = buffer; - } + setBuffer(buffer: Buffer) { + this._data = buffer; + } - override get length(): number { - return 11 + this._data.length; - } + override get length(): number { + return 11 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } - public get flags(): number { - return this._flags; - } - public set flags(value: number) { - this._flags = value; - } + public get flags(): number { + return this._flags; + } + public set flags(value: number) { + this._flags = value; + } } diff --git a/packages/shared/structs.ts b/packages/shared/structs.ts index e4c3519a8..71c4732f4 100644 --- a/packages/shared/structs.ts +++ b/packages/shared/structs.ts @@ -1,151 +1,145 @@ import { ServerError } from "./errors/ServerError.js"; export interface Serialized { - serialize(): Buffer; - deserialize(buf: Buffer): void; - sizeOf(): number; + serialize(): Buffer; + deserialize(buf: Buffer): void; + sizeOf(): number; } function serializeBool(bool: boolean) { - const buf = Buffer.alloc(1); + const buf = Buffer.alloc(1); - buf.writeUInt8(bool ? 1 : 0); + buf.writeUInt8(bool ? 1 : 0); - return buf; + return buf; } /** * Serializes a string to a buffer. The buffer will be prefixed with the length of the string. */ function serializeString(str: string) { - const buf = Buffer.alloc(str.length + 2); + const buf = Buffer.alloc(str.length + 2); - buf.writeUInt16LE(str.length); - buf.write(str, 2); + buf.writeUInt16LE(str.length); + buf.write(str, 2); - return buf; + return buf; } function deserializeBool(buff: Buffer) { - return buff.readUInt8() === 1; + return buff.readUInt8() === 1; } function deserializeWord(buff: Buffer) { - return buff.readUInt16LE(); + return buff.readUInt16LE(); } function deserializeDWord(buff: Buffer) { - return buff.readUInt32LE(); + return buff.readUInt32LE(); } /** * Deserializes a string from a buffer. The buffer is expected to be prefixed with the length of the string. */ function deserializeString(buf: Buffer) { - const size = buf.readUInt16LE(); - if (size > buf.length - 2) { - throw new ServerError("Size is bigger than the buffer length - 2"); - } - const str = buf.toString("utf8", 2); + const size = buf.readUInt16LE(); + if (size > buf.length - 2) { + throw new ServerError("Size is bigger than the buffer length - 2"); + } + const str = buf.toString("utf8", 2); - return str; + return str; } function sizeOfBool() { - return 1; + return 1; } function sizeOfString(string: string) { - return string.length + 2; + return string.length + 2; } export class Header implements Serialized { - messageCode = 0; // 2 bytes - messageLength = 0; // 2 bytes - messageVersion = 0; // 2 bytes - readonly reserved = 0; // 2 bytes - messageChecksum = 0; // 4 bytes - - sizeOf() { - return 12; - } - - clear() { - this.messageChecksum = 0; // 2 bytes - this.messageCode = 0; // 2 bytes - this.messageLength = 0; - this.messageVersion = 0; // 2 bytes - } - - serialize() { - const buf = Buffer.alloc(12); - - buf.writeUInt16LE(this.messageCode, 0); - buf.writeUInt16LE(this.messageLength, 2); - buf.writeUInt16LE(this.messageVersion, 4); - buf.writeUInt16LE(this.reserved, 6); - buf.writeUInt32LE(this.messageChecksum, 8); - - return buf; - } - - deserialize(buf: Buffer) { - this.messageCode = deserializeDWord(buf); - this.messageCode = deserializeWord(buf.subarray(2, 4)); - this.messageVersion = deserializeWord(buf.subarray(4, 6)); - this.messageChecksum = deserializeDWord(buf.subarray(8, 12)); - } + messageCode = 0; // 2 bytes + messageLength = 0; // 2 bytes + messageVersion = 0; // 2 bytes + readonly reserved = 0; // 2 bytes + messageChecksum = 0; // 4 bytes + + sizeOf() { + return 12; + } + + clear() { + this.messageChecksum = 0; // 2 bytes + this.messageCode = 0; // 2 bytes + this.messageLength = 0; + this.messageVersion = 0; // 2 bytes + } + + serialize() { + const buf = Buffer.alloc(12); + + buf.writeUInt16LE(this.messageCode, 0); + buf.writeUInt16LE(this.messageLength, 2); + buf.writeUInt16LE(this.messageVersion, 4); + buf.writeUInt16LE(this.reserved, 6); + buf.writeUInt32LE(this.messageChecksum, 8); + + return buf; + } + + deserialize(buf: Buffer) { + this.messageCode = deserializeDWord(buf); + this.messageCode = deserializeWord(buf.subarray(2, 4)); + this.messageVersion = deserializeWord(buf.subarray(4, 6)); + this.messageChecksum = deserializeDWord(buf.subarray(8, 12)); + } } export class SerializedBase implements Serialized { - protected header: Header | null = null; - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - deserialize(_buff: Buffer): Buffer { - throw new ServerError( - "This method must be implemented by child classes", - ); - } - serialize(): Buffer { - throw new ServerError( - "This method must be implemented by child classes", - ); - } - - sizeOf(): number { - throw new ServerError( - "This method must be implemented by child classes", - ); - } + protected header: Header | null = null; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + deserialize(_buff: Buffer): Buffer { + throw new ServerError("This method must be implemented by child classes"); + } + serialize(): Buffer { + throw new ServerError("This method must be implemented by child classes"); + } + + sizeOf(): number { + throw new ServerError("This method must be implemented by child classes"); + } } export class UserStatus extends SerializedBase implements Serialized { - v2P320 = 0; // Customer ID 4 bytes - v2P321 = 0; // Persona ID 4 bytes - v2P1288 = 0; // bool, unknown - v2P32 = 0; // bool, banned (NPS_Serialize) - v2P656 = 0; // bool, gagged (NPS_Serialize) - v2P1292 = 0; // Session Key (NPS_Serialize) - v2P341 = 0; // unknown, 4 bytes - v2P1368 = 0; // Metrics Id (not used) 64 bytes - - override sizeOf(): number { - throw new ServerError("Not yet implemented"); - } - - override serialize(): Buffer { - throw new ServerError("Not yet implemented"); - } - - // eslint-disable-next-line @typescript-eslint/no-unused-vars - override deserialize(_buff: Buffer): Buffer { - throw new ServerError("Not yet implemented"); - } + v2P320 = 0; // Customer ID 4 bytes + v2P321 = 0; // Persona ID 4 bytes + v2P1288 = 0; // bool, unknown + v2P32 = 0; // bool, banned (NPS_Serialize) + v2P656 = 0; // bool, gagged (NPS_Serialize) + v2P1292 = 0; // Session Key (NPS_Serialize) + v2P341 = 0; // unknown, 4 bytes + v2P1368 = 0; // Metrics Id (not used) 64 bytes + + override sizeOf(): number { + throw new ServerError("Not yet implemented"); + } + + override serialize(): Buffer { + throw new ServerError("Not yet implemented"); + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + override deserialize(_buff: Buffer): Buffer { + throw new ServerError("Not yet implemented"); + } } export class GetPersonaMapListRequest - extends SerializedBase - implements Serialized {} + extends SerializedBase + implements Serialized {} export class SerializedList extends SerializedBase implements Serialized {} @@ -156,31 +150,31 @@ export class SessionKey extends SerializedBase implements Serialized {} export class UserAction extends SerializedBase implements Serialized {} export class LoginRequestReply extends SerializedBase implements Serialized { - sessionKey = ""; // 128 chars string - - setContext(context: string) { - this.sessionKey = context; - } - - _doSerialize() { - if (this.header === null) { - throw new ServerError("Header is null"); - } - let buf = this.header.serialize(); - buf = Buffer.concat([buf, serializeString(this.sessionKey)]); - - return buf; - } - - _serializeSizeOf() { - if (this.header === null) { - throw new ServerError("Header is null"); - } - let size = this.header.sizeOf(); - size += sizeOfString(this.sessionKey); - - return size; - } + sessionKey = ""; // 128 chars string + + setContext(context: string) { + this.sessionKey = context; + } + + _doSerialize() { + if (this.header === null) { + throw new ServerError("Header is null"); + } + let buf = this.header.serialize(); + buf = Buffer.concat([buf, serializeString(this.sessionKey)]); + + return buf; + } + + _serializeSizeOf() { + if (this.header === null) { + throw new ServerError("Header is null"); + } + let size = this.header.sizeOf(); + size += sizeOfString(this.sessionKey); + + return size; + } } export class GameLogin extends SerializedBase implements Serialized {} @@ -188,58 +182,58 @@ export class GameLogin extends SerializedBase implements Serialized {} export class GameLoginReply extends SerializedBase implements Serialized {} export class GetPersonaInfoRequest - extends SerializedBase - implements Serialized {} + extends SerializedBase + implements Serialized {} export class UserStatusRequest extends SerializedBase implements Serialized {} export class AddPersona extends SerializedBase implements Serialized {} export class Login extends LoginRequestReply implements Serialized { - v2P82 = false; - encryptedSessionKey = ""; // encrypted session key - readonly GAME_CODE = "2176"; // 40 chars string - v2P187 = false; - - override serialize() { - if (this.header === null) { - throw new ServerError("Header is null"); - } - let buf = this.header.serialize(); - buf = Buffer.concat([ - buf, - serializeBool(this.v2P82), - serializeString(this.encryptedSessionKey), - serializeString(this.GAME_CODE), - serializeBool(this.v2P187), - ]); - - return buf; - } - - serializeSizeOf() { - if (this.header === null) { - throw new ServerError("Header is null"); - } - - let size = this.header.sizeOf(); - size += sizeOfBool(); - size += sizeOfString(this.encryptedSessionKey); - size += sizeOfString(this.GAME_CODE); - size += sizeOfBool(); - - return size; - } - - override deserialize(buf: Buffer) { - if (this.header === null) { - this.header = new Header(); - } - this.header.deserialize(buf); - this.v2P82 = deserializeBool(buf.subarray(12, 13)); - this.encryptedSessionKey = deserializeString(buf.subarray(13, 15)); - this.v2P187 = deserializeBool(buf.subarray(55, 56)); - - return buf; - } + v2P82 = false; + encryptedSessionKey = ""; // encrypted session key + readonly GAME_CODE = "2176"; // 40 chars string + v2P187 = false; + + override serialize() { + if (this.header === null) { + throw new ServerError("Header is null"); + } + let buf = this.header.serialize(); + buf = Buffer.concat([ + buf, + serializeBool(this.v2P82), + serializeString(this.encryptedSessionKey), + serializeString(this.GAME_CODE), + serializeBool(this.v2P187), + ]); + + return buf; + } + + serializeSizeOf() { + if (this.header === null) { + throw new ServerError("Header is null"); + } + + let size = this.header.sizeOf(); + size += sizeOfBool(); + size += sizeOfString(this.encryptedSessionKey); + size += sizeOfString(this.GAME_CODE); + size += sizeOfBool(); + + return size; + } + + override deserialize(buf: Buffer) { + if (this.header === null) { + this.header = new Header(); + } + this.header.deserialize(buf); + this.v2P82 = deserializeBool(buf.subarray(12, 13)); + this.encryptedSessionKey = deserializeString(buf.subarray(13, 15)); + this.v2P187 = deserializeBool(buf.subarray(55, 56)); + + return buf; + } } diff --git a/packages/shared/test/BaseSerialized.test.ts b/packages/shared/test/BaseSerialized.test.ts index f24f08eeb..c04e83b4f 100644 --- a/packages/shared/test/BaseSerialized.test.ts +++ b/packages/shared/test/BaseSerialized.test.ts @@ -1,42 +1,42 @@ +import { describe, expect, it } from "vitest"; import { BaseSerialized } from "../src/BaseSerialized.js"; -import { describe, it, expect } from "vitest"; describe("BaseSerialized", () => { - it("should have a length", () => { - const data = Buffer.from("hello world"); - const serialized = new BaseSerialized(data); - expect(serialized.length).toEqual(11); - }); + it("should have a length", () => { + const data = Buffer.from("hello world"); + const serialized = new BaseSerialized(data); + expect(serialized.length).toEqual(11); + }); - it("should have a string representation", () => { - const data = Buffer.from("hello world"); - const serialized = new BaseSerialized(data); - expect(serialized.toString()).toEqual("68656c6c6f20776f726c64"); - }); + it("should have a string representation", () => { + const data = Buffer.from("hello world"); + const serialized = new BaseSerialized(data); + expect(serialized.toString()).toEqual("68656c6c6f20776f726c64"); + }); - it("should have a hex representation", () => { - const data = Buffer.from("hello world"); - const serialized = new BaseSerialized(data); - expect(serialized.asHex()).toEqual("68656c6c6f20776f726c64"); - }); + it("should have a hex representation", () => { + const data = Buffer.from("hello world"); + const serialized = new BaseSerialized(data); + expect(serialized.asHex()).toEqual("68656c6c6f20776f726c64"); + }); - it("should have a data property", () => { - const data = Buffer.from("hello world"); - const serialized = new BaseSerialized(data); - expect(serialized.data).toEqual(data); - serialized.data = Buffer.from("goodbye world"); - expect(serialized.data).toEqual(Buffer.from("goodbye world")); - }); + it("should have a data property", () => { + const data = Buffer.from("hello world"); + const serialized = new BaseSerialized(data); + expect(serialized.data).toEqual(data); + serialized.data = Buffer.from("goodbye world"); + expect(serialized.data).toEqual(Buffer.from("goodbye world")); + }); - it("should throw when serialize is not implemented", () => { - const serialized = new BaseSerialized(); - expect(() => serialized.serialize()).toThrow("Not implemented"); - }); + it("should throw when serialize is not implemented", () => { + const serialized = new BaseSerialized(); + expect(() => serialized.serialize()).toThrow("Not implemented"); + }); - it("should throw when deserialize is not implemented", () => { - const serialized = new BaseSerialized(); - expect(() => - serialized.deserialize(Buffer.from("hello world")), - ).toThrow("Not implemented"); - }); + it("should throw when deserialize is not implemented", () => { + const serialized = new BaseSerialized(); + expect(() => serialized.deserialize(Buffer.from("hello world"))).toThrow( + "Not implemented", + ); + }); }); diff --git a/packages/shared/test/RawMessage.test.ts b/packages/shared/test/RawMessage.test.ts index 801a8b9b8..b42919e92 100644 --- a/packages/shared/test/RawMessage.test.ts +++ b/packages/shared/test/RawMessage.test.ts @@ -1,65 +1,63 @@ +import { describe, expect, it } from "vitest"; import { RawMessage } from "../src/RawMessage.js"; -import { describe, it, expect } from "vitest"; describe("RawMessage", () => { - it("should serialize and deserialize correctly", () => { - // Arrange - const testMessage = new RawMessage(1); - testMessage.data = Buffer.from("hello world"); - // Act - const buffer = testMessage.serialize(); - const result = new RawMessage(313); - result.deserialize(buffer); - // Assert - expect(result.data).toEqual(testMessage.data); - expect(result.messageId).toEqual(testMessage.messageId); - }); - - it("should have a length", () => { - const data = Buffer.from("hello world"); - const serialized = new RawMessage(612, data); - expect(serialized.length).toEqual(15); - }); - - it("should have a string representation", () => { - const data = Buffer.from("hello world"); - const serialized = new RawMessage(916, data); - expect(serialized.toString()).toEqual("0394000f68656c6c6f20776f726c64"); - }); - - it("should have a hex representation", () => { - const data = Buffer.from("hello world"); - const serialized = new RawMessage(841, data); - expect(serialized.asHex()).toEqual("0349000f68656c6c6f20776f726c64"); - }); - - it("should have a data property", () => { - const data = Buffer.from("hello world"); - const serialized = new RawMessage(502, data); - expect(serialized.data).toEqual(data); - serialized.data = Buffer.from("goodbye world"); - expect(serialized.data).toEqual(Buffer.from("goodbye world")); - }); - - it("should have a messageId property", () => { - const data = Buffer.from("hello world"); - const serialized = new RawMessage(0xab1, data); - expect(serialized.messageId).toEqual(2737); - }); - - it("should throw when deserialize is given a buffer smaller than 4 bytes", () => { - const serialized = new RawMessage(0xab1); - expect(() => serialized.deserialize(Buffer.alloc(2))).toThrow( - "Unable to get header from buffer, got 2", - ); - }); - - it("should throw when deserialize is given a buffer smaller than the length in the header", () => { - const serialized = new RawMessage(0xab1); - expect(() => - serialized.deserialize( - Buffer.from("ab01000f68656c6c6f20776f726c64"), - ), - ).toThrow("Expected buffer of length 12337, got 30"); - }); + it("should serialize and deserialize correctly", () => { + // Arrange + const testMessage = new RawMessage(1); + testMessage.data = Buffer.from("hello world"); + // Act + const buffer = testMessage.serialize(); + const result = new RawMessage(313); + result.deserialize(buffer); + // Assert + expect(result.data).toEqual(testMessage.data); + expect(result.messageId).toEqual(testMessage.messageId); + }); + + it("should have a length", () => { + const data = Buffer.from("hello world"); + const serialized = new RawMessage(612, data); + expect(serialized.length).toEqual(15); + }); + + it("should have a string representation", () => { + const data = Buffer.from("hello world"); + const serialized = new RawMessage(916, data); + expect(serialized.toString()).toEqual("0394000f68656c6c6f20776f726c64"); + }); + + it("should have a hex representation", () => { + const data = Buffer.from("hello world"); + const serialized = new RawMessage(841, data); + expect(serialized.asHex()).toEqual("0349000f68656c6c6f20776f726c64"); + }); + + it("should have a data property", () => { + const data = Buffer.from("hello world"); + const serialized = new RawMessage(502, data); + expect(serialized.data).toEqual(data); + serialized.data = Buffer.from("goodbye world"); + expect(serialized.data).toEqual(Buffer.from("goodbye world")); + }); + + it("should have a messageId property", () => { + const data = Buffer.from("hello world"); + const serialized = new RawMessage(0xab1, data); + expect(serialized.messageId).toEqual(2737); + }); + + it("should throw when deserialize is given a buffer smaller than 4 bytes", () => { + const serialized = new RawMessage(0xab1); + expect(() => serialized.deserialize(Buffer.alloc(2))).toThrow( + "Unable to get header from buffer, got 2", + ); + }); + + it("should throw when deserialize is given a buffer smaller than the length in the header", () => { + const serialized = new RawMessage(0xab1); + expect(() => + serialized.deserialize(Buffer.from("ab01000f68656c6c6f20776f726c64")), + ).toThrow("Expected buffer of length 12337, got 30"); + }); }); diff --git a/packages/shared/test/SerializedBuffer.test.ts b/packages/shared/test/SerializedBuffer.test.ts index cdca1ccee..9572a7a38 100644 --- a/packages/shared/test/SerializedBuffer.test.ts +++ b/packages/shared/test/SerializedBuffer.test.ts @@ -1,57 +1,57 @@ +import { describe, expect, it } from "vitest"; import { SerializedBuffer } from "../src/SerializedBuffer.js"; -import { describe, it, expect } from "vitest"; describe("SerializedBuffer", () => { - it("should serialize and deserialize correctly", () => { - // Arrange - const testMessage = new SerializedBuffer(); - testMessage.data = Buffer.from("hello world"); - // Act - const buffer = testMessage.serialize(); - const result = new SerializedBuffer(); - result.deserialize(buffer); - // Assert - expect(result.data).toEqual(testMessage.data); - }); + it("should serialize and deserialize correctly", () => { + // Arrange + const testMessage = new SerializedBuffer(); + testMessage.data = Buffer.from("hello world"); + // Act + const buffer = testMessage.serialize(); + const result = new SerializedBuffer(); + result.deserialize(buffer); + // Assert + expect(result.data).toEqual(testMessage.data); + }); - it("should have a length", () => { - const data = Buffer.from("hello world"); - const serialized = new SerializedBuffer(data); - expect(serialized.length).toEqual(11); - }); + it("should have a length", () => { + const data = Buffer.from("hello world"); + const serialized = new SerializedBuffer(data); + expect(serialized.length).toEqual(11); + }); - it("should have a string representation", () => { - const data = Buffer.from("hello world"); - const serialized = new SerializedBuffer(data); - expect(serialized.toString()).toEqual("68656c6c6f20776f726c64"); - }); + it("should have a string representation", () => { + const data = Buffer.from("hello world"); + const serialized = new SerializedBuffer(data); + expect(serialized.toString()).toEqual("68656c6c6f20776f726c64"); + }); - it("should have a hex representation", () => { - const data = Buffer.from("hello world"); - const serialized = new SerializedBuffer(data); - expect(serialized.asHex()).toEqual("68656c6c6f20776f726c64"); - }); + it("should have a hex representation", () => { + const data = Buffer.from("hello world"); + const serialized = new SerializedBuffer(data); + expect(serialized.asHex()).toEqual("68656c6c6f20776f726c64"); + }); - it("should have a data property", () => { - const data = Buffer.from("hello world"); - const serialized = new SerializedBuffer(data); - expect(serialized.data).toEqual(data); - serialized.data = Buffer.from("goodbye world"); - expect(serialized.data).toEqual(Buffer.from("goodbye world")); - }); + it("should have a data property", () => { + const data = Buffer.from("hello world"); + const serialized = new SerializedBuffer(data); + expect(serialized.data).toEqual(data); + serialized.data = Buffer.from("goodbye world"); + expect(serialized.data).toEqual(Buffer.from("goodbye world")); + }); - it("should thow when there is an error in deserialize", () => { - const serialized = new SerializedBuffer(); - expect(() => - serialized.deserialize(Buffer.from("hello world")), - ).toThrow("Expected buffer of length 26727, got 11"); - }); + it("should thow when there is an error in deserialize", () => { + const serialized = new SerializedBuffer(); + expect(() => serialized.deserialize(Buffer.from("hello world"))).toThrow( + "Expected buffer of length 26727, got 11", + ); + }); - it("should throw when there is an error in serialize", () => { - const serialized = new SerializedBuffer(); - serialized.data = Buffer.alloc(0xffff + 1); - expect(() => serialized.serialize()).toThrow( - 'The value of "value" is out of range. It must be >= 0 and <= 65535. Received 65536', - ); - }); + it("should throw when there is an error in serialize", () => { + const serialized = new SerializedBuffer(); + serialized.data = Buffer.alloc(0xffff + 1); + expect(() => serialized.serialize()).toThrow( + 'The value of "value" is out of range. It must be >= 0 and <= 65535. Received 65536', + ); + }); }); diff --git a/packages/shared/utils.js b/packages/shared/utils.js index d7f752fc7..6caa8deaa 100644 --- a/packages/shared/utils.js +++ b/packages/shared/utils.js @@ -7,10 +7,10 @@ */ export function toHex(data) { - /** @type {string[]} */ - const bytes = []; - data.forEach((b) => { - bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); - }); - return bytes.join(""); + /** @type {string[]} */ + const bytes = []; + data.forEach((b) => { + bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); + }); + return bytes.join(""); } diff --git a/packages/shared/vite.config.ts b/packages/shared/vite.config.ts index fb851b55a..01911fd2b 100644 --- a/packages/shared/vite.config.ts +++ b/packages/shared/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/packages/transactions/src/ArcadeCarMessage.ts b/packages/transactions/src/ArcadeCarMessage.ts index 547c3e1b5..7c9ee8f45 100644 --- a/packages/transactions/src/ArcadeCarMessage.ts +++ b/packages/transactions/src/ArcadeCarMessage.ts @@ -21,79 +21,79 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; * This is the body of a MessageNode */ export class ArcadeCarMessage extends SerializedBuffer { - _msgNo: number; - _carCount: number; - _shouldExpectMoreMessages: boolean; - _carList: ArcadeCarInfo[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._carCount = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {ArcadeCarInfo[]} */ - this._carList = []; // 8 bytes each - } + _msgNo: number; + _carCount: number; + _shouldExpectMoreMessages: boolean; + _carList: ArcadeCarInfo[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._carCount = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {ArcadeCarInfo[]} */ + this._carList = []; // 8 bytes each + } - override size() { - return 5 + this._carList.length * 8; - } + override size() { + return 5 + this._carList.length * 8; + } - /** - * Add a lobby to the list - * @param {ArcadeCarInfo} lobby - */ - addCar(lobby: ArcadeCarInfo) { - this._carList.push(lobby); - this._carCount++; - } + /** + * Add a lobby to the list + * @param {ArcadeCarInfo} lobby + */ + addCar(lobby: ArcadeCarInfo) { + this._carList.push(lobby); + this._carCount++; + } - override serialize() { - const neededSize = 5 + this._carList.length * 8; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._carCount, offset); - offset += 2; // offset is 4 - buffer.writeInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const car of this._carList) { - car.serialize().copy(buffer, offset); - offset += car.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._carList.length * 8; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._carCount, offset); + offset += 2; // offset is 4 + buffer.writeInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const car of this._carList) { + car.serialize().copy(buffer, offset); + offset += car.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `ArcadeCarMessage: msgNo=${this._msgNo} careCount=${this._carCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} cars=${this._carList.length}`; - } + override toString() { + return `ArcadeCarMessage: msgNo=${this._msgNo} careCount=${this._carCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} cars=${this._carList.length}`; + } } export class ArcadeCarInfo extends SerializedBuffer { - _brandedPartId: number; - _lobbyId: number; - constructor() { - super(); - this._brandedPartId = 0; // 4 bytes - this._lobbyId = 0; // 4 bytes - } + _brandedPartId: number; + _lobbyId: number; + constructor() { + super(); + this._brandedPartId = 0; // 4 bytes + this._lobbyId = 0; // 4 bytes + } - override size() { - return 8; - } + override size() { + return 8; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._lobbyId, offset); - // offset is 8 - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._lobbyId, offset); + // offset is 8 + return buffer; + } - override toString() { - return `ArcadeCarInfo: brandedPartId=${this._brandedPartId} lobbyId=${this._lobbyId}`; - } + override toString() { + return `ArcadeCarInfo: brandedPartId=${this._brandedPartId} lobbyId=${this._lobbyId}`; + } } diff --git a/packages/transactions/src/EntryFeePurseMessage.ts b/packages/transactions/src/EntryFeePurseMessage.ts index 64ffad93a..021f59c00 100644 --- a/packages/transactions/src/EntryFeePurseMessage.ts +++ b/packages/transactions/src/EntryFeePurseMessage.ts @@ -22,102 +22,102 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; * This is the body of a MessageNode */ export class EntryFeePurseMessage extends SerializedBuffer { - _msgNo: number; - _numberOfPurseEntries: number; - _shouldExpectMoreMessages: boolean; - _purseEntries: PurseEntry[]; - constructor() { - super(); - this._msgNo = 408; // 2 bytes - this._numberOfPurseEntries = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {PurseEntry[]} */ - this._purseEntries = []; // 8 bytes each - } + _msgNo: number; + _numberOfPurseEntries: number; + _shouldExpectMoreMessages: boolean; + _purseEntries: PurseEntry[]; + constructor() { + super(); + this._msgNo = 408; // 2 bytes + this._numberOfPurseEntries = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {PurseEntry[]} */ + this._purseEntries = []; // 8 bytes each + } - override size() { - return 5 + this._purseEntries.length * 8; - } + override size() { + return 5 + this._purseEntries.length * 8; + } - /** - * Add a lobby to the list - * @param {PurseEntry} lobby - */ - addEntry(purseEntry: PurseEntry) { - this._purseEntries.push(purseEntry); - this._numberOfPurseEntries++; - } + /** + * Add a lobby to the list + * @param {PurseEntry} lobby + */ + addEntry(purseEntry: PurseEntry) { + this._purseEntries.push(purseEntry); + this._numberOfPurseEntries++; + } - override serialize() { - const neededSize = 5 + this._purseEntries.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._numberOfPurseEntries, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const entry of this._purseEntries) { - entry.serialize().copy(buffer, offset); - offset += entry.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._purseEntries.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._numberOfPurseEntries, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const entry of this._purseEntries) { + entry.serialize().copy(buffer, offset); + offset += entry.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `EntryFeePurseMessage: msgNo=${this._msgNo} numberOfPurseEntries=${this._numberOfPurseEntries} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} purseEntries=${this._purseEntries}`; - } + override toString() { + return `EntryFeePurseMessage: msgNo=${this._msgNo} numberOfPurseEntries=${this._numberOfPurseEntries} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} purseEntries=${this._purseEntries}`; + } } export class PurseEntry extends SerializedBuffer { - _entryFee: number; // 4 bytes - _purse: number; // 4 bytes - constructor() { - super(); - this._entryFee = 0; - this._purse = 0; - } + _entryFee: number; // 4 bytes + _purse: number; // 4 bytes + constructor() { + super(); + this._entryFee = 0; + this._purse = 0; + } - override size() { - return 8; - } + override size() { + return 8; + } - /** - * Deserialize the data - * - * @param {Buffer} data - */ - deserialize(data: Buffer) { - if (data.length !== this.size()) { - throw new ServerError( - `PurseEntry.deserialize() expected ${this.size()} bytes but got ${ - data.length - } bytes`, - ); - } - let offset = 0; - this._entryFee = data.readUInt32LE(offset); - offset += 4; // offset is 4 - this._purse = data.readUInt32LE(offset); - // offset is 8 + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer) { + if (data.length !== this.size()) { + throw new ServerError( + `PurseEntry.deserialize() expected ${this.size()} bytes but got ${ + data.length + } bytes`, + ); + } + let offset = 0; + this._entryFee = data.readUInt32LE(offset); + offset += 4; // offset is 4 + this._purse = data.readUInt32LE(offset); + // offset is 8 - return this; - } + return this; + } - override serialize() { - const buf = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buf.writeUInt32LE(this._entryFee, offset); - offset += 4; // offset is 4 - buf.writeUInt32LE(this._purse, offset); - // offset is 8 + override serialize() { + const buf = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buf.writeUInt32LE(this._entryFee, offset); + offset += 4; // offset is 4 + buf.writeUInt32LE(this._purse, offset); + // offset is 8 - return buf; - } + return buf; + } - override toString() { - return `PurseEntry: entryFee=${this._entryFee} purse=${this._purse}`; - } + override toString() { + return `PurseEntry: entryFee=${this._entryFee} purse=${this._purse}`; + } } diff --git a/packages/transactions/src/GameUrlsMessage.ts b/packages/transactions/src/GameUrlsMessage.ts index b5cc62713..0a0670968 100644 --- a/packages/transactions/src/GameUrlsMessage.ts +++ b/packages/transactions/src/GameUrlsMessage.ts @@ -15,8 +15,8 @@ // along with this program. If not, see . import { - SerializedBuffer, - serializeString, + SerializedBuffer, + serializeString, } from "../../shared/messageFactory.js"; /** @@ -24,79 +24,79 @@ import { * This is the body of a MessageNode */ export class GameUrlsMessage extends SerializedBuffer { - _msgNo: number; - _urlCount: number; - _shouldExpectMoreMessages: boolean; - _urlList: GameUrl[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._urlCount = 0; // 2 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {GameUrl[]} */ - this._urlList = []; // 563 bytes each - } + _msgNo: number; + _urlCount: number; + _shouldExpectMoreMessages: boolean; + _urlList: GameUrl[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._urlCount = 0; // 2 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {GameUrl[]} */ + this._urlList = []; // 563 bytes each + } - override size() { - return 5 + this._urlList.length * 563; - } + override size() { + return 5 + this._urlList.length * 563; + } - /** - * Add a lobby to the list - * @param {GameUrl} lobby - */ - addURL(lobby: GameUrl) { - this._urlList.push(lobby); - this._urlCount++; - } + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addURL(lobby: GameUrl) { + this._urlList.push(lobby); + this._urlCount++; + } - override serialize() { - const neededSize = 4 + this._urlList.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._urlCount, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const url of this._urlList) { - url.serialize().copy(buffer, offset); - offset += url.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 4 + this._urlList.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._urlCount, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const url of this._urlList) { + url.serialize().copy(buffer, offset); + offset += url.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `GameUrlsMessage: msgNo=${this._msgNo} urlCount=${this._urlCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} urlList=${this._urlList}`; - } + override toString() { + return `GameUrlsMessage: msgNo=${this._msgNo} urlCount=${this._urlCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} urlList=${this._urlList}`; + } } export class GameUrl extends SerializedBuffer { - _urlId: number; - urlRef: string; - constructor() { - super(); - this._urlId = 0; // 4 bytes - this.urlRef = ""; // 4 + this.urlRef.length bytes - } + _urlId: number; + urlRef: string; + constructor() { + super(); + this._urlId = 0; // 4 bytes + this.urlRef = ""; // 4 + this.urlRef.length bytes + } - override size() { - return 8 + this.urlRef.length; - } + override size() { + return 8 + this.urlRef.length; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._urlId, offset); - offset += 4; // offset is 4 - serializeString(this.urlRef, buffer, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._urlId, offset); + offset += 4; // offset is 4 + serializeString(this.urlRef, buffer, offset); - return buffer; - } + return buffer; + } - override toString() { - return `GameUrl: urlId=${this._urlId} urlRef=${this.urlRef}`; - } + override toString() { + return `GameUrl: urlId=${this._urlId} urlRef=${this.urlRef}`; + } } diff --git a/packages/transactions/src/GenericReplyMessage.ts b/packages/transactions/src/GenericReplyMessage.ts index b37b18ec4..6fea26672 100644 --- a/packages/transactions/src/GenericReplyMessage.ts +++ b/packages/transactions/src/GenericReplyMessage.ts @@ -17,160 +17,160 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; export class GenericReply extends SerializedBuffer { - msgNo: number; - msgReply: number; - result: Buffer; - data2: Buffer; - rawBuffer!: Buffer; - constructor() { - super(); - this.msgNo = 0; // 2 bytes (ethier MC_SUCCESS (0x101) or MC_FAILURE(0x102)) - this.msgReply = 0; // 2 bytes (message # being replied to (ex: MC_PURCHASE_STOCK_CAR)) - this.result = Buffer.alloc(4); // 4 bytes (specific to the message sent, often the reason for a failure) - this.setBuffer(Buffer.alloc(4)); // 4 bytes (specific to the message sent (but usually 0)) - this.data2 = Buffer.alloc(4); // 4 bytes (specific to the message sent (but usually 0)) - } + msgNo: number; + msgReply: number; + result: Buffer; + data2: Buffer; + rawBuffer!: Buffer; + constructor() { + super(); + this.msgNo = 0; // 2 bytes (ethier MC_SUCCESS (0x101) or MC_FAILURE(0x102)) + this.msgReply = 0; // 2 bytes (message # being replied to (ex: MC_PURCHASE_STOCK_CAR)) + this.result = Buffer.alloc(4); // 4 bytes (specific to the message sent, often the reason for a failure) + this.setBuffer(Buffer.alloc(4)); // 4 bytes (specific to the message sent (but usually 0)) + this.data2 = Buffer.alloc(4); // 4 bytes (specific to the message sent (but usually 0)) + } - override serialize() { - this.rawBuffer = Buffer.alloc(16); - this.rawBuffer.writeInt16LE(this.msgNo, 0); - this.rawBuffer.writeInt16LE(this.msgReply, 2); - this.result.copy(this.rawBuffer, 4); - this.data.copy(this.rawBuffer, 8); - this.data2.copy(this.rawBuffer, 12); - return this.rawBuffer; - } + override serialize() { + this.rawBuffer = Buffer.alloc(16); + this.rawBuffer.writeInt16LE(this.msgNo, 0); + this.rawBuffer.writeInt16LE(this.msgReply, 2); + this.result.copy(this.rawBuffer, 4); + this.data.copy(this.rawBuffer, 8); + this.data2.copy(this.rawBuffer, 12); + return this.rawBuffer; + } - asJSON() { - return { - msgNo: this.msgNo, - msgReply: this.msgReply, - result: this.result.toString("hex"), - data: this.data.toString("hex"), - data2: this.data2.toString("hex"), - }; - } + asJSON() { + return { + msgNo: this.msgNo, + msgReply: this.msgReply, + result: this.result.toString("hex"), + data: this.data.toString("hex"), + data2: this.data2.toString("hex"), + }; + } - override toString() { - return this.serialize().toString("hex"); - } + override toString() { + return this.serialize().toString("hex"); + } } export class GenericReplyMessage extends SerializedBuffer { - msgNo: number; - toFrom: number; - appId: number; - msgReply: number; - result: Buffer; - data2: Buffer; - rawBuffer: Buffer; - /** - * One of - * - * * MC_SUCCESS = 101 : Used with GenericReply structure to indicate that the request succeeded - * - * * MC_FAILED = 102 : Used with GenericReply structure to indicate that the request failed - * - * * MC_GENERIC_REPLY : Used with GenericReply structure for messages that return data - */ - constructor() { - super(); - this.msgNo = 0; // 2 bytes - this.toFrom = 0; // 2 bytes - this.appId = 0; // 2 bytes - this.msgReply = 0; // 2 bytes - this.result = Buffer.alloc(4); // 4 bytes - this.setBuffer(Buffer.alloc(4)); // 4 bytes - this.data2 = Buffer.alloc(4); // 4 bytes - this.rawBuffer = Buffer.alloc(0); - } + msgNo: number; + toFrom: number; + appId: number; + msgReply: number; + result: Buffer; + data2: Buffer; + rawBuffer: Buffer; + /** + * One of + * + * * MC_SUCCESS = 101 : Used with GenericReply structure to indicate that the request succeeded + * + * * MC_FAILED = 102 : Used with GenericReply structure to indicate that the request failed + * + * * MC_GENERIC_REPLY : Used with GenericReply structure for messages that return data + */ + constructor() { + super(); + this.msgNo = 0; // 2 bytes + this.toFrom = 0; // 2 bytes + this.appId = 0; // 2 bytes + this.msgReply = 0; // 2 bytes + this.result = Buffer.alloc(4); // 4 bytes + this.setBuffer(Buffer.alloc(4)); // 4 bytes + this.data2 = Buffer.alloc(4); // 4 bytes + this.rawBuffer = Buffer.alloc(0); + } - /** - * Setter data - * @param {Buffer} value - */ - setData(value: Buffer) { - this.setBuffer(value); - } + /** + * Setter data + * @param {Buffer} value + */ + setData(value: Buffer) { + this.setBuffer(value); + } - /** - * Setter data2 - * @param {Buffer} value - */ - setData2(value: Buffer) { - this.data2 = value; - } + /** + * Setter data2 + * @param {Buffer} value + */ + setData2(value: Buffer) { + this.data2 = value; + } - /** - * - * @param {Buffer} buffer - * @return {GenericReplyMessage} - */ - static deserialize(buffer: Buffer): GenericReplyMessage { - const node = new GenericReplyMessage(); - node.rawBuffer = buffer; - try { - node.msgNo = buffer.readInt16LE(0); - } catch (error) { - if (error instanceof RangeError) { - // This is likeley not an MCOTS packet, ignore - } else { - const err = new TypeError( - `[GenericReplyMsg] Unable to read msgNo from ${buffer.toString( - "hex", - )}: ${String(error)}`, - ); // skipcq: JS-0378 - throw err; - } - } + /** + * + * @param {Buffer} buffer + * @return {GenericReplyMessage} + */ + static deserialize(buffer: Buffer): GenericReplyMessage { + const node = new GenericReplyMessage(); + node.rawBuffer = buffer; + try { + node.msgNo = buffer.readInt16LE(0); + } catch (error) { + if (error instanceof RangeError) { + // This is likeley not an MCOTS packet, ignore + } else { + const err = new TypeError( + `[GenericReplyMsg] Unable to read msgNo from ${buffer.toString( + "hex", + )}: ${String(error)}`, + ); // skipcq: JS-0378 + throw err; + } + } - node.msgReply = buffer.readInt16LE(2); - node.result = buffer.subarray(4, 8); - node.setBuffer(buffer.subarray(8, 12)); - node.data2 = buffer.subarray(12); - return node; - } + node.msgReply = buffer.readInt16LE(2); + node.result = buffer.subarray(4, 8); + node.setBuffer(buffer.subarray(8, 12)); + node.data2 = buffer.subarray(12); + return node; + } - /** - * @override - * @return {Buffer} - */ - override serialize(): Buffer { - const packet = Buffer.alloc(114); // 16 bytes - let offset = 0; - packet.writeInt16LE(this.msgNo, offset); - offset += 2; - // packet.writeInt16LE(this.msgReply, offset); - // offset += 2; - this.result.copy(packet, offset); - offset += 4; - this.data.copy(packet, offset); - offset += 4; - this.data2.copy(packet, offset); - // offset is now 16 - return packet; - } + /** + * @override + * @return {Buffer} + */ + override serialize(): Buffer { + const packet = Buffer.alloc(114); // 16 bytes + let offset = 0; + packet.writeInt16LE(this.msgNo, offset); + offset += 2; + // packet.writeInt16LE(this.msgReply, offset); + // offset += 2; + this.result.copy(packet, offset); + offset += 4; + this.data.copy(packet, offset); + offset += 4; + this.data2.copy(packet, offset); + // offset is now 16 + return packet; + } - /** - * - * @param {Buffer} buffer - */ - setResult(buffer: Buffer) { - this.result = buffer; - } + /** + * + * @param {Buffer} buffer + */ + setResult(buffer: Buffer) { + this.result = buffer; + } - /** - * DumpPacket - * @return {string} - */ - dumpPacket(): string { - return `GenericReply', + /** + * DumpPacket + * @return {string} + */ + dumpPacket(): string { + return `GenericReply', ${JSON.stringify({ - msgNo: this.msgNo, - msgReply: this.msgReply, - result: this.result.toString("hex"), - data: this.data.toString("hex"), - tdata2: this.data2.toString("hex"), - })}`; - } + msgNo: this.msgNo, + msgReply: this.msgReply, + result: this.result.toString("hex"), + data: this.data.toString("hex"), + tdata2: this.data2.toString("hex"), + })}`; + } } diff --git a/packages/transactions/src/GenericRequestMessage.ts b/packages/transactions/src/GenericRequestMessage.ts index cf15107fa..3f85cf87b 100644 --- a/packages/transactions/src/GenericRequestMessage.ts +++ b/packages/transactions/src/GenericRequestMessage.ts @@ -14,61 +14,61 @@ import { MessageNode } from "../../shared/MessageNode.js"; export class GenericRequestMessage extends MessageNode { - data2: Buffer; - /** - * - */ - constructor() { - super(); - this.msgNo = 0; // 2 bytes - this.data = Buffer.alloc(4); // 4 bytes - this.data2 = Buffer.alloc(4); // 4 bytes - } + data2: Buffer; + /** + * + */ + constructor() { + super(); + this.msgNo = 0; // 2 bytes + this.data = Buffer.alloc(4); // 4 bytes + this.data2 = Buffer.alloc(4); // 4 bytes + } - /** - * @override - * @param {Buffer} buffer - */ - override deserialize(buffer: Buffer) { - try { - this.msgNo = buffer.readInt16LE(0); - } catch (error) { - if (error instanceof RangeError) { - // This is likeley not an MCOTS packet, ignore - } else { - const err = new TypeError( - `[GenericRequestMsg] Unable to read msgNo from ${buffer.toString( - "hex", - )}: ${String(error)}`, // skipcq: JS-0378 - ); - throw err; - } - } + /** + * @override + * @param {Buffer} buffer + */ + override deserialize(buffer: Buffer) { + try { + this.msgNo = buffer.readInt16LE(0); + } catch (error) { + if (error instanceof RangeError) { + // This is likeley not an MCOTS packet, ignore + } else { + const err = new TypeError( + `[GenericRequestMsg] Unable to read msgNo from ${buffer.toString( + "hex", + )}: ${String(error)}`, // skipcq: JS-0378 + ); + throw err; + } + } - this.data = buffer.subarray(2, 6); - this.data2 = buffer.subarray(6); - } + this.data = buffer.subarray(2, 6); + this.data2 = buffer.subarray(6); + } - /** - * @override - * @return {Buffer} - */ - override serialize(): Buffer { - const packet = Buffer.alloc(16); - packet.writeInt16LE(this.msgNo, 0); - this.data.copy(packet, 2); - this.data2.copy(packet, 6); - return packet; - } + /** + * @override + * @return {Buffer} + */ + override serialize(): Buffer { + const packet = Buffer.alloc(16); + packet.writeInt16LE(this.msgNo, 0); + this.data.copy(packet, 2); + this.data2.copy(packet, 6); + return packet; + } - /** - * @override - */ - override toString() { - return `GenericRequest ${JSON.stringify({ - msgNo: this.msgNo, - data: this.data.toString("hex"), - data2: this.data2.toString("hex"), - })}`; - } + /** + * @override + */ + override toString() { + return `GenericRequest ${JSON.stringify({ + msgNo: this.msgNo, + data: this.data.toString("hex"), + data2: this.data2.toString("hex"), + })}`; + } } diff --git a/packages/transactions/src/LobbyMessage.ts b/packages/transactions/src/LobbyMessage.ts index 442636945..61cb46687 100644 --- a/packages/transactions/src/LobbyMessage.ts +++ b/packages/transactions/src/LobbyMessage.ts @@ -22,627 +22,627 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; * This is the body of a MessageNode */ export class LobbyMessage extends SerializedBuffer { - _msgNo: number; - _lobbyCount: number; - _shouldExpectMoreMessages: boolean; - _lobbyList: LobbyInfo[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._lobbyCount = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {LobbyInfo[]} */ - this._lobbyList = []; // 563 bytes each - } + _msgNo: number; + _lobbyCount: number; + _shouldExpectMoreMessages: boolean; + _lobbyList: LobbyInfo[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._lobbyCount = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {LobbyInfo[]} */ + this._lobbyList = []; // 563 bytes each + } - override size() { - return 5 + this._lobbyList.length * 563; - } + override size() { + return 5 + this._lobbyList.length * 563; + } - /** - * Add a lobby to the list - * @param {LobbyInfo} lobby - */ - addLobby(lobby: LobbyInfo) { - this._lobbyList.push(lobby); - this._lobbyCount++; - } + /** + * Add a lobby to the list + * @param {LobbyInfo} lobby + */ + addLobby(lobby: LobbyInfo) { + this._lobbyList.push(lobby); + this._lobbyCount++; + } - override serialize() { - const neededSize = 5 + this._lobbyList.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._lobbyCount, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const lobby of this._lobbyList) { - lobby.serialize().copy(buffer, offset); - offset += lobby.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._lobbyList.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._lobbyCount, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const lobby of this._lobbyList) { + lobby.serialize().copy(buffer, offset); + offset += lobby.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `LobbyMessage: msgNo=${this._msgNo} lobbyCount=${this._lobbyCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} lobbies=${this._lobbyList.length}`; - } + override toString() { + return `LobbyMessage: msgNo=${this._msgNo} lobbyCount=${this._lobbyCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} lobbies=${this._lobbyList.length}`; + } } export class LobbyInfo extends SerializedBuffer { - _lobbyId: number; - _raceTypeId: number; - _terfId: number; - _lobbyName: string; - _turfName: string; - _clientArt: string; - _elementId: number; - _turfLengthId: number; - _startSlice: number; - _endSlice: number; - _dragStageLeft: number; - _dragStageRight: number; - _dragStagingSlice: number; - _gridSpreadFactor: number; - _linear: number; - _minNumberPlayers: number; - _maxNumberPlayers: number; - _defaultNumberPlayers: number; - _numberOfPlayersEnabled: boolean; - _minLaps: number; - _maxLaps: number; - _defaultNumberOfLaps: number; - _numberOfLapsEnabled: boolean; - _minNumberRounds: number; - _maxNumberRounds: number; - _defaultNumberRounds: number; - _numberOfRoundsEnabled: boolean; - _defaultWeather: number; - _weatherEnabled: boolean; - _defaultNight: number; - _nightEnabled: boolean; - _defaultBackwards: boolean; - _backwardsEnabled: boolean; - _defaultTraffic: boolean; - _trafficEnabled: boolean; - _defaultDriverAI: boolean; - _driverAIEnabled: boolean; - _topDog: string; - _turfOwner: string; - _qualifyingTime: number; - _numberOfClubPlayers: number; - _numberofClubLaps: number; - _numberOfClubRounds: number; - _clubNight: number; - _clubWeather: number; - _clubBackwards: number; - _bestLapTime: number; - _lobbyDifficulty: number; - _timetrialPointsToQualify: number; - _timetrialCashToQualify: number; - _timetrialPointsBonusIncrements: number; - _timetrialCashBonusIncrements: number; - _timetrialTimeIncrements: number; - _timetrial1stPlaceVictoryPoints: number; - _timetrial1stPlaceVictoryCash: number; - _timetrial2ndPlaceVictoryPoints: number; - _timetrial2ndPlaceVictoryCash: number; - _timetrial3rdPlaceVictoryPoints: number; - _timetrial3rdPlaceVictoryCash: number; - _minLevel: number; - _minResetSlice: number; - _maxResetSlice: number; - _newbieFlag: number; - _driverHelmetFlag: number; - _clubMaxNumberPlayers: number; - _clubMinNumberPlayers: number; - _clubNumberPlayersDefault: number; - _minNumberOfClubs: number; - _maxNumberOfClubs: number; - _racePointsFactor: number; - _maxBodyClass: number; - _maxPowerClass: number; - _partsPrizeMax: number; - _partsPrizeWon: number; - _clubLogoId: number; - _teamTrialsWeatherFlag: boolean; - _teamTrialsNightFlag: boolean; - _teamTrialsBackwardsFlag: boolean; - _teamTrialsNumberLaps: number; - _teamTrialsBaseTimeUnderPar: number; - _raceCashFactor: number; - constructor() { - super(); - this._lobbyId = 0; // 4 bytes - this._raceTypeId = 0; // 4 bytes - this._terfId = 0; // 4 bytes - this._lobbyName = ""; // 32 bytes - this._turfName = ""; // 256 bytes - this._clientArt = ""; // 11 bytes - this._elementId = 0; // 4 bytes - this._turfLengthId = 0; // 4 bytes - this._startSlice = 0; // 4 bytes - this._endSlice = 0; // 4 bytes - this._dragStageLeft = 0; // 4 bytes - this._dragStageRight = 0; // 4 bytes - this._dragStagingSlice = 0; // 4 bytes - this._gridSpreadFactor = 0; // 4 bytes - this._linear = 0; // 2 bytes - this._minNumberPlayers = 0; // 2 bytes - this._maxNumberPlayers = 0; // 2 bytes - this._defaultNumberPlayers = 0; // 2 bytes - this._numberOfPlayersEnabled = false; // 2 bytes - this._minLaps = 0; // 2 bytes - this._maxLaps = 0; // 2 bytes - this._defaultNumberOfLaps = 0; // 2 bytes - this._numberOfLapsEnabled = false; // 2 bytes - this._minNumberRounds = 0; // 2 bytes - this._maxNumberRounds = 0; // 2 bytes - this._defaultNumberRounds = 0; // 2 bytes - this._numberOfRoundsEnabled = false; // 2 bytes - this._defaultWeather = 0; // 2 bytes - this._weatherEnabled = false; // 2 bytes - this._defaultNight = 0; // 2 bytes - this._nightEnabled = false; // 2 bytes - this._defaultBackwards = false; // 2 bytes - this._backwardsEnabled = false; // 2 bytes - this._defaultTraffic = false; // 2 bytes - this._trafficEnabled = false; // 2 bytes - this._defaultDriverAI = false; // 2 bytes - this._driverAIEnabled = false; // 2 bytes - this._topDog = ""; // 13 bytes - this._turfOwner = ""; // 33 bytes - this._qualifyingTime = 0; // 4 bytes - this._numberOfClubPlayers = 0; // 4 bytes - this._numberofClubLaps = 0; // 4 bytes - this._numberOfClubRounds = 0; // 4 bytes - this._clubNight = 0; // 2 bytes - this._clubWeather = 0; // 2 bytes - this._clubBackwards = 0; // 2 bytes - this._bestLapTime = 0; // 4 bytes - this._lobbyDifficulty = 0; // 4 bytes - this._timetrialPointsToQualify = 0; // 4 bytes - this._timetrialCashToQualify = 0; // 4 bytes - this._timetrialPointsBonusIncrements = 0; // 4 bytes - this._timetrialCashBonusIncrements = 0; // 4 bytes - this._timetrialTimeIncrements = 0; // 4 bytes - this._timetrial1stPlaceVictoryPoints = 0; // 4 bytes - this._timetrial1stPlaceVictoryCash = 0; // 4 bytes - this._timetrial2ndPlaceVictoryPoints = 0; // 4 bytes - this._timetrial2ndPlaceVictoryCash = 0; // 4 bytes - this._timetrial3rdPlaceVictoryPoints = 0; // 4 bytes - this._timetrial3rdPlaceVictoryCash = 0; // 4 bytes - this._minLevel = 0; // 2 bytes - this._minResetSlice = 0; // 4 bytes - this._maxResetSlice = 0; // 4 bytes - this._newbieFlag = 0; // 2 bytes - this._driverHelmetFlag = 0; // 2 bytes - this._clubMaxNumberPlayers = 0; // 2 bytes - this._clubMinNumberPlayers = 0; // 2 bytes - this._clubNumberPlayersDefault = 0; // 2 bytes - this._minNumberOfClubs = 0; // 2 bytes - this._maxNumberOfClubs = 0; // 2 bytes - this._racePointsFactor = 0; // 4 bytes - this._maxBodyClass = 0; // 2 bytes - this._maxPowerClass = 0; // 2 bytes - this._partsPrizeMax = 0; // 2 bytes - this._partsPrizeWon = 0; // 2 bytes - this._clubLogoId = 0; // 4 bytes - this._teamTrialsWeatherFlag = false; // 2 bytes - this._teamTrialsNightFlag = false; // 2 bytes - this._teamTrialsBackwardsFlag = false; // 2 bytes - this._teamTrialsNumberLaps = 0; // 2 bytes - this._teamTrialsBaseTimeUnderPar = 0; // 2 bytes - this._raceCashFactor = 0; // 4 bytes - } + _lobbyId: number; + _raceTypeId: number; + _terfId: number; + _lobbyName: string; + _turfName: string; + _clientArt: string; + _elementId: number; + _turfLengthId: number; + _startSlice: number; + _endSlice: number; + _dragStageLeft: number; + _dragStageRight: number; + _dragStagingSlice: number; + _gridSpreadFactor: number; + _linear: number; + _minNumberPlayers: number; + _maxNumberPlayers: number; + _defaultNumberPlayers: number; + _numberOfPlayersEnabled: boolean; + _minLaps: number; + _maxLaps: number; + _defaultNumberOfLaps: number; + _numberOfLapsEnabled: boolean; + _minNumberRounds: number; + _maxNumberRounds: number; + _defaultNumberRounds: number; + _numberOfRoundsEnabled: boolean; + _defaultWeather: number; + _weatherEnabled: boolean; + _defaultNight: number; + _nightEnabled: boolean; + _defaultBackwards: boolean; + _backwardsEnabled: boolean; + _defaultTraffic: boolean; + _trafficEnabled: boolean; + _defaultDriverAI: boolean; + _driverAIEnabled: boolean; + _topDog: string; + _turfOwner: string; + _qualifyingTime: number; + _numberOfClubPlayers: number; + _numberofClubLaps: number; + _numberOfClubRounds: number; + _clubNight: number; + _clubWeather: number; + _clubBackwards: number; + _bestLapTime: number; + _lobbyDifficulty: number; + _timetrialPointsToQualify: number; + _timetrialCashToQualify: number; + _timetrialPointsBonusIncrements: number; + _timetrialCashBonusIncrements: number; + _timetrialTimeIncrements: number; + _timetrial1stPlaceVictoryPoints: number; + _timetrial1stPlaceVictoryCash: number; + _timetrial2ndPlaceVictoryPoints: number; + _timetrial2ndPlaceVictoryCash: number; + _timetrial3rdPlaceVictoryPoints: number; + _timetrial3rdPlaceVictoryCash: number; + _minLevel: number; + _minResetSlice: number; + _maxResetSlice: number; + _newbieFlag: number; + _driverHelmetFlag: number; + _clubMaxNumberPlayers: number; + _clubMinNumberPlayers: number; + _clubNumberPlayersDefault: number; + _minNumberOfClubs: number; + _maxNumberOfClubs: number; + _racePointsFactor: number; + _maxBodyClass: number; + _maxPowerClass: number; + _partsPrizeMax: number; + _partsPrizeWon: number; + _clubLogoId: number; + _teamTrialsWeatherFlag: boolean; + _teamTrialsNightFlag: boolean; + _teamTrialsBackwardsFlag: boolean; + _teamTrialsNumberLaps: number; + _teamTrialsBaseTimeUnderPar: number; + _raceCashFactor: number; + constructor() { + super(); + this._lobbyId = 0; // 4 bytes + this._raceTypeId = 0; // 4 bytes + this._terfId = 0; // 4 bytes + this._lobbyName = ""; // 32 bytes + this._turfName = ""; // 256 bytes + this._clientArt = ""; // 11 bytes + this._elementId = 0; // 4 bytes + this._turfLengthId = 0; // 4 bytes + this._startSlice = 0; // 4 bytes + this._endSlice = 0; // 4 bytes + this._dragStageLeft = 0; // 4 bytes + this._dragStageRight = 0; // 4 bytes + this._dragStagingSlice = 0; // 4 bytes + this._gridSpreadFactor = 0; // 4 bytes + this._linear = 0; // 2 bytes + this._minNumberPlayers = 0; // 2 bytes + this._maxNumberPlayers = 0; // 2 bytes + this._defaultNumberPlayers = 0; // 2 bytes + this._numberOfPlayersEnabled = false; // 2 bytes + this._minLaps = 0; // 2 bytes + this._maxLaps = 0; // 2 bytes + this._defaultNumberOfLaps = 0; // 2 bytes + this._numberOfLapsEnabled = false; // 2 bytes + this._minNumberRounds = 0; // 2 bytes + this._maxNumberRounds = 0; // 2 bytes + this._defaultNumberRounds = 0; // 2 bytes + this._numberOfRoundsEnabled = false; // 2 bytes + this._defaultWeather = 0; // 2 bytes + this._weatherEnabled = false; // 2 bytes + this._defaultNight = 0; // 2 bytes + this._nightEnabled = false; // 2 bytes + this._defaultBackwards = false; // 2 bytes + this._backwardsEnabled = false; // 2 bytes + this._defaultTraffic = false; // 2 bytes + this._trafficEnabled = false; // 2 bytes + this._defaultDriverAI = false; // 2 bytes + this._driverAIEnabled = false; // 2 bytes + this._topDog = ""; // 13 bytes + this._turfOwner = ""; // 33 bytes + this._qualifyingTime = 0; // 4 bytes + this._numberOfClubPlayers = 0; // 4 bytes + this._numberofClubLaps = 0; // 4 bytes + this._numberOfClubRounds = 0; // 4 bytes + this._clubNight = 0; // 2 bytes + this._clubWeather = 0; // 2 bytes + this._clubBackwards = 0; // 2 bytes + this._bestLapTime = 0; // 4 bytes + this._lobbyDifficulty = 0; // 4 bytes + this._timetrialPointsToQualify = 0; // 4 bytes + this._timetrialCashToQualify = 0; // 4 bytes + this._timetrialPointsBonusIncrements = 0; // 4 bytes + this._timetrialCashBonusIncrements = 0; // 4 bytes + this._timetrialTimeIncrements = 0; // 4 bytes + this._timetrial1stPlaceVictoryPoints = 0; // 4 bytes + this._timetrial1stPlaceVictoryCash = 0; // 4 bytes + this._timetrial2ndPlaceVictoryPoints = 0; // 4 bytes + this._timetrial2ndPlaceVictoryCash = 0; // 4 bytes + this._timetrial3rdPlaceVictoryPoints = 0; // 4 bytes + this._timetrial3rdPlaceVictoryCash = 0; // 4 bytes + this._minLevel = 0; // 2 bytes + this._minResetSlice = 0; // 4 bytes + this._maxResetSlice = 0; // 4 bytes + this._newbieFlag = 0; // 2 bytes + this._driverHelmetFlag = 0; // 2 bytes + this._clubMaxNumberPlayers = 0; // 2 bytes + this._clubMinNumberPlayers = 0; // 2 bytes + this._clubNumberPlayersDefault = 0; // 2 bytes + this._minNumberOfClubs = 0; // 2 bytes + this._maxNumberOfClubs = 0; // 2 bytes + this._racePointsFactor = 0; // 4 bytes + this._maxBodyClass = 0; // 2 bytes + this._maxPowerClass = 0; // 2 bytes + this._partsPrizeMax = 0; // 2 bytes + this._partsPrizeWon = 0; // 2 bytes + this._clubLogoId = 0; // 4 bytes + this._teamTrialsWeatherFlag = false; // 2 bytes + this._teamTrialsNightFlag = false; // 2 bytes + this._teamTrialsBackwardsFlag = false; // 2 bytes + this._teamTrialsNumberLaps = 0; // 2 bytes + this._teamTrialsBaseTimeUnderPar = 0; // 2 bytes + this._raceCashFactor = 0; // 4 bytes + } - /** - * Deserialize a 2 byte boolean - * - * @param {Buffer} data - * @returns {boolean} - */ - deserializeBool(data: Buffer): boolean { - return data.readUInt16LE() === 1; - } + /** + * Deserialize a 2 byte boolean + * + * @param {Buffer} data + * @returns {boolean} + */ + deserializeBool(data: Buffer): boolean { + return data.readUInt16LE() === 1; + } - /** - * Serialize a 2 byte boolean - * - * @param {number} value - * @returns {Buffer} - */ - serializeBool(value: number): Buffer { - const buf = Buffer.alloc(2); - buf.writeUInt16LE(value ? 1 : 0); - return buf; - } + /** + * Serialize a 2 byte boolean + * + * @param {number} value + * @returns {Buffer} + */ + serializeBool(value: number): Buffer { + const buf = Buffer.alloc(2); + buf.writeUInt16LE(value ? 1 : 0); + return buf; + } - override size() { - return 563; - } + override size() { + return 563; + } - /** - * Deserialize the data - * - * @param {Buffer} data - */ - deserialize(data: Buffer) { - if (data.length !== this.size()) { - throw new ServerError( - `LobbyInfo.deserialize() expected ${this.size()} bytes but got ${ - data.length - } bytes`, - ); - } - let offset = 0; - this._lobbyId = data.readUInt32LE(offset); - offset += 4; - this._raceTypeId = data.readUInt32LE(offset); - offset += 4; - this._terfId = data.readUInt32LE(offset); - offset += 4; - this._lobbyName = data.toString("utf8", offset, offset + 32); - offset += 32; - this._turfName = data.toString("utf8", offset, offset + 256); - offset += 256; - this._clientArt = data.toString("utf8", offset, offset + 11); - offset += 11; - this._elementId = data.readUInt32LE(offset); - offset += 4; - this._turfLengthId = data.readUInt32LE(offset); - offset += 4; - this._startSlice = data.readUInt32LE(offset); - offset += 4; - this._endSlice = data.readUInt32LE(offset); - offset += 4; - this._dragStageLeft = data.readUInt32LE(offset); - offset += 4; - this._dragStageRight = data.readUInt32LE(offset); - offset += 4; - this._dragStagingSlice = data.readUInt32LE(offset); - offset += 4; - this._gridSpreadFactor = data.readUInt32LE(offset); - offset += 4; - this._linear = data.readUInt16LE(offset); - offset += 2; - this._minNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._maxNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._numberOfPlayersEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._minLaps = data.readUInt16LE(offset); - offset += 2; - this._maxLaps = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberOfLaps = data.readUInt16LE(offset); - offset += 2; - this._numberOfLapsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._minNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._maxNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._numberOfRoundsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultWeather = data.readUInt16LE(offset); - offset += 2; - this._weatherEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultNight = data.readUInt16LE(offset); - offset += 2; - this._nightEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultBackwards = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._backwardsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultTraffic = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._trafficEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultDriverAI = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._driverAIEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._topDog = data.toString("utf8", offset, offset + 13); - offset += 13; - this._turfOwner = data.toString("utf8", offset, offset + 33); - offset += 33; - this._qualifyingTime = data.readUInt32LE(offset); - offset += 4; - this._numberOfClubPlayers = data.readUInt32LE(offset); - offset += 4; - this._numberofClubLaps = data.readUInt32LE(offset); - offset += 4; - this._numberOfClubRounds = data.readUInt32LE(offset); - offset += 4; - this._clubNight = data.readUInt16LE(offset); - offset += 2; - this._clubWeather = data.readUInt16LE(offset); - offset += 2; - this._clubBackwards = data.readUInt16LE(offset); - offset += 2; - this._bestLapTime = data.readUInt32LE(offset); - offset += 4; - this._lobbyDifficulty = data.readUInt32LE(offset); - offset += 4; - this._timetrialPointsToQualify = data.readUInt32LE(offset); - offset += 4; - this._timetrialCashToQualify = data.readUInt32LE(offset); - offset += 4; - this._timetrialPointsBonusIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrialCashBonusIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrialTimeIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrial1stPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial1stPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._timetrial2ndPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial2ndPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._timetrial3rdPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial3rdPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._minLevel = data.readUInt16LE(offset); - offset += 2; - this._minResetSlice = data.readUInt32LE(offset); - offset += 4; - this._maxResetSlice = data.readUInt32LE(offset); - offset += 4; - this._newbieFlag = data.readUInt16LE(offset); - offset += 2; - this._driverHelmetFlag = data.readUInt16LE(offset); - offset += 2; - this._clubMaxNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._clubMinNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._clubNumberPlayersDefault = data.readUInt16LE(offset); - offset += 2; - this._minNumberOfClubs = data.readUInt16LE(offset); - offset += 2; - this._maxNumberOfClubs = data.readUInt16LE(offset); - offset += 2; - this._racePointsFactor = data.readUInt32LE(offset); - offset += 4; - this._maxBodyClass = data.readUInt16LE(offset); - offset += 2; - this._maxPowerClass = data.readUInt16LE(offset); - offset += 2; - this._partsPrizeMax = data.readUInt16LE(offset); - offset += 2; - this._partsPrizeWon = data.readUInt16LE(offset); - offset += 2; - this._clubLogoId = data.readUInt32LE(offset); - offset += 4; - this._teamTrialsWeatherFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsNightFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsBackwardsFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsNumberLaps = data.readUInt16LE(offset); - offset += 2; - this._teamTrialsBaseTimeUnderPar = data.readUInt16LE(offset); - offset += 2; - this._raceCashFactor = data.readUInt32LE(offset); - // 563 total bytes + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer) { + if (data.length !== this.size()) { + throw new ServerError( + `LobbyInfo.deserialize() expected ${this.size()} bytes but got ${ + data.length + } bytes`, + ); + } + let offset = 0; + this._lobbyId = data.readUInt32LE(offset); + offset += 4; + this._raceTypeId = data.readUInt32LE(offset); + offset += 4; + this._terfId = data.readUInt32LE(offset); + offset += 4; + this._lobbyName = data.toString("utf8", offset, offset + 32); + offset += 32; + this._turfName = data.toString("utf8", offset, offset + 256); + offset += 256; + this._clientArt = data.toString("utf8", offset, offset + 11); + offset += 11; + this._elementId = data.readUInt32LE(offset); + offset += 4; + this._turfLengthId = data.readUInt32LE(offset); + offset += 4; + this._startSlice = data.readUInt32LE(offset); + offset += 4; + this._endSlice = data.readUInt32LE(offset); + offset += 4; + this._dragStageLeft = data.readUInt32LE(offset); + offset += 4; + this._dragStageRight = data.readUInt32LE(offset); + offset += 4; + this._dragStagingSlice = data.readUInt32LE(offset); + offset += 4; + this._gridSpreadFactor = data.readUInt32LE(offset); + offset += 4; + this._linear = data.readUInt16LE(offset); + offset += 2; + this._minNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._maxNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._numberOfPlayersEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._minLaps = data.readUInt16LE(offset); + offset += 2; + this._maxLaps = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberOfLaps = data.readUInt16LE(offset); + offset += 2; + this._numberOfLapsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._minNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._maxNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._numberOfRoundsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultWeather = data.readUInt16LE(offset); + offset += 2; + this._weatherEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultNight = data.readUInt16LE(offset); + offset += 2; + this._nightEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultBackwards = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._backwardsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultTraffic = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._trafficEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultDriverAI = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._driverAIEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._topDog = data.toString("utf8", offset, offset + 13); + offset += 13; + this._turfOwner = data.toString("utf8", offset, offset + 33); + offset += 33; + this._qualifyingTime = data.readUInt32LE(offset); + offset += 4; + this._numberOfClubPlayers = data.readUInt32LE(offset); + offset += 4; + this._numberofClubLaps = data.readUInt32LE(offset); + offset += 4; + this._numberOfClubRounds = data.readUInt32LE(offset); + offset += 4; + this._clubNight = data.readUInt16LE(offset); + offset += 2; + this._clubWeather = data.readUInt16LE(offset); + offset += 2; + this._clubBackwards = data.readUInt16LE(offset); + offset += 2; + this._bestLapTime = data.readUInt32LE(offset); + offset += 4; + this._lobbyDifficulty = data.readUInt32LE(offset); + offset += 4; + this._timetrialPointsToQualify = data.readUInt32LE(offset); + offset += 4; + this._timetrialCashToQualify = data.readUInt32LE(offset); + offset += 4; + this._timetrialPointsBonusIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrialCashBonusIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrialTimeIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrial1stPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial1stPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._timetrial2ndPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial2ndPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._timetrial3rdPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial3rdPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._minLevel = data.readUInt16LE(offset); + offset += 2; + this._minResetSlice = data.readUInt32LE(offset); + offset += 4; + this._maxResetSlice = data.readUInt32LE(offset); + offset += 4; + this._newbieFlag = data.readUInt16LE(offset); + offset += 2; + this._driverHelmetFlag = data.readUInt16LE(offset); + offset += 2; + this._clubMaxNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._clubMinNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._clubNumberPlayersDefault = data.readUInt16LE(offset); + offset += 2; + this._minNumberOfClubs = data.readUInt16LE(offset); + offset += 2; + this._maxNumberOfClubs = data.readUInt16LE(offset); + offset += 2; + this._racePointsFactor = data.readUInt32LE(offset); + offset += 4; + this._maxBodyClass = data.readUInt16LE(offset); + offset += 2; + this._maxPowerClass = data.readUInt16LE(offset); + offset += 2; + this._partsPrizeMax = data.readUInt16LE(offset); + offset += 2; + this._partsPrizeWon = data.readUInt16LE(offset); + offset += 2; + this._clubLogoId = data.readUInt32LE(offset); + offset += 4; + this._teamTrialsWeatherFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsNightFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsBackwardsFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsNumberLaps = data.readUInt16LE(offset); + offset += 2; + this._teamTrialsBaseTimeUnderPar = data.readUInt16LE(offset); + offset += 2; + this._raceCashFactor = data.readUInt32LE(offset); + // 563 total bytes - return this; - } + return this; + } - override serialize() { - const buf = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buf.writeUInt32LE(this._lobbyId, offset); - offset += 4; // offset is 4 - buf.writeUInt32LE(this._raceTypeId, offset); - offset += 4; // offset is 8 - buf.writeUInt32LE(this._terfId, offset); - offset += 4; // offset is 12 - buf.write(this._lobbyName, offset, 32); - offset += 32; // offset is 44 - buf.write(this._turfName, offset, 256); - offset += 256; // offset is 300 - buf.write(this._clientArt, offset, 11); - offset += 11; // offset is 311 - buf.writeUInt32LE(this._elementId, offset); - offset += 4; // offset is 315 - buf.writeUInt32LE(this._turfLengthId, offset); - offset += 4; // offset is 319 - buf.writeUInt32LE(this._startSlice, offset); - offset += 4; // offset is 323 - buf.writeUInt32LE(this._endSlice, offset); - offset += 4; // offset is 327 - buf.writeUInt32LE(this._dragStageLeft, offset); - offset += 4; // offset is 331 - buf.writeUInt32LE(this._dragStageRight, offset); - offset += 4; // offset is 335 - buf.writeUInt32LE(this._dragStagingSlice, offset); - offset += 4; // offset is 339 - buf.writeUInt32LE(this._gridSpreadFactor, offset); - offset += 4; // offset is 343 - buf.writeUInt16LE(this._linear, offset); - offset += 2; // offset is 345 - buf.writeUInt16LE(this._minNumberPlayers, offset); - offset += 2; // offset is 347 - buf.writeUInt16LE(this._maxNumberPlayers, offset); - offset += 2; // offset is 349 - buf.writeUInt16LE(this._defaultNumberPlayers, offset); - offset += 2; // offset is 351 - buf.writeUInt16LE(this._numberOfPlayersEnabled ? 1 : 0, offset); - offset += 2; // offset is 353 - buf.writeUInt16LE(this._minLaps, offset); - offset += 2; // offset is 355 - buf.writeUInt16LE(this._maxLaps, offset); - offset += 2; // offset is 357 - buf.writeUInt16LE(this._defaultNumberOfLaps, offset); - offset += 2; // offset is 359 - buf.writeUInt16LE(this._numberOfLapsEnabled ? 1 : 0, offset); - offset += 2; // offset is 361 - buf.writeUInt16LE(this._minNumberRounds, offset); - offset += 2; // offset is 363 - buf.writeUInt16LE(this._maxNumberRounds, offset); - offset += 2; // offset is 365 - buf.writeUInt16LE(this._defaultNumberRounds, offset); - offset += 2; // offset is 367 - buf.writeUInt16LE(this._numberOfRoundsEnabled ? 1 : 0, offset); - offset += 2; // offset is 369 - buf.writeUInt16LE(this._defaultWeather, offset); - offset += 2; // offset is 371 - buf.writeUInt16LE(this._weatherEnabled ? 1 : 0, offset); - offset += 2; // offset is 373 - buf.writeUInt16LE(this._defaultNight, offset); - offset += 2; // offset is 375 - buf.writeUInt16LE(this._nightEnabled ? 1 : 0, offset); - offset += 2; // offset is 377 - buf.writeUInt16LE(this._defaultBackwards ? 1 : 0, offset); - offset += 2; // offset is 379 - buf.writeUInt16LE(this._backwardsEnabled ? 1 : 0, offset); - offset += 2; // offset is 381 - buf.writeUInt16LE(this._defaultTraffic ? 1 : 0, offset); - offset += 2; // offset is 383 - buf.writeUInt16LE(this._trafficEnabled ? 1 : 0, offset); - offset += 2; // offset is 385 - buf.writeUInt16LE(this._defaultDriverAI ? 1 : 0, offset); - offset += 2; // offset is 387 - buf.writeUInt16LE(this._driverAIEnabled ? 1 : 0, offset); - offset += 2; // offset is 389 - buf.write(this._topDog, offset, 13); - offset += 13; // offset is 402 - buf.write(this._turfOwner, offset, 33); - offset += 33; // offset is 435 - buf.writeUInt32LE(this._qualifyingTime, offset); - offset += 4; // offset is 439 - buf.writeUInt32LE(this._numberOfClubPlayers, offset); - offset += 4; // offset is 443 - buf.writeUInt32LE(this._numberofClubLaps, offset); - offset += 4; // offset is 447 - buf.writeUInt32LE(this._numberOfClubRounds, offset); - offset += 4; // offset is 451 - buf.writeUInt16LE(this._clubNight, offset); - offset += 2; // offset is 453 - buf.writeUInt16LE(this._clubWeather, offset); - offset += 2; // offset is 455 - buf.writeUInt16LE(this._clubBackwards, offset); - offset += 2; // offset is 457 - buf.writeUInt32LE(this._bestLapTime, offset); - offset += 4; // offset is 461 - buf.writeUInt32LE(this._lobbyDifficulty, offset); - offset += 4; // offset is 465 - buf.writeUInt32LE(this._timetrialPointsToQualify, offset); - offset += 4; // offset is 469 - buf.writeUInt32LE(this._timetrialCashToQualify, offset); - offset += 4; // offset is 473 - buf.writeUInt32LE(this._timetrialPointsBonusIncrements, offset); - offset += 4; // offset is 477 - buf.writeUInt32LE(this._timetrialCashBonusIncrements, offset); - offset += 4; // offset is 481 - buf.writeUInt32LE(this._timetrialTimeIncrements, offset); - offset += 4; // offset is 485 - buf.writeUInt32LE(this._timetrial1stPlaceVictoryPoints, offset); - offset += 4; // offset is 489 - buf.writeUInt32LE(this._timetrial1stPlaceVictoryCash, offset); - offset += 4; // offset is 493 - buf.writeUInt32LE(this._timetrial2ndPlaceVictoryPoints, offset); - offset += 4; // offset is 497 - buf.writeUInt32LE(this._timetrial2ndPlaceVictoryCash, offset); - offset += 4; // offset is 501 - buf.writeUInt32LE(this._timetrial3rdPlaceVictoryPoints, offset); - offset += 4; // offset is 505 - buf.writeUInt32LE(this._timetrial3rdPlaceVictoryCash, offset); - offset += 4; // offset is 509 - buf.writeUInt16LE(this._minLevel, offset); - offset += 2; // offset is 511 - buf.writeUInt32LE(this._minResetSlice, offset); - offset += 4; // offset is 515 - buf.writeUInt32LE(this._maxResetSlice, offset); - offset += 4; // offset is 519 - buf.writeUInt16LE(this._newbieFlag, offset); - offset += 2; // offset is 521 - buf.writeUInt16LE(this._driverHelmetFlag, offset); - offset += 2; // offset is 523 - buf.writeUInt16LE(this._clubMaxNumberPlayers, offset); - offset += 2; // offset is 525 - buf.writeUInt16LE(this._clubMinNumberPlayers, offset); - offset += 2; // offset is 527 - buf.writeUInt16LE(this._clubNumberPlayersDefault, offset); - offset += 2; // offset is 529 - buf.writeUInt16LE(this._minNumberOfClubs, offset); - offset += 2; // offset is 531 - buf.writeUInt16LE(this._maxNumberOfClubs, offset); - offset += 2; // offset is 533 - buf.writeUInt32LE(this._racePointsFactor, offset); - offset += 4; // offset is 537 - buf.writeUInt16LE(this._maxBodyClass, offset); - offset += 2; // offset is 539 - buf.writeUInt16LE(this._maxPowerClass, offset); - offset += 2; // offset is 541 - buf.writeUInt16LE(this._partsPrizeMax, offset); - offset += 2; // offset is 543 - buf.writeUInt16LE(this._partsPrizeWon, offset); - offset += 2; // offset is 545 - buf.writeUInt32LE(this._clubLogoId, offset); - offset += 4; // offset is 549 - buf.writeUInt16LE(this._teamTrialsWeatherFlag ? 1 : 0, offset); - offset += 2; // offset is 551 - buf.writeUInt16LE(this._teamTrialsNightFlag ? 1 : 0, offset); - offset += 2; // offset is 553 - buf.writeUInt16LE(this._teamTrialsBackwardsFlag ? 1 : 0, offset); - offset += 2; // offset is 555 - buf.writeUInt16LE(this._teamTrialsNumberLaps, offset); - offset += 2; // offset is 557 - buf.writeUInt16LE(this._teamTrialsBaseTimeUnderPar, offset); - offset += 2; // offset is 559 - buf.writeUInt32LE(this._raceCashFactor, offset); - // offset is 563 + override serialize() { + const buf = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buf.writeUInt32LE(this._lobbyId, offset); + offset += 4; // offset is 4 + buf.writeUInt32LE(this._raceTypeId, offset); + offset += 4; // offset is 8 + buf.writeUInt32LE(this._terfId, offset); + offset += 4; // offset is 12 + buf.write(this._lobbyName, offset, 32); + offset += 32; // offset is 44 + buf.write(this._turfName, offset, 256); + offset += 256; // offset is 300 + buf.write(this._clientArt, offset, 11); + offset += 11; // offset is 311 + buf.writeUInt32LE(this._elementId, offset); + offset += 4; // offset is 315 + buf.writeUInt32LE(this._turfLengthId, offset); + offset += 4; // offset is 319 + buf.writeUInt32LE(this._startSlice, offset); + offset += 4; // offset is 323 + buf.writeUInt32LE(this._endSlice, offset); + offset += 4; // offset is 327 + buf.writeUInt32LE(this._dragStageLeft, offset); + offset += 4; // offset is 331 + buf.writeUInt32LE(this._dragStageRight, offset); + offset += 4; // offset is 335 + buf.writeUInt32LE(this._dragStagingSlice, offset); + offset += 4; // offset is 339 + buf.writeUInt32LE(this._gridSpreadFactor, offset); + offset += 4; // offset is 343 + buf.writeUInt16LE(this._linear, offset); + offset += 2; // offset is 345 + buf.writeUInt16LE(this._minNumberPlayers, offset); + offset += 2; // offset is 347 + buf.writeUInt16LE(this._maxNumberPlayers, offset); + offset += 2; // offset is 349 + buf.writeUInt16LE(this._defaultNumberPlayers, offset); + offset += 2; // offset is 351 + buf.writeUInt16LE(this._numberOfPlayersEnabled ? 1 : 0, offset); + offset += 2; // offset is 353 + buf.writeUInt16LE(this._minLaps, offset); + offset += 2; // offset is 355 + buf.writeUInt16LE(this._maxLaps, offset); + offset += 2; // offset is 357 + buf.writeUInt16LE(this._defaultNumberOfLaps, offset); + offset += 2; // offset is 359 + buf.writeUInt16LE(this._numberOfLapsEnabled ? 1 : 0, offset); + offset += 2; // offset is 361 + buf.writeUInt16LE(this._minNumberRounds, offset); + offset += 2; // offset is 363 + buf.writeUInt16LE(this._maxNumberRounds, offset); + offset += 2; // offset is 365 + buf.writeUInt16LE(this._defaultNumberRounds, offset); + offset += 2; // offset is 367 + buf.writeUInt16LE(this._numberOfRoundsEnabled ? 1 : 0, offset); + offset += 2; // offset is 369 + buf.writeUInt16LE(this._defaultWeather, offset); + offset += 2; // offset is 371 + buf.writeUInt16LE(this._weatherEnabled ? 1 : 0, offset); + offset += 2; // offset is 373 + buf.writeUInt16LE(this._defaultNight, offset); + offset += 2; // offset is 375 + buf.writeUInt16LE(this._nightEnabled ? 1 : 0, offset); + offset += 2; // offset is 377 + buf.writeUInt16LE(this._defaultBackwards ? 1 : 0, offset); + offset += 2; // offset is 379 + buf.writeUInt16LE(this._backwardsEnabled ? 1 : 0, offset); + offset += 2; // offset is 381 + buf.writeUInt16LE(this._defaultTraffic ? 1 : 0, offset); + offset += 2; // offset is 383 + buf.writeUInt16LE(this._trafficEnabled ? 1 : 0, offset); + offset += 2; // offset is 385 + buf.writeUInt16LE(this._defaultDriverAI ? 1 : 0, offset); + offset += 2; // offset is 387 + buf.writeUInt16LE(this._driverAIEnabled ? 1 : 0, offset); + offset += 2; // offset is 389 + buf.write(this._topDog, offset, 13); + offset += 13; // offset is 402 + buf.write(this._turfOwner, offset, 33); + offset += 33; // offset is 435 + buf.writeUInt32LE(this._qualifyingTime, offset); + offset += 4; // offset is 439 + buf.writeUInt32LE(this._numberOfClubPlayers, offset); + offset += 4; // offset is 443 + buf.writeUInt32LE(this._numberofClubLaps, offset); + offset += 4; // offset is 447 + buf.writeUInt32LE(this._numberOfClubRounds, offset); + offset += 4; // offset is 451 + buf.writeUInt16LE(this._clubNight, offset); + offset += 2; // offset is 453 + buf.writeUInt16LE(this._clubWeather, offset); + offset += 2; // offset is 455 + buf.writeUInt16LE(this._clubBackwards, offset); + offset += 2; // offset is 457 + buf.writeUInt32LE(this._bestLapTime, offset); + offset += 4; // offset is 461 + buf.writeUInt32LE(this._lobbyDifficulty, offset); + offset += 4; // offset is 465 + buf.writeUInt32LE(this._timetrialPointsToQualify, offset); + offset += 4; // offset is 469 + buf.writeUInt32LE(this._timetrialCashToQualify, offset); + offset += 4; // offset is 473 + buf.writeUInt32LE(this._timetrialPointsBonusIncrements, offset); + offset += 4; // offset is 477 + buf.writeUInt32LE(this._timetrialCashBonusIncrements, offset); + offset += 4; // offset is 481 + buf.writeUInt32LE(this._timetrialTimeIncrements, offset); + offset += 4; // offset is 485 + buf.writeUInt32LE(this._timetrial1stPlaceVictoryPoints, offset); + offset += 4; // offset is 489 + buf.writeUInt32LE(this._timetrial1stPlaceVictoryCash, offset); + offset += 4; // offset is 493 + buf.writeUInt32LE(this._timetrial2ndPlaceVictoryPoints, offset); + offset += 4; // offset is 497 + buf.writeUInt32LE(this._timetrial2ndPlaceVictoryCash, offset); + offset += 4; // offset is 501 + buf.writeUInt32LE(this._timetrial3rdPlaceVictoryPoints, offset); + offset += 4; // offset is 505 + buf.writeUInt32LE(this._timetrial3rdPlaceVictoryCash, offset); + offset += 4; // offset is 509 + buf.writeUInt16LE(this._minLevel, offset); + offset += 2; // offset is 511 + buf.writeUInt32LE(this._minResetSlice, offset); + offset += 4; // offset is 515 + buf.writeUInt32LE(this._maxResetSlice, offset); + offset += 4; // offset is 519 + buf.writeUInt16LE(this._newbieFlag, offset); + offset += 2; // offset is 521 + buf.writeUInt16LE(this._driverHelmetFlag, offset); + offset += 2; // offset is 523 + buf.writeUInt16LE(this._clubMaxNumberPlayers, offset); + offset += 2; // offset is 525 + buf.writeUInt16LE(this._clubMinNumberPlayers, offset); + offset += 2; // offset is 527 + buf.writeUInt16LE(this._clubNumberPlayersDefault, offset); + offset += 2; // offset is 529 + buf.writeUInt16LE(this._minNumberOfClubs, offset); + offset += 2; // offset is 531 + buf.writeUInt16LE(this._maxNumberOfClubs, offset); + offset += 2; // offset is 533 + buf.writeUInt32LE(this._racePointsFactor, offset); + offset += 4; // offset is 537 + buf.writeUInt16LE(this._maxBodyClass, offset); + offset += 2; // offset is 539 + buf.writeUInt16LE(this._maxPowerClass, offset); + offset += 2; // offset is 541 + buf.writeUInt16LE(this._partsPrizeMax, offset); + offset += 2; // offset is 543 + buf.writeUInt16LE(this._partsPrizeWon, offset); + offset += 2; // offset is 545 + buf.writeUInt32LE(this._clubLogoId, offset); + offset += 4; // offset is 549 + buf.writeUInt16LE(this._teamTrialsWeatherFlag ? 1 : 0, offset); + offset += 2; // offset is 551 + buf.writeUInt16LE(this._teamTrialsNightFlag ? 1 : 0, offset); + offset += 2; // offset is 553 + buf.writeUInt16LE(this._teamTrialsBackwardsFlag ? 1 : 0, offset); + offset += 2; // offset is 555 + buf.writeUInt16LE(this._teamTrialsNumberLaps, offset); + offset += 2; // offset is 557 + buf.writeUInt16LE(this._teamTrialsBaseTimeUnderPar, offset); + offset += 2; // offset is 559 + buf.writeUInt32LE(this._raceCashFactor, offset); + // offset is 563 - return buf; - } + return buf; + } - override toString() { - return `LobbyInfo { + override toString() { + return `LobbyInfo { lobbyId: ${this._lobbyId}, raceTypeId: ${this._raceTypeId}, terfId: ${this._terfId}, @@ -725,5 +725,5 @@ export class LobbyInfo extends SerializedBuffer { teamTrialsBaseTimeUnderPar: ${this._teamTrialsBaseTimeUnderPar}, raceCashFactor: ${this._raceCashFactor}, }`; - } + } } diff --git a/packages/transactions/src/OwnedVehiclesMessage.ts b/packages/transactions/src/OwnedVehiclesMessage.ts index a5af75613..a33d323cd 100644 --- a/packages/transactions/src/OwnedVehiclesMessage.ts +++ b/packages/transactions/src/OwnedVehiclesMessage.ts @@ -21,76 +21,76 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; * This is the body of a MessageNode */ export class OwnedVehiclesMessage extends SerializedBuffer { - _msgNo: number; - _numberOfVehicles: number; - _vehicleList: OwnedVehicle[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._numberOfVehicles = 0; // 1 bytes - /** @type {OwnedVehicle[]} */ - this._vehicleList = []; // 8 bytes each - } + _msgNo: number; + _numberOfVehicles: number; + _vehicleList: OwnedVehicle[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._numberOfVehicles = 0; // 1 bytes + /** @type {OwnedVehicle[]} */ + this._vehicleList = []; // 8 bytes each + } - override size() { - return 5 + this._vehicleList.length * 8; - } + override size() { + return 5 + this._vehicleList.length * 8; + } - /** - * Add a lobby to the list - * @param {GameUrl} lobby - */ - addVehicle(vehicle: OwnedVehicle) { - this._vehicleList.push(vehicle); - this._numberOfVehicles++; - } + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addVehicle(vehicle: OwnedVehicle) { + this._vehicleList.push(vehicle); + this._numberOfVehicles++; + } - override serialize() { - const neededSize = 4 + this._vehicleList.length * 8; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeInt8(this._numberOfVehicles, offset); - offset += 1; // offset is 3 - for (const vehicle of this._vehicleList) { - const vehicleBuffer = vehicle.serialize(); - vehicleBuffer.copy(buffer, offset); - offset += vehicleBuffer.length; - } + override serialize() { + const neededSize = 4 + this._vehicleList.length * 8; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeInt8(this._numberOfVehicles, offset); + offset += 1; // offset is 3 + for (const vehicle of this._vehicleList) { + const vehicleBuffer = vehicle.serialize(); + vehicleBuffer.copy(buffer, offset); + offset += vehicleBuffer.length; + } - return buffer; - } + return buffer; + } - override toString() { - return `OwnedVehiclesMessage: msgNo=${this._msgNo} numberOfVehicles=${this._numberOfVehicles}`; - } + override toString() { + return `OwnedVehiclesMessage: msgNo=${this._msgNo} numberOfVehicles=${this._numberOfVehicles}`; + } } export class OwnedVehicle extends SerializedBuffer { - _vehicleId: number; - _brandedPartId: number; - constructor() { - super(); - this._vehicleId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - } + _vehicleId: number; + _brandedPartId: number; + constructor() { + super(); + this._vehicleId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + } - override size() { - return 8; - } + override size() { + return 8; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._vehicleId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._brandedPartId, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._vehicleId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._brandedPartId, offset); - return buffer; - } + return buffer; + } - override toString() { - return `OwnedVehicle: vehicleId=${this._vehicleId} brandedPartId=${this._brandedPartId}`; - } + override toString() { + return `OwnedVehicle: vehicleId=${this._vehicleId} brandedPartId=${this._brandedPartId}`; + } } diff --git a/packages/transactions/src/PartsAssemblyMessage.ts b/packages/transactions/src/PartsAssemblyMessage.ts index e572973bf..0628012ea 100644 --- a/packages/transactions/src/PartsAssemblyMessage.ts +++ b/packages/transactions/src/PartsAssemblyMessage.ts @@ -1,101 +1,101 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; export class PartsAssemblyMessage extends SerializedBuffer { - _msgNo: number; - _ownerId: number; - _numberOfParts: number; - _partList: Part[]; - constructor(owerId: number) { - super(); - this._msgNo = 0; // 2 bytes - this._ownerId = owerId; // 4 bytes - this._numberOfParts = 0; // 1 bytes - /** @type {Part[]} */ - this._partList = []; // 34 bytes each - } + _msgNo: number; + _ownerId: number; + _numberOfParts: number; + _partList: Part[]; + constructor(owerId: number) { + super(); + this._msgNo = 0; // 2 bytes + this._ownerId = owerId; // 4 bytes + this._numberOfParts = 0; // 1 bytes + /** @type {Part[]} */ + this._partList = []; // 34 bytes each + } - override size() { - return 7 + this._partList.length * 34; - } + override size() { + return 7 + this._partList.length * 34; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._ownerId, offset); - offset += 4; // offset is 6 - buffer.writeInt8(this._numberOfParts, offset); - offset += 1; // offset is 7 - for (const part of this._partList) { - const partBuffer = part.serialize(); - partBuffer.copy(buffer, offset); - offset += partBuffer.length; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._ownerId, offset); + offset += 4; // offset is 6 + buffer.writeInt8(this._numberOfParts, offset); + offset += 1; // offset is 7 + for (const part of this._partList) { + const partBuffer = part.serialize(); + partBuffer.copy(buffer, offset); + offset += partBuffer.length; + } - return buffer; - } + return buffer; + } } export class Part extends SerializedBuffer { - _partId: number; // 4 bytes - _parentPartId: number; // 4 bytes - _brandedPartId: number; // 4 bytes - _repairPrice: number; // 4 bytes - _junkPrice: number; // 4 bytes - _wear: number; // 4 bytes - _attachmentPoint: number; // 1 byte - _damage: number; // 1 byte - _retailPrice: number; // 4 bytes - _maxWear: number; // 4 bytes + _partId: number; // 4 bytes + _parentPartId: number; // 4 bytes + _brandedPartId: number; // 4 bytes + _repairPrice: number; // 4 bytes + _junkPrice: number; // 4 bytes + _wear: number; // 4 bytes + _attachmentPoint: number; // 1 byte + _damage: number; // 1 byte + _retailPrice: number; // 4 bytes + _maxWear: number; // 4 bytes - constructor() { - super(); - this._partId = 0; // 4 bytes - this._parentPartId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - this._repairPrice = 0; // 4 bytes - this._junkPrice = 0; // 4 bytes - this._wear = 0; // 4 bytes - this._attachmentPoint = 0; // 1 byte - this._damage = 0; // 1 byte - this._retailPrice = 0; // 4 bytes - this._maxWear = 0; // 4 bytes - // 33 bytes total - } + constructor() { + super(); + this._partId = 0; // 4 bytes + this._parentPartId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + this._repairPrice = 0; // 4 bytes + this._junkPrice = 0; // 4 bytes + this._wear = 0; // 4 bytes + this._attachmentPoint = 0; // 1 byte + this._damage = 0; // 1 byte + this._retailPrice = 0; // 4 bytes + this._maxWear = 0; // 4 bytes + // 33 bytes total + } - override size() { - return 34; - } + override size() { + return 34; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt32LE(this._partId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._parentPartId, offset); - offset += 4; // offset is 8 - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; // offset is 12 - buffer.writeUInt32LE(this._repairPrice, offset); - offset += 4; // offset is 16 - buffer.writeUInt32LE(this._junkPrice, offset); - offset += 4; // offset is 20 - buffer.writeUInt32LE(this._wear, offset); - offset += 4; // offset is 24 - buffer.writeUInt8(this._attachmentPoint, offset); - offset += 1; // offset is 25 - buffer.writeUInt8(this._damage, offset); - offset += 1; // offset is 26 - buffer.writeUInt32LE(this._retailPrice, offset); - offset += 4; // offset is 30 - buffer.writeUInt32LE(this._maxWear, offset); - // offset += 4; // offset is 34 + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt32LE(this._partId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._parentPartId, offset); + offset += 4; // offset is 8 + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; // offset is 12 + buffer.writeUInt32LE(this._repairPrice, offset); + offset += 4; // offset is 16 + buffer.writeUInt32LE(this._junkPrice, offset); + offset += 4; // offset is 20 + buffer.writeUInt32LE(this._wear, offset); + offset += 4; // offset is 24 + buffer.writeUInt8(this._attachmentPoint, offset); + offset += 1; // offset is 25 + buffer.writeUInt8(this._damage, offset); + offset += 1; // offset is 26 + buffer.writeUInt32LE(this._retailPrice, offset); + offset += 4; // offset is 30 + buffer.writeUInt32LE(this._maxWear, offset); + // offset += 4; // offset is 34 - return buffer; - } + return buffer; + } - override toString() { - return `Part: partId=${this._partId} parentPartId=${this._parentPartId} brandedPartId=${this._brandedPartId} repairPrice=${this._repairPrice} junkPrice=${this._junkPrice} wear=${this._wear} attachmentPoint=${this._attachmentPoint} damage=${this._damage} retailPrice=${this._retailPrice} maxWear=${this._maxWear}`; - } + override toString() { + return `Part: partId=${this._partId} parentPartId=${this._parentPartId} brandedPartId=${this._brandedPartId} repairPrice=${this._repairPrice} junkPrice=${this._junkPrice} wear=${this._wear} attachmentPoint=${this._attachmentPoint} damage=${this._damage} retailPrice=${this._retailPrice} maxWear=${this._maxWear}`; + } } diff --git a/packages/transactions/src/PlayerInfoMessage.ts b/packages/transactions/src/PlayerInfoMessage.ts index 282d07a0d..6a48818b2 100644 --- a/packages/transactions/src/PlayerInfoMessage.ts +++ b/packages/transactions/src/PlayerInfoMessage.ts @@ -14,207 +14,202 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { Timestamp } from "../../shared/TimeStamp.js"; import { - SerializedBuffer, - serializeStringRaw, + SerializedBuffer, + serializeStringRaw, } from "../../shared/messageFactory.js"; -import { Timestamp } from "../../shared/TimeStamp.js"; /** * A message listing the player's owned vehicles * This is the body of a MessageNode */ export class PlayerInfoMessage extends SerializedBuffer { - _msgNo: number; // 2 bytes - _playerId: number; // 4 bytes - _playerName: string; // 13 bytes - _driversLicense: string; // 12 bytes - _driverClass: number; // 1 byte - _bankBalance: number; // 4 bytes - _numberOfVehicles: number; // 2 bytes - _isLoggedOn: boolean; // 1 byte - _carsList: string[] = []; // 6 entries of 3 byte strings - _licensesPlateCode: number; // 2 bytes - _licensesPlateText: string; // 8 bytes - _carInfoSetttings: number; // 4 bytes - _vehicleId: number; // 4 bytes - _numberOfRacesEntered: number; // 4 bytes - _numberOfRacesWon: number; // 4 bytes - _numberOfRacesCompleted: number; // 4 bytes - _totalWinings: number; // 4 bytes - _insuranceRisk: number; // 2 bytes - _insurancePoints: number; // 4 bytes - _challengeRacesEntered: number; // 4 bytes - _challengeRacesWon: number; // 4 bytes - _challengeRacesCompleted: number; // 4 bytes - _numberofCarsWon: number; // 2 bytes - _numberOfCarsLost: number; // 2 bytes - _points: number; // 4 bytes - _currentLevel: number; // 4 bytes - _currentRank: number; // 4 bytes - _numberOfPointsToNextLevel: number; // 2 bytes - _numberOfPointsToNextRank: number; // 2 bytes - _maxInventorySlots: number; // 4 bytes - _numberOfInventorySlotsUsed: number; // 4 bytes - _numberOfInventoryIemsOnAuction: number; // 4 bytes - _highestBidInAuction: number; // 4 bytes - _currentClub: number; // 4 bytes - _dateLeftClub: Timestamp; // 4 bytes - _canBeInvitedToClub: boolean; // 1 byte - _playerDescription: string; // 256 + 1 bytes + _msgNo: number; // 2 bytes + _playerId: number; // 4 bytes + _playerName: string; // 13 bytes + _driversLicense: string; // 12 bytes + _driverClass: number; // 1 byte + _bankBalance: number; // 4 bytes + _numberOfVehicles: number; // 2 bytes + _isLoggedOn: boolean; // 1 byte + _carsList: string[] = []; // 6 entries of 3 byte strings + _licensesPlateCode: number; // 2 bytes + _licensesPlateText: string; // 8 bytes + _carInfoSetttings: number; // 4 bytes + _vehicleId: number; // 4 bytes + _numberOfRacesEntered: number; // 4 bytes + _numberOfRacesWon: number; // 4 bytes + _numberOfRacesCompleted: number; // 4 bytes + _totalWinings: number; // 4 bytes + _insuranceRisk: number; // 2 bytes + _insurancePoints: number; // 4 bytes + _challengeRacesEntered: number; // 4 bytes + _challengeRacesWon: number; // 4 bytes + _challengeRacesCompleted: number; // 4 bytes + _numberofCarsWon: number; // 2 bytes + _numberOfCarsLost: number; // 2 bytes + _points: number; // 4 bytes + _currentLevel: number; // 4 bytes + _currentRank: number; // 4 bytes + _numberOfPointsToNextLevel: number; // 2 bytes + _numberOfPointsToNextRank: number; // 2 bytes + _maxInventorySlots: number; // 4 bytes + _numberOfInventorySlotsUsed: number; // 4 bytes + _numberOfInventoryIemsOnAuction: number; // 4 bytes + _highestBidInAuction: number; // 4 bytes + _currentClub: number; // 4 bytes + _dateLeftClub: Timestamp; // 4 bytes + _canBeInvitedToClub: boolean; // 1 byte + _playerDescription: string; // 256 + 1 bytes - constructor() { - super(); - this._msgNo = 122; // 2 bytes - this._playerId = 0; // 4 bytes - this._playerName = ""; // 13 bytes - this._driversLicense = ""; // 12 bytes - this._driverClass = 0; // 1 byte - this._bankBalance = 0; // 4 bytes - this._numberOfVehicles = 0; // 2 bytes - this._isLoggedOn = false; // 1 byte - this._carsList = ["", "", "", "", "", ""]; // 6 entries of 3 byte strings - this._licensesPlateCode = 0; // 2 bytes - this._licensesPlateText = ""; // 8 bytes - this._carInfoSetttings = 0; // 4 bytes - this._vehicleId = 0; // 4 bytes - this._numberOfRacesEntered = 0; // 4 bytes - this._numberOfRacesWon = 0; // 4 bytes - this._numberOfRacesCompleted = 0; // 4 bytes - this._totalWinings = 0; // 4 bytes - this._insuranceRisk = 0; // 2 bytes - this._insurancePoints = 0; // 4 bytes - this._challengeRacesEntered = 0; // 4 bytes - this._challengeRacesWon = 0; // 4 bytes - this._challengeRacesCompleted = 0; // 4 bytes - this._numberofCarsWon = 0; // 2 bytes - this._numberOfCarsLost = 0; // 2 bytes - this._points = 0; // 4 bytes - this._currentLevel = 0; // 4 bytes - this._currentRank = 0; // 4 bytes - this._numberOfPointsToNextLevel = 0; // 2 bytes - this._numberOfPointsToNextRank = 0; // 2 bytes - this._maxInventorySlots = 0; // 4 bytes - this._numberOfInventorySlotsUsed = 0; // 4 bytes - this._numberOfInventoryIemsOnAuction = 0; // 4 bytes - this._highestBidInAuction = 0; // 4 bytes - this._currentClub = 0; // 4 bytes - this._dateLeftClub = new Timestamp(); // 4 bytes - this._canBeInvitedToClub = false; // 1 byte - this._playerDescription = ""; // 256 + 1 bytes - // total byes: 128 + 256 + 1 = 385 - } + constructor() { + super(); + this._msgNo = 122; // 2 bytes + this._playerId = 0; // 4 bytes + this._playerName = ""; // 13 bytes + this._driversLicense = ""; // 12 bytes + this._driverClass = 0; // 1 byte + this._bankBalance = 0; // 4 bytes + this._numberOfVehicles = 0; // 2 bytes + this._isLoggedOn = false; // 1 byte + this._carsList = ["", "", "", "", "", ""]; // 6 entries of 3 byte strings + this._licensesPlateCode = 0; // 2 bytes + this._licensesPlateText = ""; // 8 bytes + this._carInfoSetttings = 0; // 4 bytes + this._vehicleId = 0; // 4 bytes + this._numberOfRacesEntered = 0; // 4 bytes + this._numberOfRacesWon = 0; // 4 bytes + this._numberOfRacesCompleted = 0; // 4 bytes + this._totalWinings = 0; // 4 bytes + this._insuranceRisk = 0; // 2 bytes + this._insurancePoints = 0; // 4 bytes + this._challengeRacesEntered = 0; // 4 bytes + this._challengeRacesWon = 0; // 4 bytes + this._challengeRacesCompleted = 0; // 4 bytes + this._numberofCarsWon = 0; // 2 bytes + this._numberOfCarsLost = 0; // 2 bytes + this._points = 0; // 4 bytes + this._currentLevel = 0; // 4 bytes + this._currentRank = 0; // 4 bytes + this._numberOfPointsToNextLevel = 0; // 2 bytes + this._numberOfPointsToNextRank = 0; // 2 bytes + this._maxInventorySlots = 0; // 4 bytes + this._numberOfInventorySlotsUsed = 0; // 4 bytes + this._numberOfInventoryIemsOnAuction = 0; // 4 bytes + this._highestBidInAuction = 0; // 4 bytes + this._currentClub = 0; // 4 bytes + this._dateLeftClub = new Timestamp(); // 4 bytes + this._canBeInvitedToClub = false; // 1 byte + this._playerDescription = ""; // 256 + 1 bytes + // total byes: 128 + 256 + 1 = 385 + } - override size() { - return 385; - } + override size() { + return 385; + } - override serialize() { - const neededSize = this.size(); - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._playerId, offset); - offset += 4; // offset is 6 - serializeStringRaw( - this._playerName.substring(0, 12), - buffer, - offset, - 13, - ); - offset += 13; // offset is 19 - serializeStringRaw( - this._driversLicense.substring(0, 11), - buffer, - offset, - 12, - ); - offset += 12; // offset is 31 - buffer.writeUInt8(this._driverClass, offset); - offset += 1; // offset is 32 - buffer.writeUInt32LE(this._bankBalance, offset); - offset += 4; // offset is 36 - buffer.writeUInt16LE(this._numberOfVehicles, offset); - offset += 2; // offset is 38 - buffer.writeUInt8(this._isLoggedOn ? 1 : 0, offset); - offset += 1; // offset is 39 - for (const car of this._carsList) { - buffer.write(car, offset); - serializeStringRaw(car, buffer, offset, 3); - offset += 3; - } - buffer.writeUInt16LE(this._licensesPlateCode, offset); - offset += 2; // offset is 41 - serializeStringRaw( - this._licensesPlateText.substring(0, 7), - buffer, - offset, - 8, - ); - offset += 8; // offset is 49 - buffer.writeUInt32LE(this._carInfoSetttings, offset); - offset += 4; // offset is 53 - buffer.writeUInt32LE(this._vehicleId, offset); - offset += 4; // offset is 57 - buffer.writeUInt32LE(this._numberOfRacesEntered, offset); - offset += 4; // offset is 61 - buffer.writeUInt32LE(this._numberOfRacesWon, offset); - offset += 4; // offset is 65 - buffer.writeUInt32LE(this._numberOfRacesCompleted, offset); - offset += 4; // offset is 69 - buffer.writeUInt32LE(this._totalWinings, offset); - offset += 4; // offset is 73 - buffer.writeUInt16LE(this._insuranceRisk, offset); - offset += 2; // offset is 75 - buffer.writeUInt32LE(this._insurancePoints, offset); - offset += 4; // offset is 79 - buffer.writeUInt32LE(this._challengeRacesEntered, offset); - offset += 4; // offset is 83 - buffer.writeUInt32LE(this._challengeRacesWon, offset); - offset += 4; // offset is 87 - buffer.writeUInt32LE(this._challengeRacesCompleted, offset); - offset += 4; // offset is 91 - buffer.writeUInt16LE(this._numberofCarsWon, offset); - offset += 2; // offset is 93 - buffer.writeUInt16LE(this._numberOfCarsLost, offset); - offset += 2; // offset is 95 - buffer.writeUInt32LE(this._points, offset); - offset += 4; // offset is 99 - buffer.writeUInt32LE(this._currentLevel, offset); - offset += 4; // offset is 103 - buffer.writeUInt32LE(this._currentRank, offset); - offset += 4; // offset is 107 - buffer.writeUInt16LE(this._numberOfPointsToNextLevel, offset); - offset += 2; // offset is 109 - buffer.writeUInt16LE(this._numberOfPointsToNextRank, offset); - offset += 2; // offset is 111 - buffer.writeUInt32LE(this._maxInventorySlots, offset); - offset += 4; // offset is 115 - buffer.writeUInt32LE(this._numberOfInventorySlotsUsed, offset); - offset += 4; // offset is 119 - buffer.writeUInt32LE(this._numberOfInventoryIemsOnAuction, offset); - offset += 4; // offset is 123 - buffer.writeUInt32LE(this._highestBidInAuction, offset); - offset += 4; // offset is 127 - buffer.writeUInt32LE(this._currentClub, offset); - offset += 4; // offset is 131 - const dateLeftClubBuffer = this._dateLeftClub.as64BitNumber(); - buffer.writeUInt32LE(dateLeftClubBuffer, offset); - offset += 4; // offset is 135 - buffer.writeUInt8(this._canBeInvitedToClub ? 1 : 0, offset); - offset += 1; // offset is 136 - serializeStringRaw( - this._playerDescription.substring(0, 255), - buffer, - offset, - 256, - ); + override serialize() { + const neededSize = this.size(); + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._playerId, offset); + offset += 4; // offset is 6 + serializeStringRaw(this._playerName.substring(0, 12), buffer, offset, 13); + offset += 13; // offset is 19 + serializeStringRaw( + this._driversLicense.substring(0, 11), + buffer, + offset, + 12, + ); + offset += 12; // offset is 31 + buffer.writeUInt8(this._driverClass, offset); + offset += 1; // offset is 32 + buffer.writeUInt32LE(this._bankBalance, offset); + offset += 4; // offset is 36 + buffer.writeUInt16LE(this._numberOfVehicles, offset); + offset += 2; // offset is 38 + buffer.writeUInt8(this._isLoggedOn ? 1 : 0, offset); + offset += 1; // offset is 39 + for (const car of this._carsList) { + buffer.write(car, offset); + serializeStringRaw(car, buffer, offset, 3); + offset += 3; + } + buffer.writeUInt16LE(this._licensesPlateCode, offset); + offset += 2; // offset is 41 + serializeStringRaw( + this._licensesPlateText.substring(0, 7), + buffer, + offset, + 8, + ); + offset += 8; // offset is 49 + buffer.writeUInt32LE(this._carInfoSetttings, offset); + offset += 4; // offset is 53 + buffer.writeUInt32LE(this._vehicleId, offset); + offset += 4; // offset is 57 + buffer.writeUInt32LE(this._numberOfRacesEntered, offset); + offset += 4; // offset is 61 + buffer.writeUInt32LE(this._numberOfRacesWon, offset); + offset += 4; // offset is 65 + buffer.writeUInt32LE(this._numberOfRacesCompleted, offset); + offset += 4; // offset is 69 + buffer.writeUInt32LE(this._totalWinings, offset); + offset += 4; // offset is 73 + buffer.writeUInt16LE(this._insuranceRisk, offset); + offset += 2; // offset is 75 + buffer.writeUInt32LE(this._insurancePoints, offset); + offset += 4; // offset is 79 + buffer.writeUInt32LE(this._challengeRacesEntered, offset); + offset += 4; // offset is 83 + buffer.writeUInt32LE(this._challengeRacesWon, offset); + offset += 4; // offset is 87 + buffer.writeUInt32LE(this._challengeRacesCompleted, offset); + offset += 4; // offset is 91 + buffer.writeUInt16LE(this._numberofCarsWon, offset); + offset += 2; // offset is 93 + buffer.writeUInt16LE(this._numberOfCarsLost, offset); + offset += 2; // offset is 95 + buffer.writeUInt32LE(this._points, offset); + offset += 4; // offset is 99 + buffer.writeUInt32LE(this._currentLevel, offset); + offset += 4; // offset is 103 + buffer.writeUInt32LE(this._currentRank, offset); + offset += 4; // offset is 107 + buffer.writeUInt16LE(this._numberOfPointsToNextLevel, offset); + offset += 2; // offset is 109 + buffer.writeUInt16LE(this._numberOfPointsToNextRank, offset); + offset += 2; // offset is 111 + buffer.writeUInt32LE(this._maxInventorySlots, offset); + offset += 4; // offset is 115 + buffer.writeUInt32LE(this._numberOfInventorySlotsUsed, offset); + offset += 4; // offset is 119 + buffer.writeUInt32LE(this._numberOfInventoryIemsOnAuction, offset); + offset += 4; // offset is 123 + buffer.writeUInt32LE(this._highestBidInAuction, offset); + offset += 4; // offset is 127 + buffer.writeUInt32LE(this._currentClub, offset); + offset += 4; // offset is 131 + const dateLeftClubBuffer = this._dateLeftClub.as64BitNumber(); + buffer.writeUInt32LE(dateLeftClubBuffer, offset); + offset += 4; // offset is 135 + buffer.writeUInt8(this._canBeInvitedToClub ? 1 : 0, offset); + offset += 1; // offset is 136 + serializeStringRaw( + this._playerDescription.substring(0, 255), + buffer, + offset, + 256, + ); - return buffer; - } + return buffer; + } - override toString() { - return `PlayerInfoMessage: msgNo=${this._msgNo} playerId=${this._playerId} playerName=${this._playerName} driversLicense=${this._driversLicense} driverClass=${this._driverClass} bankBalance=${this._bankBalance} numberOfVehicles=${this._numberOfVehicles} isLoggedOn=${this._isLoggedOn} carsList=${this._carsList} licensesPlateCode=${this._licensesPlateCode} licensesPlateText=${this._licensesPlateText} carInfoSetttings=${this._carInfoSetttings} vehicleId=${this._vehicleId} numberOfRacesEntered=${this._numberOfRacesEntered} numberOfRacesWon=${this._numberOfRacesWon} numberOfRacesCompleted=${this._numberOfRacesCompleted} totalWinings=${this._totalWinings} insuranceRisk=${this._insuranceRisk} insurancePoints=${this._insurancePoints} challengeRacesEntered=${this._challengeRacesEntered} challengeRacesWon=${this._challengeRacesWon} challengeRacesCompleted=${this._challengeRacesCompleted} numberofCarsWon=${this._numberofCarsWon} numberOfCarsLost=${this._numberOfCarsLost} points=${this._points} currentLevel=${this._currentLevel} currentRank=${this._currentRank} numberOfPointsToNextLevel=${this._numberOfPointsToNextLevel} numberOfPointsToNextRank=${this._numberOfPointsToNextRank} maxInventorySlots=${this._maxInventorySlots} numberOfInventorySlotsUsed=${this._numberOfInventorySlotsUsed} numberOfInventoryIemsOnAuction=${this._numberOfInventoryIemsOnAuction} highestBidInAuction=${this._highestBidInAuction} currentClub=${this._currentClub} dateLeftClub=${this._dateLeftClub} canBeInvitedToClub=${this._canBeInvitedToClub} playerDescription=${this._playerDescription}`; - } + override toString() { + return `PlayerInfoMessage: msgNo=${this._msgNo} playerId=${this._playerId} playerName=${this._playerName} driversLicense=${this._driversLicense} driverClass=${this._driverClass} bankBalance=${this._bankBalance} numberOfVehicles=${this._numberOfVehicles} isLoggedOn=${this._isLoggedOn} carsList=${this._carsList} licensesPlateCode=${this._licensesPlateCode} licensesPlateText=${this._licensesPlateText} carInfoSetttings=${this._carInfoSetttings} vehicleId=${this._vehicleId} numberOfRacesEntered=${this._numberOfRacesEntered} numberOfRacesWon=${this._numberOfRacesWon} numberOfRacesCompleted=${this._numberOfRacesCompleted} totalWinings=${this._totalWinings} insuranceRisk=${this._insuranceRisk} insurancePoints=${this._insurancePoints} challengeRacesEntered=${this._challengeRacesEntered} challengeRacesWon=${this._challengeRacesWon} challengeRacesCompleted=${this._challengeRacesCompleted} numberofCarsWon=${this._numberofCarsWon} numberOfCarsLost=${this._numberOfCarsLost} points=${this._points} currentLevel=${this._currentLevel} currentRank=${this._currentRank} numberOfPointsToNextLevel=${this._numberOfPointsToNextLevel} numberOfPointsToNextRank=${this._numberOfPointsToNextRank} maxInventorySlots=${this._maxInventorySlots} numberOfInventorySlotsUsed=${this._numberOfInventorySlotsUsed} numberOfInventoryIemsOnAuction=${this._numberOfInventoryIemsOnAuction} highestBidInAuction=${this._highestBidInAuction} currentClub=${this._currentClub} dateLeftClub=${this._dateLeftClub} canBeInvitedToClub=${this._canBeInvitedToClub} playerDescription=${this._playerDescription}`; + } } diff --git a/packages/transactions/src/PlayerPhysicalMessage.ts b/packages/transactions/src/PlayerPhysicalMessage.ts index 641f322cf..e5a50d1d6 100644 --- a/packages/transactions/src/PlayerPhysicalMessage.ts +++ b/packages/transactions/src/PlayerPhysicalMessage.ts @@ -1,50 +1,50 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; export class PlayerPhysicalMessage extends SerializedBuffer { - _msgNo: number; // 2 bytes - _playerId: number; // 4 bytes - _bodytype: number; // 4 bytes - _hairColor: number; // 4 bytes - _skinColor: number; // 4 bytes - _shirtColor: number; // 4 bytes - _pantsColor: number; // 4 bytes - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._playerId = 0; // 4 bytes - this._bodytype = 0; // 4 bytes - this._hairColor = 0; // 4 bytes - this._skinColor = 0; // 4 bytes - this._shirtColor = 0; // 4 bytes - this._pantsColor = 0; // 4 bytes - // total: 26 bytes - } + _msgNo: number; // 2 bytes + _playerId: number; // 4 bytes + _bodytype: number; // 4 bytes + _hairColor: number; // 4 bytes + _skinColor: number; // 4 bytes + _shirtColor: number; // 4 bytes + _pantsColor: number; // 4 bytes + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._playerId = 0; // 4 bytes + this._bodytype = 0; // 4 bytes + this._hairColor = 0; // 4 bytes + this._skinColor = 0; // 4 bytes + this._shirtColor = 0; // 4 bytes + this._pantsColor = 0; // 4 bytes + // total: 26 bytes + } - override size() { - return 26; - } + override size() { + return 26; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._playerId, offset); - offset += 4; - buffer.writeUInt32LE(this._bodytype, offset); - offset += 4; - buffer.writeUInt32LE(this._hairColor, offset); - offset += 4; - buffer.writeUInt32LE(this._skinColor, offset); - offset += 4; - buffer.writeUInt32LE(this._shirtColor, offset); - offset += 4; - buffer.writeUInt32LE(this._pantsColor, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._playerId, offset); + offset += 4; + buffer.writeUInt32LE(this._bodytype, offset); + offset += 4; + buffer.writeUInt32LE(this._hairColor, offset); + offset += 4; + buffer.writeUInt32LE(this._skinColor, offset); + offset += 4; + buffer.writeUInt32LE(this._shirtColor, offset); + offset += 4; + buffer.writeUInt32LE(this._pantsColor, offset); - return buffer; - } + return buffer; + } - override toString() { - return `PlayerPhysicalMessage: msgNo=${this._msgNo} playerId=${this._playerId} bodytype=${this._bodytype} hairColor=${this._hairColor} skinColor=${this._skinColor} shirtColor=${this._shirtColor} pantsColor=${this._pantsColor}`; - } + override toString() { + return `PlayerPhysicalMessage: msgNo=${this._msgNo} playerId=${this._playerId} bodytype=${this._bodytype} hairColor=${this._hairColor} skinColor=${this._skinColor} shirtColor=${this._shirtColor} pantsColor=${this._pantsColor}`; + } } diff --git a/packages/transactions/src/PlayerRacingHistoryMessage.ts b/packages/transactions/src/PlayerRacingHistoryMessage.ts index e77be6537..64bf3f9b4 100644 --- a/packages/transactions/src/PlayerRacingHistoryMessage.ts +++ b/packages/transactions/src/PlayerRacingHistoryMessage.ts @@ -1,153 +1,153 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; export class PlayerRacingHistoryMessage extends SerializedBuffer { - _msgId: number; // 2 bytes - _userId: number; // 4 bytes - _numRaces: number; // 2 bytes - _expectMore: boolean; // 1 byte - _raceHistoryRecords: RacingHistoryRecordEntry[]; // 32 bytes each - - constructor() { - super(); - this._msgId = 0; - this._userId = 0; - this._numRaces = 0; - this._expectMore = false; - this._raceHistoryRecords = []; - // total: 39 bytes + 32 bytes * numRaces - } - - override size(): number { - return 39 + this._numRaces * 32; - } - - addRecord(record: RacingHistoryRecordEntry) { - this._raceHistoryRecords.push(record); - this._numRaces++; - } - - deserialize(buffer: Buffer): PlayerRacingHistoryMessage { - let offset = 0; - this._msgId = buffer.readInt16LE(offset); - offset += 2; - this._userId = buffer.readInt32LE(offset); - offset += 4; - this._numRaces = buffer.readInt16LE(offset); - offset += 2; - this._expectMore = buffer.readInt8(offset) === 1; - offset += 1; - for (let i = 0; i < this._numRaces; i++) { - const record = new RacingHistoryRecordEntry(); - record.deserialize(buffer.subarray(offset, offset + 32)); - offset += 32; - this._raceHistoryRecords.push(record); - } - - return this; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt16LE(this._msgId, offset); - offset += 2; - buffer.writeInt32LE(this._userId, offset); - offset += 4; - buffer.writeInt16LE(this._numRaces, offset); - offset += 2; - buffer.writeInt8(this._expectMore ? 1 : 0, offset); - offset += 1; - for (let i = 0; i < this._numRaces; i++) { - this._raceHistoryRecords[i].serialize().copy(buffer, offset); - offset += 32; - } - - return buffer; - } - - asString(): string { - let result = `PlayerRacingHistoryMessage: MsgId: ${this._msgId}, UserId: ${this._userId}, NumRaces: ${this._numRaces}, ExpectMore: ${this._expectMore}`; - for (let i = 0; i < this._numRaces; i++) { - result += `\n${this._raceHistoryRecords[i].asString()}`; - } - - return result; - } + _msgId: number; // 2 bytes + _userId: number; // 4 bytes + _numRaces: number; // 2 bytes + _expectMore: boolean; // 1 byte + _raceHistoryRecords: RacingHistoryRecordEntry[]; // 32 bytes each + + constructor() { + super(); + this._msgId = 0; + this._userId = 0; + this._numRaces = 0; + this._expectMore = false; + this._raceHistoryRecords = []; + // total: 39 bytes + 32 bytes * numRaces + } + + override size(): number { + return 39 + this._numRaces * 32; + } + + addRecord(record: RacingHistoryRecordEntry) { + this._raceHistoryRecords.push(record); + this._numRaces++; + } + + deserialize(buffer: Buffer): PlayerRacingHistoryMessage { + let offset = 0; + this._msgId = buffer.readInt16LE(offset); + offset += 2; + this._userId = buffer.readInt32LE(offset); + offset += 4; + this._numRaces = buffer.readInt16LE(offset); + offset += 2; + this._expectMore = buffer.readInt8(offset) === 1; + offset += 1; + for (let i = 0; i < this._numRaces; i++) { + const record = new RacingHistoryRecordEntry(); + record.deserialize(buffer.subarray(offset, offset + 32)); + offset += 32; + this._raceHistoryRecords.push(record); + } + + return this; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt16LE(this._msgId, offset); + offset += 2; + buffer.writeInt32LE(this._userId, offset); + offset += 4; + buffer.writeInt16LE(this._numRaces, offset); + offset += 2; + buffer.writeInt8(this._expectMore ? 1 : 0, offset); + offset += 1; + for (let i = 0; i < this._numRaces; i++) { + this._raceHistoryRecords[i].serialize().copy(buffer, offset); + offset += 32; + } + + return buffer; + } + + asString(): string { + let result = `PlayerRacingHistoryMessage: MsgId: ${this._msgId}, UserId: ${this._userId}, NumRaces: ${this._numRaces}, ExpectMore: ${this._expectMore}`; + for (let i = 0; i < this._numRaces; i++) { + result += `\n${this._raceHistoryRecords[i].asString()}`; + } + + return result; + } } export class RacingHistoryRecordEntry extends SerializedBuffer { - raceType: number; // 4 bytes - numberOfRacesEntered: number; // 4 bytes - numberOfRacesFinished: number; // 4 bytes - numberOfRacesWon: number; // 4 bytes - numberOfCarsWon: number; // 4 bytes - numberOfCarsLost: number; // 4 bytes - numberOfChampionshipsWon: number; // 4 bytes - cashWon: number; // 4 bytes - - constructor() { - super(); - this.raceType = 0; - this.numberOfRacesEntered = 0; - this.numberOfRacesFinished = 0; - this.numberOfRacesWon = 0; - this.numberOfCarsWon = 0; - this.numberOfCarsLost = 0; - this.numberOfChampionshipsWon = 0; - this.cashWon = 0; - // total: 32 bytes - } - - override size(): number { - return 32; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt32LE(this.raceType, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesEntered, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesFinished, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesWon, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfCarsWon, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfCarsLost, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfChampionshipsWon, offset); - offset += 4; - buffer.writeInt32LE(this.cashWon, offset); - // total: 8 * 4 = 32 bytes - - return buffer; - } - - deserialize(buffer: Buffer): RacingHistoryRecordEntry { - let offset = 0; - this.raceType = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesEntered = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesFinished = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesWon = buffer.readInt32LE(offset); - offset += 4; - this.numberOfCarsWon = buffer.readInt32LE(offset); - offset += 4; - this.numberOfCarsLost = buffer.readInt32LE(offset); - offset += 4; - this.numberOfChampionshipsWon = buffer.readInt32LE(offset); - offset += 4; - this.cashWon = buffer.readInt32LE(offset); - // total: 8 * 4 = 32 bytes - - return this; - } - - asString(): string { - return `RacingHistoryRecord: RaceType: ${this.raceType}, NumberOfRacesEntered: ${this.numberOfRacesEntered}, NumberOfRacesFinished: ${this.numberOfRacesFinished}, NumberOfRacesWon: ${this.numberOfRacesWon}, NumberOfCarsWon: ${this.numberOfCarsWon}, NumberOfCarsLost: ${this.numberOfCarsLost}, NumberOfChampionshipsWon: ${this.numberOfChampionshipsWon}, CashWon: ${this.cashWon}`; - } + raceType: number; // 4 bytes + numberOfRacesEntered: number; // 4 bytes + numberOfRacesFinished: number; // 4 bytes + numberOfRacesWon: number; // 4 bytes + numberOfCarsWon: number; // 4 bytes + numberOfCarsLost: number; // 4 bytes + numberOfChampionshipsWon: number; // 4 bytes + cashWon: number; // 4 bytes + + constructor() { + super(); + this.raceType = 0; + this.numberOfRacesEntered = 0; + this.numberOfRacesFinished = 0; + this.numberOfRacesWon = 0; + this.numberOfCarsWon = 0; + this.numberOfCarsLost = 0; + this.numberOfChampionshipsWon = 0; + this.cashWon = 0; + // total: 32 bytes + } + + override size(): number { + return 32; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt32LE(this.raceType, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesEntered, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesFinished, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesWon, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfCarsWon, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfCarsLost, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfChampionshipsWon, offset); + offset += 4; + buffer.writeInt32LE(this.cashWon, offset); + // total: 8 * 4 = 32 bytes + + return buffer; + } + + deserialize(buffer: Buffer): RacingHistoryRecordEntry { + let offset = 0; + this.raceType = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesEntered = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesFinished = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesWon = buffer.readInt32LE(offset); + offset += 4; + this.numberOfCarsWon = buffer.readInt32LE(offset); + offset += 4; + this.numberOfCarsLost = buffer.readInt32LE(offset); + offset += 4; + this.numberOfChampionshipsWon = buffer.readInt32LE(offset); + offset += 4; + this.cashWon = buffer.readInt32LE(offset); + // total: 8 * 4 = 32 bytes + + return this; + } + + asString(): string { + return `RacingHistoryRecord: RaceType: ${this.raceType}, NumberOfRacesEntered: ${this.numberOfRacesEntered}, NumberOfRacesFinished: ${this.numberOfRacesFinished}, NumberOfRacesWon: ${this.numberOfRacesWon}, NumberOfCarsWon: ${this.numberOfCarsWon}, NumberOfCarsLost: ${this.numberOfCarsLost}, NumberOfChampionshipsWon: ${this.numberOfChampionshipsWon}, CashWon: ${this.cashWon}`; + } } diff --git a/packages/transactions/src/StockCar.ts b/packages/transactions/src/StockCar.ts index 57a74cfb9..6ed46f22c 100644 --- a/packages/transactions/src/StockCar.ts +++ b/packages/transactions/src/StockCar.ts @@ -12,45 +12,45 @@ */ export class StockCar { - brandedPartId: number; - retailPrice: number; - bIsDealOfTheDay: boolean; - /** - * @param {number} brandedPartId - * @param {number} retailPrice - * @param {boolean} bIsDealOfTheDay - */ - constructor( - brandedPartId: number, - retailPrice: number, - bIsDealOfTheDay: boolean, - ) { - this.brandedPartId = brandedPartId; // 4 bytes - this.retailPrice = retailPrice; // 4 bytes - this.bIsDealOfTheDay = bIsDealOfTheDay; // 2 bytes - } + brandedPartId: number; + retailPrice: number; + bIsDealOfTheDay: boolean; + /** + * @param {number} brandedPartId + * @param {number} retailPrice + * @param {boolean} bIsDealOfTheDay + */ + constructor( + brandedPartId: number, + retailPrice: number, + bIsDealOfTheDay: boolean, + ) { + this.brandedPartId = brandedPartId; // 4 bytes + this.retailPrice = retailPrice; // 4 bytes + this.bIsDealOfTheDay = bIsDealOfTheDay; // 2 bytes + } - /** - * - * @return {Buffer} - */ - serialize(): Buffer { - const packet = Buffer.alloc(10); - packet.writeInt32LE(this.brandedPartId, 0); - packet.writeInt32LE(this.retailPrice, 4); - packet.writeInt16LE(this.bIsDealOfTheDay ? 1 : 0, 8); - return packet; - } + /** + * + * @return {Buffer} + */ + serialize(): Buffer { + const packet = Buffer.alloc(10); + packet.writeInt32LE(this.brandedPartId, 0); + packet.writeInt32LE(this.retailPrice, 4); + packet.writeInt16LE(this.bIsDealOfTheDay ? 1 : 0, 8); + return packet; + } - /** - * @return {string} - */ - toString(): string { - return ` + /** + * @return {string} + */ + toString(): string { + return ` [StockCar]====================================== brandedPartId: ${this.brandedPartId} retailPrice: ${this.retailPrice} isDealOfTheDay: ${this.bIsDealOfTheDay} [/StockCar]======================================`; - } + } } diff --git a/packages/transactions/src/StockCarInfoMessage.ts b/packages/transactions/src/StockCarInfoMessage.ts index 93f9bd807..e51c39dcc 100644 --- a/packages/transactions/src/StockCarInfoMessage.ts +++ b/packages/transactions/src/StockCarInfoMessage.ts @@ -25,80 +25,80 @@ import { MessageNode } from "../../shared/MessageNode.js"; type StockCar = import("./StockCar.js").StockCar; export class StockCarInfoMessage extends MessageNode { - starterCash: number; - dealerId: number; - brand: number; - noCars: number; - moreToCome: boolean; - StockCarList: StockCar[]; - /** - * Creates an instance of StockCarInfoMsg. - * @class - * @param {number} starterCash - * @param {number} dealerId - * @param {number} brand - * @memberof StockCarInfoMsg - */ - constructor(starterCash: number, dealerId: number, brand: number) { - super(); - this.msgNo = 141; - this.starterCash = starterCash; - this.dealerId = dealerId; - this.brand = brand; - /** Number of cars */ - this.noCars = 0; - this.moreToCome = false; - /** @type {StockCar[]} */ - this.StockCarList = []; - } + starterCash: number; + dealerId: number; + brand: number; + noCars: number; + moreToCome: boolean; + StockCarList: StockCar[]; + /** + * Creates an instance of StockCarInfoMsg. + * @class + * @param {number} starterCash + * @param {number} dealerId + * @param {number} brand + * @memberof StockCarInfoMsg + */ + constructor(starterCash: number, dealerId: number, brand: number) { + super(); + this.msgNo = 141; + this.starterCash = starterCash; + this.dealerId = dealerId; + this.brand = brand; + /** Number of cars */ + this.noCars = 0; + this.moreToCome = false; + /** @type {StockCar[]} */ + this.StockCarList = []; + } - /** - * - * @param {StockCar} car - */ - addStockCar(car: StockCar) { - this.StockCarList.push(car); - this.noCars = this.StockCarList.length; - } + /** + * + * @param {StockCar} car + */ + addStockCar(car: StockCar) { + this.StockCarList.push(car); + this.noCars = this.StockCarList.length; + } - /** - * @override - * @return {Buffer} - */ - override serialize(): Buffer { - // This does not count the StockCar array - const packet = Buffer.alloc((17 + 9) * this.StockCarList.length); - packet.writeInt16LE(this.msgNo, 0); - packet.writeInt32LE(this.starterCash, 2); - packet.writeInt32LE(this.dealerId, 6); - packet.writeInt32LE(this.brand, 10); - packet.writeInt16LE(this.noCars, 14); - packet.writeInt8(this.moreToCome ? 1 : 0, 16); - if (this.StockCarList.length > 0) { - for (let i = 0; i < this.StockCarList.length; i++) { - const offset = 10 * i; - const record = this.StockCarList[i]; - if (typeof record !== "undefined") { - record.serialize().copy(packet, 17 + offset); - } - } - } + /** + * @override + * @return {Buffer} + */ + override serialize(): Buffer { + // This does not count the StockCar array + const packet = Buffer.alloc((17 + 9) * this.StockCarList.length); + packet.writeInt16LE(this.msgNo, 0); + packet.writeInt32LE(this.starterCash, 2); + packet.writeInt32LE(this.dealerId, 6); + packet.writeInt32LE(this.brand, 10); + packet.writeInt16LE(this.noCars, 14); + packet.writeInt8(this.moreToCome ? 1 : 0, 16); + if (this.StockCarList.length > 0) { + for (let i = 0; i < this.StockCarList.length; i++) { + const offset = 10 * i; + const record = this.StockCarList[i]; + if (typeof record !== "undefined") { + record.serialize().copy(packet, 17 + offset); + } + } + } - return packet; - } + return packet; + } - /** - * @override - */ - override toString() { - return `${JSON.stringify({ - msgNo: this.msgNo, - starterCash: this.starterCash, - dealerId: this.dealerId, - brand: this.brand, - noCars: this.noCars, - moreToCome: this.moreToCome, - stockCarList: this.StockCarList.toString(), - })}`; - } + /** + * @override + */ + override toString() { + return `${JSON.stringify({ + msgNo: this.msgNo, + starterCash: this.starterCash, + dealerId: this.dealerId, + brand: this.brand, + noCars: this.noCars, + moreToCome: this.moreToCome, + stockCarList: this.StockCarList.toString(), + })}`; + } } diff --git a/packages/transactions/src/TClientConnectMessage.ts b/packages/transactions/src/TClientConnectMessage.ts index c5fbcfb48..725eb56b0 100644 --- a/packages/transactions/src/TClientConnectMessage.ts +++ b/packages/transactions/src/TClientConnectMessage.ts @@ -17,81 +17,81 @@ import { OldServerMessage } from "../../shared/messageFactory.js"; export class TClientConnectMessage extends OldServerMessage { - _customerId: number; - _personaId: number; - _customerName: string; - _personaName: string; - _mcVersion: string; - constructor() { - super(); - this._msgNo = 0; // 8 bytes - this._customerId = 0; // 4 bytes - this._personaId = 0; // 4 bytes - this._customerName = ""; // 13 bytes - this._personaName = ""; // 13 bytes - this._mcVersion = ""; // 4 bytes - } + _customerId: number; + _personaId: number; + _customerName: string; + _personaName: string; + _mcVersion: string; + constructor() { + super(); + this._msgNo = 0; // 8 bytes + this._customerId = 0; // 4 bytes + this._personaId = 0; // 4 bytes + this._customerName = ""; // 13 bytes + this._personaName = ""; // 13 bytes + this._mcVersion = ""; // 4 bytes + } - override size() { - return 51; - } + override size() { + return 51; + } - /** - * @param {Buffer} buffer - */ - deserialize(buffer: Buffer) { - let offset = 0; - this._header._doDeserialize(buffer); - offset += this._header._size; - this._msgNo = buffer.readUInt16LE(offset); - offset += 2; - this._customerId = buffer.readUInt32LE(offset); - offset += 4; - this._personaId = buffer.readUInt32LE(offset); - offset += 4; - this._customerName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._personaName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._mcVersion = buffer.toString("utf8", offset, offset + 4); - // 51 bytes - } + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer) { + let offset = 0; + this._header._doDeserialize(buffer); + offset += this._header._size; + this._msgNo = buffer.readUInt16LE(offset); + offset += 2; + this._customerId = buffer.readUInt32LE(offset); + offset += 4; + this._personaId = buffer.readUInt32LE(offset); + offset += 4; + this._customerName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._personaName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._mcVersion = buffer.toString("utf8", offset, offset + 4); + // 51 bytes + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.copy(this._header._doSerialize(), offset); - offset += this._header._size; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._customerId, offset); - offset += 4; - buffer.writeUInt32LE(this._personaId, offset); - offset += 4; - buffer.write(this._customerName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._personaName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._mcVersion, offset, 4, "utf8"); - // 51 bytes - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.copy(this._header._doSerialize(), offset); + offset += this._header._size; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._customerId, offset); + offset += 4; + buffer.writeUInt32LE(this._personaId, offset); + offset += 4; + buffer.write(this._customerName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._personaName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._mcVersion, offset, 4, "utf8"); + // 51 bytes + return buffer; + } - /** - * @override - */ - override toString() { - return `TClientConnectMessage: ${JSON.stringify({ - length: this._header.length, - mcoSig: this._header.mcoSig, - seq: this._header.sequence, - flags: this._header.flags, - msgNo: this._msgNo, - customerId: this._customerId, - personaId: this._personaId, - customerName: this._customerName, - personaName: this._personaName, - mcVersion: this._mcVersion, - })}`; - } + /** + * @override + */ + override toString() { + return `TClientConnectMessage: ${JSON.stringify({ + length: this._header.length, + mcoSig: this._header.mcoSig, + seq: this._header.sequence, + flags: this._header.flags, + msgNo: this._msgNo, + customerId: this._customerId, + personaId: this._personaId, + customerName: this._customerName, + personaName: this._personaName, + mcVersion: this._mcVersion, + })}`; + } } diff --git a/packages/transactions/src/TLoginMessage.ts b/packages/transactions/src/TLoginMessage.ts index d9ab9fc15..a183ab3a1 100644 --- a/packages/transactions/src/TLoginMessage.ts +++ b/packages/transactions/src/TLoginMessage.ts @@ -15,132 +15,132 @@ // along with this program. If not, see . import { - SerializedBuffer, - OldServerMessage, + OldServerMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; export class ListEntry extends SerializedBuffer { - constructor() { - super(); - } + constructor() { + super(); + } } export class LoginCompleteMessage extends SerializedBuffer { - _msgNo: number; - _serverTime: number; - _firstTime: boolean; - _paycheckWaiting: boolean; - _clubInvitesWaiting: boolean; - tallyInProgress: boolean; - _secondsUntilShutdown: number; - _shardGNP: number; - _shardCarsSold: number; - _shardAverageSalaries: number; - _shardAverageCarsOwned: number; - _shardAverageLevel: number; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._serverTime = 0; // 4 bytes - this._firstTime = false; // 1 byte - this._paycheckWaiting = false; // 1 byte - this._clubInvitesWaiting = false; // 1 byte - this.tallyInProgress = false; // 1 byte - this._secondsUntilShutdown = 0; // 2 bytes + _msgNo: number; + _serverTime: number; + _firstTime: boolean; + _paycheckWaiting: boolean; + _clubInvitesWaiting: boolean; + tallyInProgress: boolean; + _secondsUntilShutdown: number; + _shardGNP: number; + _shardCarsSold: number; + _shardAverageSalaries: number; + _shardAverageCarsOwned: number; + _shardAverageLevel: number; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._serverTime = 0; // 4 bytes + this._firstTime = false; // 1 byte + this._paycheckWaiting = false; // 1 byte + this._clubInvitesWaiting = false; // 1 byte + this.tallyInProgress = false; // 1 byte + this._secondsUntilShutdown = 0; // 2 bytes - this._shardGNP = 0; // 4 bytes - this._shardCarsSold = 0; // 4 bytes - this._shardAverageSalaries = 0; // 4 bytes - this._shardAverageCarsOwned = 0; // 4 bytes - this._shardAverageLevel = 0; // 4 bytes - } + this._shardGNP = 0; // 4 bytes + this._shardCarsSold = 0; // 4 bytes + this._shardAverageSalaries = 0; // 4 bytes + this._shardAverageCarsOwned = 0; // 4 bytes + this._shardAverageLevel = 0; // 4 bytes + } } export class TLoginMessage extends OldServerMessage { - _size: number; - _customerId: number; - _personaId: number; - _lotOwnerId: number; - _brandedPartId: number; - _skinId: number; - _personaName: string; - _mcVersion: string; - constructor() { - super(); - this._size = 40; - this._msgNo = 0; // 2 bytes - this._customerId = 0; // 4 bytes - this._personaId = 0; // 4 bytes - this._lotOwnerId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - this._skinId = 0; // 4 bytes - this._personaName = ""; // 13 bytes - this._mcVersion = ""; // 4 bytes - } + _size: number; + _customerId: number; + _personaId: number; + _lotOwnerId: number; + _brandedPartId: number; + _skinId: number; + _personaName: string; + _mcVersion: string; + constructor() { + super(); + this._size = 40; + this._msgNo = 0; // 2 bytes + this._customerId = 0; // 4 bytes + this._personaId = 0; // 4 bytes + this._lotOwnerId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + this._skinId = 0; // 4 bytes + this._personaName = ""; // 13 bytes + this._mcVersion = ""; // 4 bytes + } - /** - * @param {Buffer} buffer - */ - deserialize(buffer: Buffer) { - let offset = 0; - this._header._doDeserialize(buffer); - offset += this._header._size; - this._msgNo = buffer.readUInt16LE(offset); - offset += 2; - this._customerId = buffer.readUInt32LE(offset); - offset += 4; - this._personaId = buffer.readUInt32LE(offset); - offset += 4; - this._lotOwnerId = buffer.readUInt32LE(offset); - offset += 4; - this._brandedPartId = buffer.readUInt32LE(offset); - offset += 4; - this._skinId = buffer.readUInt32LE(offset); - offset += 4; - this._personaName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._mcVersion = buffer.toString("utf8", offset, offset + 4); - // 40 bytes - } + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer) { + let offset = 0; + this._header._doDeserialize(buffer); + offset += this._header._size; + this._msgNo = buffer.readUInt16LE(offset); + offset += 2; + this._customerId = buffer.readUInt32LE(offset); + offset += 4; + this._personaId = buffer.readUInt32LE(offset); + offset += 4; + this._lotOwnerId = buffer.readUInt32LE(offset); + offset += 4; + this._brandedPartId = buffer.readUInt32LE(offset); + offset += 4; + this._skinId = buffer.readUInt32LE(offset); + offset += 4; + this._personaName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._mcVersion = buffer.toString("utf8", offset, offset + 4); + // 40 bytes + } - override serialize() { - const buffer = Buffer.alloc(this._size); - let offset = 0; - buffer.copy(this._header._doSerialize(), offset); - offset += this._header._size; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._customerId, offset); - offset += 4; - buffer.writeUInt32LE(this._personaId, offset); - offset += 4; - buffer.writeUInt32LE(this._lotOwnerId, offset); - offset += 4; - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; - buffer.writeUInt32LE(this._skinId, offset); - offset += 4; - buffer.write(this._personaName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._mcVersion, offset, 4, "utf8"); - // 40 bytes - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this._size); + let offset = 0; + buffer.copy(this._header._doSerialize(), offset); + offset += this._header._size; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._customerId, offset); + offset += 4; + buffer.writeUInt32LE(this._personaId, offset); + offset += 4; + buffer.writeUInt32LE(this._lotOwnerId, offset); + offset += 4; + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; + buffer.writeUInt32LE(this._skinId, offset); + offset += 4; + buffer.write(this._personaName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._mcVersion, offset, 4, "utf8"); + // 40 bytes + return buffer; + } - asJSON() { - return { - msgNo: this._msgNo, - customerId: this._customerId, - personaId: this._personaId, - lotOwnerId: this._lotOwnerId, - brandedPartId: this._brandedPartId, - skinId: this._skinId, - personaName: this._personaName, - mcVersion: this._mcVersion, - }; - } + asJSON() { + return { + msgNo: this._msgNo, + customerId: this._customerId, + personaId: this._personaId, + lotOwnerId: this._lotOwnerId, + brandedPartId: this._brandedPartId, + skinId: this._skinId, + personaName: this._personaName, + mcVersion: this._mcVersion, + }; + } - override toString() { - return `TLoginMessage: msgNo=${this._msgNo} customerId=${this._customerId} personaId=${this._personaId} lotOwnerId=${this._lotOwnerId} brandedPartId=${this._brandedPartId} skinId=${this._skinId} personaName=${this._personaName} mcVersion=${this._mcVersion}`; - } + override toString() { + return `TLoginMessage: msgNo=${this._msgNo} customerId=${this._customerId} personaId=${this._personaId} lotOwnerId=${this._lotOwnerId} brandedPartId=${this._brandedPartId} skinId=${this._skinId} personaName=${this._personaName} mcVersion=${this._mcVersion}`; + } } diff --git a/packages/transactions/src/TunablesMessage.ts b/packages/transactions/src/TunablesMessage.ts index e276e467d..cecf6ef22 100644 --- a/packages/transactions/src/TunablesMessage.ts +++ b/packages/transactions/src/TunablesMessage.ts @@ -21,132 +21,132 @@ import { SerializedBuffer } from "../../shared/messageFactory.js"; * This is the body of a MessageNode */ export class TunablesMessage extends SerializedBuffer { - _msgNo: number; - _clubCreationCost: number; - _clubCreationRequiredLevel: number; - _clubOfficerRequiredLevel: number; - _inventorySizePerLevel: number; - _carsPerLevel: number; - _maxEZStreetLevel: number; - _clubSwitchCooldown: number; - _universalRepairCostModifier: number; - _universalScrapValueModifier: number; - _addCost1Day: number; - _addCost2Days: number; - _addCost3Days: number; - _addCost4Days: number; - _addCost5Days: number; - _addCost6Days: number; - _addCost7Days: number; - _tradeinModifier: number; - _simStreetMaxWager: number; - saleryPerLevel: number; - _clubMaxMembers: number; - _clubRegistrationCost: number; - _clubReRegistrationCost: number; - _classifiedAdRate: number; - _classifiedAdMaxDuration: number; - _classifiedAdMaxSize: number; - _classifiedAdMaxCountPerPlayer: number; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._clubCreationCost = 150; // 4 bytes - this._clubCreationRequiredLevel = 1; // 4 bytes - this._clubOfficerRequiredLevel = 1; // 4 bytes - this._inventorySizePerLevel = 20; // 4 bytes - this._carsPerLevel = 3; // 4 bytes - this._maxEZStreetLevel = 5; // 4 bytes - this._clubSwitchCooldown = 1; // 4 bytes - this._universalRepairCostModifier = 3.6; // 8 bytes - this._universalScrapValueModifier = 3.6; // 8 bytes - this._addCost1Day = 1; // 4 bytes - this._addCost2Days = 2; // 4 bytes - this._addCost3Days = 3; // 4 bytes - this._addCost4Days = 4; // 4 bytes - this._addCost5Days = 5; // 4 bytes - this._addCost6Days = 6; // 4 bytes - this._addCost7Days = 7; // 4 bytes - this._tradeinModifier = 3.6; // 8 bytes - this._simStreetMaxWager = 20; // 4 bytes - this.saleryPerLevel = 6; // 4 bytes - this._clubMaxMembers = 4; // 4 bytes - this._clubRegistrationCost = 2; // 4 bytes - this._clubReRegistrationCost = 3; // 4 bytes - this._classifiedAdRate = 10; // 4 bytes - this._classifiedAdMaxDuration = 4; // 4 bytes - this._classifiedAdMaxSize = 17; // 4 bytes - this._classifiedAdMaxCountPerPlayer = 2; // 4 bytes - // total: 118 bytes - } + _msgNo: number; + _clubCreationCost: number; + _clubCreationRequiredLevel: number; + _clubOfficerRequiredLevel: number; + _inventorySizePerLevel: number; + _carsPerLevel: number; + _maxEZStreetLevel: number; + _clubSwitchCooldown: number; + _universalRepairCostModifier: number; + _universalScrapValueModifier: number; + _addCost1Day: number; + _addCost2Days: number; + _addCost3Days: number; + _addCost4Days: number; + _addCost5Days: number; + _addCost6Days: number; + _addCost7Days: number; + _tradeinModifier: number; + _simStreetMaxWager: number; + saleryPerLevel: number; + _clubMaxMembers: number; + _clubRegistrationCost: number; + _clubReRegistrationCost: number; + _classifiedAdRate: number; + _classifiedAdMaxDuration: number; + _classifiedAdMaxSize: number; + _classifiedAdMaxCountPerPlayer: number; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._clubCreationCost = 150; // 4 bytes + this._clubCreationRequiredLevel = 1; // 4 bytes + this._clubOfficerRequiredLevel = 1; // 4 bytes + this._inventorySizePerLevel = 20; // 4 bytes + this._carsPerLevel = 3; // 4 bytes + this._maxEZStreetLevel = 5; // 4 bytes + this._clubSwitchCooldown = 1; // 4 bytes + this._universalRepairCostModifier = 3.6; // 8 bytes + this._universalScrapValueModifier = 3.6; // 8 bytes + this._addCost1Day = 1; // 4 bytes + this._addCost2Days = 2; // 4 bytes + this._addCost3Days = 3; // 4 bytes + this._addCost4Days = 4; // 4 bytes + this._addCost5Days = 5; // 4 bytes + this._addCost6Days = 6; // 4 bytes + this._addCost7Days = 7; // 4 bytes + this._tradeinModifier = 3.6; // 8 bytes + this._simStreetMaxWager = 20; // 4 bytes + this.saleryPerLevel = 6; // 4 bytes + this._clubMaxMembers = 4; // 4 bytes + this._clubRegistrationCost = 2; // 4 bytes + this._clubReRegistrationCost = 3; // 4 bytes + this._classifiedAdRate = 10; // 4 bytes + this._classifiedAdMaxDuration = 4; // 4 bytes + this._classifiedAdMaxSize = 17; // 4 bytes + this._classifiedAdMaxCountPerPlayer = 2; // 4 bytes + // total: 118 bytes + } - override size() { - return 118; // This needs to 124 bytes, but the last 6 bytes are unknown - } + override size() { + return 118; // This needs to 124 bytes, but the last 6 bytes are unknown + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._clubCreationCost, offset); - offset += 4; // offset is 6 - buffer.writeUInt32LE(this._clubCreationRequiredLevel, offset); - offset += 4; // offset is 10 - buffer.writeUInt32LE(this._clubOfficerRequiredLevel, offset); - offset += 4; // offset is 14 - buffer.writeUInt32LE(this._inventorySizePerLevel, offset); - offset += 4; // offset is 18 - buffer.writeUInt32LE(this._carsPerLevel, offset); - offset += 4; // offset is 22 - buffer.writeUInt32LE(this._maxEZStreetLevel, offset); - offset += 4; // offset is 26 - buffer.writeUInt32LE(this._clubSwitchCooldown, offset); - offset += 4; // offset is 30 - buffer.writeDoubleLE(this._universalRepairCostModifier, offset); - offset += 8; // offset is 38 - buffer.writeDoubleLE(this._universalScrapValueModifier, offset); - offset += 8; // offset is 46 - buffer.writeUInt32LE(this._addCost1Day, offset); - offset += 4; // offset is 50 - buffer.writeUInt32LE(this._addCost2Days, offset); - offset += 4; // offset is 54 - buffer.writeUInt32LE(this._addCost3Days, offset); - offset += 4; // offset is 58 - buffer.writeUInt32LE(this._addCost4Days, offset); - offset += 4; // offset is 62 - buffer.writeUInt32LE(this._addCost5Days, offset); - offset += 4; // offset is 66 - buffer.writeUInt32LE(this._addCost6Days, offset); - offset += 4; // offset is 70 - buffer.writeUInt32LE(this._addCost7Days, offset); - offset += 4; // offset is 74 - buffer.writeDoubleLE(this._tradeinModifier, offset); - offset += 8; // offset is 82 - buffer.writeUInt32LE(this._simStreetMaxWager, offset); - offset += 4; // offset is 86 - buffer.writeUInt32LE(this.saleryPerLevel, offset); - offset += 4; // offset is 90 - buffer.writeUInt32LE(this._clubMaxMembers, offset); - offset += 4; // offset is 94 - buffer.writeUInt32LE(this._clubRegistrationCost, offset); - offset += 4; // offset is 98 - buffer.writeUInt32LE(this._clubReRegistrationCost, offset); - offset += 4; // offset is 102 - buffer.writeUInt32LE(this._classifiedAdRate, offset); - offset += 4; // offset is 106 - buffer.writeUInt32LE(this._classifiedAdMaxDuration, offset); - offset += 4; // offset is 110 - buffer.writeUInt32LE(this._classifiedAdMaxSize, offset); - offset += 4; // offset is 114 - buffer.writeUInt32LE(this._classifiedAdMaxCountPerPlayer, offset); - // offset is 118 + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._clubCreationCost, offset); + offset += 4; // offset is 6 + buffer.writeUInt32LE(this._clubCreationRequiredLevel, offset); + offset += 4; // offset is 10 + buffer.writeUInt32LE(this._clubOfficerRequiredLevel, offset); + offset += 4; // offset is 14 + buffer.writeUInt32LE(this._inventorySizePerLevel, offset); + offset += 4; // offset is 18 + buffer.writeUInt32LE(this._carsPerLevel, offset); + offset += 4; // offset is 22 + buffer.writeUInt32LE(this._maxEZStreetLevel, offset); + offset += 4; // offset is 26 + buffer.writeUInt32LE(this._clubSwitchCooldown, offset); + offset += 4; // offset is 30 + buffer.writeDoubleLE(this._universalRepairCostModifier, offset); + offset += 8; // offset is 38 + buffer.writeDoubleLE(this._universalScrapValueModifier, offset); + offset += 8; // offset is 46 + buffer.writeUInt32LE(this._addCost1Day, offset); + offset += 4; // offset is 50 + buffer.writeUInt32LE(this._addCost2Days, offset); + offset += 4; // offset is 54 + buffer.writeUInt32LE(this._addCost3Days, offset); + offset += 4; // offset is 58 + buffer.writeUInt32LE(this._addCost4Days, offset); + offset += 4; // offset is 62 + buffer.writeUInt32LE(this._addCost5Days, offset); + offset += 4; // offset is 66 + buffer.writeUInt32LE(this._addCost6Days, offset); + offset += 4; // offset is 70 + buffer.writeUInt32LE(this._addCost7Days, offset); + offset += 4; // offset is 74 + buffer.writeDoubleLE(this._tradeinModifier, offset); + offset += 8; // offset is 82 + buffer.writeUInt32LE(this._simStreetMaxWager, offset); + offset += 4; // offset is 86 + buffer.writeUInt32LE(this.saleryPerLevel, offset); + offset += 4; // offset is 90 + buffer.writeUInt32LE(this._clubMaxMembers, offset); + offset += 4; // offset is 94 + buffer.writeUInt32LE(this._clubRegistrationCost, offset); + offset += 4; // offset is 98 + buffer.writeUInt32LE(this._clubReRegistrationCost, offset); + offset += 4; // offset is 102 + buffer.writeUInt32LE(this._classifiedAdRate, offset); + offset += 4; // offset is 106 + buffer.writeUInt32LE(this._classifiedAdMaxDuration, offset); + offset += 4; // offset is 110 + buffer.writeUInt32LE(this._classifiedAdMaxSize, offset); + offset += 4; // offset is 114 + buffer.writeUInt32LE(this._classifiedAdMaxCountPerPlayer, offset); + // offset is 118 - return buffer; - } + return buffer; + } - override toString() { - return ` + override toString() { + return ` TunablesMessage: msgNo=${this._msgNo} @@ -177,5 +177,5 @@ export class TunablesMessage extends SerializedBuffer { classifiedAdMaxSize=${this._classifiedAdMaxSize} classifiedAdMaxCountPerPlayer=${this._classifiedAdMaxCountPerPlayer} `; - } + } } diff --git a/packages/transactions/src/_getArcadeCarInfo.ts b/packages/transactions/src/_getArcadeCarInfo.ts index 7b0359b18..63b5a7d04 100644 --- a/packages/transactions/src/_getArcadeCarInfo.ts +++ b/packages/transactions/src/_getArcadeCarInfo.ts @@ -1,6 +1,6 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { ArcadeCarInfo, ArcadeCarMessage } from "./ArcadeCarMessage.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -8,28 +8,28 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getArcadeCarInfo({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getArcadeCarInfoMessage = new GenericRequestMessage(); - getArcadeCarInfoMessage.deserialize(packet.data); + const getArcadeCarInfoMessage = new GenericRequestMessage(); + getArcadeCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getArcadeCarInfoMessage.toString()}`); + log.debug(`Received Message: ${getArcadeCarInfoMessage.toString()}`); - const arcadeCarInfoMessage = new ArcadeCarMessage(); - arcadeCarInfoMessage._msgNo = 323; + const arcadeCarInfoMessage = new ArcadeCarMessage(); + arcadeCarInfoMessage._msgNo = 323; - const car1 = new ArcadeCarInfo(); - car1._brandedPartId = 113; // Bel-air - car1._lobbyId = 0; - arcadeCarInfoMessage.addCar(car1); + const car1 = new ArcadeCarInfo(); + car1._brandedPartId = 113; // Bel-air + car1._lobbyId = 0; + arcadeCarInfoMessage.addCar(car1); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(arcadeCarInfoMessage.serialize()); + responsePacket.setBuffer(arcadeCarInfoMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getGameUrls.ts b/packages/transactions/src/_getGameUrls.ts index 323676684..71c1a49aa 100644 --- a/packages/transactions/src/_getGameUrls.ts +++ b/packages/transactions/src/_getGameUrls.ts @@ -1,6 +1,6 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { GameUrl, GameUrlsMessage } from "./GameUrlsMessage.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -8,28 +8,28 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getGameUrls({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getGameUrlsMessage = new GenericRequestMessage(); - getGameUrlsMessage.deserialize(packet.data); + const getGameUrlsMessage = new GenericRequestMessage(); + getGameUrlsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getGameUrlsMessage.toString()}`); + log.debug(`Received Message: ${getGameUrlsMessage.toString()}`); - const gameUrlsMessage = new GameUrlsMessage(); - gameUrlsMessage._msgNo = 364; + const gameUrlsMessage = new GameUrlsMessage(); + gameUrlsMessage._msgNo = 364; - const url1 = new GameUrl(); - url1._urlId = 1; - url1.urlRef = "http://localhost:8080"; - gameUrlsMessage.addURL(url1); + const url1 = new GameUrl(); + url1._urlId = 1; + url1.urlRef = "http://localhost:8080"; + gameUrlsMessage.addURL(url1); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(gameUrlsMessage.serialize()); + responsePacket.setBuffer(gameUrlsMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getOwnedParts.ts b/packages/transactions/src/_getOwnedParts.ts index be06aee88..0fba03ddc 100644 --- a/packages/transactions/src/_getOwnedParts.ts +++ b/packages/transactions/src/_getOwnedParts.ts @@ -1,39 +1,39 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; -import { PartsAssemblyMessage } from "./PartsAssemblyMessage.js"; import { - fetchStateFromDatabase, - findSessionByConnectionId, + fetchStateFromDatabase, + findSessionByConnectionId, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; +import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; +import { PartsAssemblyMessage } from "./PartsAssemblyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getOwnedParts({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getOwnedPartsMessage = new GenericRequestMessage(); - getOwnedPartsMessage.deserialize(packet.data); + const getOwnedPartsMessage = new GenericRequestMessage(); + getOwnedPartsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getOwnedPartsMessage.toString()}`); + log.debug(`Received Message: ${getOwnedPartsMessage.toString()}`); - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const session = findSessionByConnectionId(state, connectionId); + const session = findSessionByConnectionId(state, connectionId); - if (!session) { - throw new ServerError("Session not found"); - } + if (!session) { + throw new ServerError("Session not found"); + } - const ownedPartsMessage = new PartsAssemblyMessage(session.gameId); - ownedPartsMessage._msgNo = 175; + const ownedPartsMessage = new PartsAssemblyMessage(session.gameId); + ownedPartsMessage._msgNo = 175; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(ownedPartsMessage.serialize()); + responsePacket.setBuffer(ownedPartsMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getOwnedVehicles.ts b/packages/transactions/src/_getOwnedVehicles.ts index 0b3edc3dc..3b4b67a0e 100644 --- a/packages/transactions/src/_getOwnedVehicles.ts +++ b/packages/transactions/src/_getOwnedVehicles.ts @@ -1,48 +1,48 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OwnedVehicle, OwnedVehiclesMessage } from "./OwnedVehiclesMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; const vehicleList = [ - { - personId: 1, - vehicleId: 1, - brandedPartId: 113, - }, + { + personId: 1, + vehicleId: 1, + brandedPartId: 113, + }, ]; export function getVehiclesForPerson(personId: number) { - return vehicleList.filter((vehicle) => vehicle.personId === personId); + return vehicleList.filter((vehicle) => vehicle.personId === personId); } export async function _getOwnedVehicles( - args: MessageHandlerArgs, + args: MessageHandlerArgs, ): Promise { - const getOwnedVehiclesMessage = new GenericRequestMessage(); - getOwnedVehiclesMessage.deserialize(args.packet.data); + const getOwnedVehiclesMessage = new GenericRequestMessage(); + getOwnedVehiclesMessage.deserialize(args.packet.data); - args.log.debug(`Received Message: ${getOwnedVehiclesMessage.toString()}`); + args.log.debug(`Received Message: ${getOwnedVehiclesMessage.toString()}`); - const personId = getOwnedVehiclesMessage.data.readUInt32LE(0); + const personId = getOwnedVehiclesMessage.data.readUInt32LE(0); - const ownedVehiclesMessage = new OwnedVehiclesMessage(); + const ownedVehiclesMessage = new OwnedVehiclesMessage(); - const vehicles = getVehiclesForPerson(personId); + const vehicles = getVehiclesForPerson(personId); - for (const vehicle of vehicles) { - const ownedVehicle = new OwnedVehicle(); - ownedVehicle._vehicleId = vehicle.vehicleId; - ownedVehicle._brandedPartId = vehicle.brandedPartId; - ownedVehiclesMessage.addVehicle(ownedVehicle); - } + for (const vehicle of vehicles) { + const ownedVehicle = new OwnedVehicle(); + ownedVehicle._vehicleId = vehicle.vehicleId; + ownedVehicle._brandedPartId = vehicle.brandedPartId; + ownedVehiclesMessage.addVehicle(ownedVehicle); + } - ownedVehiclesMessage._msgNo = 173; + ownedVehiclesMessage._msgNo = 173; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = args.packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = args.packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(ownedVehiclesMessage.serialize()); + responsePacket.setBuffer(ownedVehiclesMessage.serialize()); - return { connectionId: args.connectionId, messages: [responsePacket] }; + return { connectionId: args.connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getPlayerInfo.ts b/packages/transactions/src/_getPlayerInfo.ts index b23cc46d6..39eadcb0d 100644 --- a/packages/transactions/src/_getPlayerInfo.ts +++ b/packages/transactions/src/_getPlayerInfo.ts @@ -1,33 +1,33 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerInfoMessage } from "./PlayerInfoMessage.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getPlayerInfo( - args: MessageHandlerArgs, + args: MessageHandlerArgs, ): Promise { - const getPlayerInfoMessage = new GenericRequestMessage(); - getPlayerInfoMessage.deserialize(args.packet.data); + const getPlayerInfoMessage = new GenericRequestMessage(); + getPlayerInfoMessage.deserialize(args.packet.data); - args.log.debug(`Received Message: ${getPlayerInfoMessage.toString()}`); + args.log.debug(`Received Message: ${getPlayerInfoMessage.toString()}`); - const playerId = getPlayerInfoMessage.data.readUInt32LE(0); - try { - const playerInfoMessage = new PlayerInfoMessage(); - playerInfoMessage._msgNo = 108; - playerInfoMessage._playerId = playerId; - playerInfoMessage._playerName = "Drazi Crendraven"; - playerInfoMessage._currentLevel = 1; + const playerId = getPlayerInfoMessage.data.readUInt32LE(0); + try { + const playerInfoMessage = new PlayerInfoMessage(); + playerInfoMessage._msgNo = 108; + playerInfoMessage._playerId = playerId; + playerInfoMessage._playerName = "Drazi Crendraven"; + playerInfoMessage._currentLevel = 1; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = args.packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = args.packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(playerInfoMessage.serialize()); + responsePacket.setBuffer(playerInfoMessage.serialize()); - return { connectionId: args.connectionId, messages: [responsePacket] }; - } catch (error) { - throw ServerError.fromUnknown(error, "Error in _getPlayerInfo"); - } + return { connectionId: args.connectionId, messages: [responsePacket] }; + } catch (error) { + throw ServerError.fromUnknown(error, "Error in _getPlayerInfo"); + } } diff --git a/packages/transactions/src/_getPlayerPhysical.ts b/packages/transactions/src/_getPlayerPhysical.ts index a90454b75..ea29ef719 100644 --- a/packages/transactions/src/_getPlayerPhysical.ts +++ b/packages/transactions/src/_getPlayerPhysical.ts @@ -1,29 +1,29 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerPhysicalMessage } from "./PlayerPhysicalMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getPlayerPhysical({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getPlayerPhysicalMessage = new GenericRequestMessage(); - getPlayerPhysicalMessage.deserialize(packet.data); + const getPlayerPhysicalMessage = new GenericRequestMessage(); + getPlayerPhysicalMessage.deserialize(packet.data); - log.debug(`Received Message: ${getPlayerPhysicalMessage.toString()}`); + log.debug(`Received Message: ${getPlayerPhysicalMessage.toString()}`); - const playerId = getPlayerPhysicalMessage.data.readUInt32LE(0); + const playerId = getPlayerPhysicalMessage.data.readUInt32LE(0); - const playerPhysicalMessage = new PlayerPhysicalMessage(); - playerPhysicalMessage._msgNo = 265; - playerPhysicalMessage._playerId = playerId; + const playerPhysicalMessage = new PlayerPhysicalMessage(); + playerPhysicalMessage._msgNo = 265; + playerPhysicalMessage._playerId = playerId; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(playerPhysicalMessage.serialize()); + responsePacket.setBuffer(playerPhysicalMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getPlayerRaceHistory.ts b/packages/transactions/src/_getPlayerRaceHistory.ts index 265d73e14..0a9c71905 100644 --- a/packages/transactions/src/_getPlayerRaceHistory.ts +++ b/packages/transactions/src/_getPlayerRaceHistory.ts @@ -1,85 +1,85 @@ import { ServerMessage } from "../../shared/src/ServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { - PlayerRacingHistoryMessage, - RacingHistoryRecordEntry, + PlayerRacingHistoryMessage, + RacingHistoryRecordEntry, } from "./PlayerRacingHistoryMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export enum RaceType { - RACES_TESTDRIVE = 14, - RACES_SIM_STREET = 16, - RACES_SIM_PRO = 17, - RACES_SIM_DRAG = 18, - RACES_SIM_TIMETRIAL = 19, + RACES_TESTDRIVE = 14, + RACES_SIM_STREET = 16, + RACES_SIM_PRO = 17, + RACES_SIM_DRAG = 18, + RACES_SIM_TIMETRIAL = 19, - RACES_ARC_STUNT = 23, - RACES_ARC_TIMETRIAL = 25, - RACES_TRADEWINDOW = 26, + RACES_ARC_STUNT = 23, + RACES_ARC_TIMETRIAL = 25, + RACES_TRADEWINDOW = 26, } export type RacingHistoryRecord = { - raceType: RaceType; // 4 bytes - numberOfRacesEntered: number; // 4 bytes - numberOfRacesFinished: number; // 4 bytes - numberOfRacesWon: number; // 4 bytes - numberOfCarsWon: number; // 4 bytes - numberOfCarsLost: number; // 4 bytes - numberOfChampionshipsWon: number; // 4 bytes - cashWon: number; // 4 bytes + raceType: RaceType; // 4 bytes + numberOfRacesEntered: number; // 4 bytes + numberOfRacesFinished: number; // 4 bytes + numberOfRacesWon: number; // 4 bytes + numberOfCarsWon: number; // 4 bytes + numberOfCarsLost: number; // 4 bytes + numberOfChampionshipsWon: number; // 4 bytes + cashWon: number; // 4 bytes }; const racingHistoryRecords: RacingHistoryRecord[] = [ - { - raceType: RaceType.RACES_TESTDRIVE, - numberOfRacesEntered: 0, - numberOfRacesFinished: 0, - numberOfRacesWon: 0, - numberOfCarsWon: 0, - numberOfCarsLost: 0, - numberOfChampionshipsWon: 0, - cashWon: 0, - }, + { + raceType: RaceType.RACES_TESTDRIVE, + numberOfRacesEntered: 0, + numberOfRacesFinished: 0, + numberOfRacesWon: 0, + numberOfCarsWon: 0, + numberOfCarsLost: 0, + numberOfChampionshipsWon: 0, + cashWon: 0, + }, ]; export async function _getPlayerRaceHistory({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getPlayerRaceHistoryMessage = new GenericRequestMessage(); - getPlayerRaceHistoryMessage.deserialize(packet.data); + const getPlayerRaceHistoryMessage = new GenericRequestMessage(); + getPlayerRaceHistoryMessage.deserialize(packet.data); - log.debug(`Received Message: ${getPlayerRaceHistoryMessage.toString()}`); + log.debug(`Received Message: ${getPlayerRaceHistoryMessage.toString()}`); - const playerId = getPlayerRaceHistoryMessage.data.readInt32LE(0); + const playerId = getPlayerRaceHistoryMessage.data.readInt32LE(0); - log.debug(`Player ID: ${playerId}`); + log.debug(`Player ID: ${playerId}`); - const playerRacingHistoryMessage = new PlayerRacingHistoryMessage(); - playerRacingHistoryMessage._msgId = 362; - playerRacingHistoryMessage._userId = playerId; + const playerRacingHistoryMessage = new PlayerRacingHistoryMessage(); + playerRacingHistoryMessage._msgId = 362; + playerRacingHistoryMessage._userId = playerId; - for (const record of racingHistoryRecords) { - const recordEntry = new RacingHistoryRecordEntry(); - recordEntry.raceType = record.raceType; - recordEntry.numberOfRacesEntered = record.numberOfRacesEntered; - recordEntry.numberOfRacesFinished = record.numberOfRacesFinished; - recordEntry.numberOfRacesWon = record.numberOfRacesWon; - recordEntry.numberOfCarsWon = record.numberOfCarsWon; - recordEntry.numberOfCarsLost = record.numberOfCarsLost; - recordEntry.numberOfChampionshipsWon = record.numberOfChampionshipsWon; - recordEntry.cashWon = record.cashWon; + for (const record of racingHistoryRecords) { + const recordEntry = new RacingHistoryRecordEntry(); + recordEntry.raceType = record.raceType; + recordEntry.numberOfRacesEntered = record.numberOfRacesEntered; + recordEntry.numberOfRacesFinished = record.numberOfRacesFinished; + recordEntry.numberOfRacesWon = record.numberOfRacesWon; + recordEntry.numberOfCarsWon = record.numberOfCarsWon; + recordEntry.numberOfCarsLost = record.numberOfCarsLost; + recordEntry.numberOfChampionshipsWon = record.numberOfChampionshipsWon; + recordEntry.cashWon = record.cashWon; - playerRacingHistoryMessage.addRecord(recordEntry); - } + playerRacingHistoryMessage.addRecord(recordEntry); + } - const responsePacket = new ServerMessage( - packet._header.sequence, - 8, - playerRacingHistoryMessage.serialize(), - ); + const responsePacket = new ServerMessage( + packet._header.sequence, + 8, + playerRacingHistoryMessage.serialize(), + ); - log.debug(`Sending Message: ${playerRacingHistoryMessage.toString()}`); + log.debug(`Sending Message: ${playerRacingHistoryMessage.toString()}`); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getStockCarInfo.ts b/packages/transactions/src/_getStockCarInfo.ts index af0e89cdb..59c862afc 100644 --- a/packages/transactions/src/_getStockCarInfo.ts +++ b/packages/transactions/src/_getStockCarInfo.ts @@ -1,7 +1,7 @@ +import { OldServerMessage } from "../../shared/messageFactory.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; -import { StockCarInfoMessage } from "./StockCarInfoMessage.js"; import { StockCar } from "./StockCar.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { StockCarInfoMessage } from "./StockCarInfoMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -9,31 +9,31 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getStockCarInfo({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getStockCarInfoMessage = new GenericRequestMessage(); - getStockCarInfoMessage.deserialize(packet.data); + const getStockCarInfoMessage = new GenericRequestMessage(); + getStockCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getStockCarInfoMessage.toString()}`); + log.debug(`Received Message: ${getStockCarInfoMessage.toString()}`); - const stockCarInfoMessage = new StockCarInfoMessage(200, 0, 105); - stockCarInfoMessage.starterCash = 200; - stockCarInfoMessage.dealerId = 8; - stockCarInfoMessage.brand = 105; + const stockCarInfoMessage = new StockCarInfoMessage(200, 0, 105); + stockCarInfoMessage.starterCash = 200; + stockCarInfoMessage.dealerId = 8; + stockCarInfoMessage.brand = 105; - stockCarInfoMessage.addStockCar(new StockCar(113, 20, false)); // Bel-air - stockCarInfoMessage.addStockCar(new StockCar(104, 15, true)); // Fairlane - Deal of the day - stockCarInfoMessage.addStockCar(new StockCar(402, 20, false)); // Century + stockCarInfoMessage.addStockCar(new StockCar(113, 20, false)); // Bel-air + stockCarInfoMessage.addStockCar(new StockCar(104, 15, true)); // Fairlane - Deal of the day + stockCarInfoMessage.addStockCar(new StockCar(402, 20, false)); // Century - log.debug(`Sending Message: ${stockCarInfoMessage.toString()}`); + log.debug(`Sending Message: ${stockCarInfoMessage.toString()}`); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(stockCarInfoMessage.serialize()); + responsePacket.setBuffer(stockCarInfoMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getTunables.ts b/packages/transactions/src/_getTunables.ts index b6973b739..e4ba434ae 100644 --- a/packages/transactions/src/_getTunables.ts +++ b/packages/transactions/src/_getTunables.ts @@ -1,5 +1,5 @@ -import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { TunablesMessage } from "./TunablesMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -8,23 +8,23 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getTunables({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getTunablesMessage = new GenericRequestMessage(); - getTunablesMessage.deserialize(packet.data); + const getTunablesMessage = new GenericRequestMessage(); + getTunablesMessage.deserialize(packet.data); - log.debug(`Received Message: ${getTunablesMessage.toString()}`); + log.debug(`Received Message: ${getTunablesMessage.toString()}`); - const tunablesMessage = new TunablesMessage(); - tunablesMessage._msgNo = 390; + const tunablesMessage = new TunablesMessage(); + tunablesMessage._msgNo = 390; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(tunablesMessage.serialize()); + responsePacket.setBuffer(tunablesMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_logout.ts b/packages/transactions/src/_logout.ts index 5a9694a39..e452b369f 100644 --- a/packages/transactions/src/_logout.ts +++ b/packages/transactions/src/_logout.ts @@ -1,5 +1,5 @@ -import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -7,20 +7,20 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _logout({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 101; - pReply.msgReply = 106; - const rPacket = new OldServerMessage(); - rPacket._header.sequence = packet._header.sequence + 1; - rPacket._header.flags = 8; - rPacket.setBuffer(pReply.serialize()); + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 101; + pReply.msgReply = 106; + const rPacket = new OldServerMessage(); + rPacket._header.sequence = packet._header.sequence + 1; + rPacket._header.flags = 8; + rPacket.setBuffer(pReply.serialize()); - log.debug(`Logout: ${rPacket.toString()}`); + log.debug(`Logout: ${rPacket.toString()}`); - return { connectionId, messages: [rPacket] }; + return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/clientConnect.ts b/packages/transactions/src/clientConnect.ts index 5d9a6a3da..3437e7008 100644 --- a/packages/transactions/src/clientConnect.ts +++ b/packages/transactions/src/clientConnect.ts @@ -1,19 +1,19 @@ -import { GenericReply } from "./GenericReplyMessage.js"; -import { TClientConnectMessage } from "./TClientConnectMessage.js"; import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { - McosEncryption, - McosSession, - addEncryption, - addSession, - fetchStateFromDatabase, - getEncryption, -} from "../../shared/State.js"; -import { - createCommandEncryptionPair, - createDataEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, } from "../../gateway/src/encryption.js"; +import { + McosEncryption, + McosSession, + addEncryption, + addSession, + fetchStateFromDatabase, + getEncryption, +} from "../../shared/State.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericReply } from "./GenericReplyMessage.js"; +import { TClientConnectMessage } from "./TClientConnectMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -21,81 +21,81 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function clientConnect({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - /** - * Let's turn it into a ClientConnectMsg - */ - const newMessage = new TClientConnectMessage(); + /** + * Let's turn it into a ClientConnectMsg + */ + const newMessage = new TClientConnectMessage(); - newMessage.deserialize(packet.serialize()); + newMessage.deserialize(packet.serialize()); - log.debug(`ClientConnectMsg: ${newMessage.toString()}`); + log.debug(`ClientConnectMsg: ${newMessage.toString()}`); - const customerId = newMessage._customerId; - if (typeof customerId !== "number") { - throw new TypeError( - `customerId is wrong type. Expected 'number', got ${typeof customerId}`, - ); - } + const customerId = newMessage._customerId; + if (typeof customerId !== "number") { + throw new TypeError( + `customerId is wrong type. Expected 'number', got ${typeof customerId}`, + ); + } - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const existingEncryption = getEncryption(state, connectionId); + const existingEncryption = getEncryption(state, connectionId); - if (existingEncryption) { - log.debug("Encryption already exists for this connection"); - return { connectionId, messages: [] }; - } + if (existingEncryption) { + log.debug("Encryption already exists for this connection"); + return { connectionId, messages: [] }; + } - let result; + let result; - log.debug(`Looking up the session key for ${customerId}...`); + log.debug(`Looking up the session key for ${customerId}...`); - result = await getDatabaseServer({ - log, - }).fetchSessionKeyByCustomerId(customerId); - log.debug(`Session key found for ${customerId}`); + result = await getDatabaseServer({ + log, + }).fetchSessionKeyByCustomerId(customerId); + log.debug(`Session key found for ${customerId}`); - const newCommandEncryptionPair = createCommandEncryptionPair( - result.sessionKey, - ); + const newCommandEncryptionPair = createCommandEncryptionPair( + result.sessionKey, + ); - const newDataEncryptionPair = createDataEncryptionPair(result.sessionKey); + const newDataEncryptionPair = createDataEncryptionPair(result.sessionKey); - const newEncryption = new McosEncryption({ - connectionId, - commandEncryptionPair: newCommandEncryptionPair, - dataEncryptionPair: newDataEncryptionPair, - }); + const newEncryption = new McosEncryption({ + connectionId, + commandEncryptionPair: newCommandEncryptionPair, + dataEncryptionPair: newDataEncryptionPair, + }); - const updatedState = addEncryption(state, newEncryption); + const updatedState = addEncryption(state, newEncryption); - const session = new McosSession({ - connectionId, - gameId: newMessage._personaId, - }); + const session = new McosSession({ + connectionId, + gameId: newMessage._personaId, + }); - addSession(updatedState, session).save(); + addSession(updatedState, session).save(); - const personaId = newMessage._personaId; + const personaId = newMessage._personaId; - const personaName = newMessage._personaName; + const personaName = newMessage._personaName; - log.debug(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); + log.debug(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); - // Create new response packet - const pReply = new GenericReply(); - pReply.msgNo = 101; - pReply.msgReply = newMessage._msgNo; + // Create new response packet + const pReply = new GenericReply(); + pReply.msgNo = 101; + pReply.msgReply = newMessage._msgNo; - const responsePacket = new OldServerMessage(); - responsePacket.setBuffer(pReply.serialize()); - responsePacket._header.sequence = packet._header.sequence; + const responsePacket = new OldServerMessage(); + responsePacket.setBuffer(pReply.serialize()); + responsePacket._header.sequence = packet._header.sequence; - log.debug(`Response: ${responsePacket.serialize().toString("hex")}`); + log.debug(`Response: ${responsePacket.serialize().toString("hex")}`); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/getLobbies.ts b/packages/transactions/src/getLobbies.ts index a629071d5..cc95b0b4d 100644 --- a/packages/transactions/src/getLobbies.ts +++ b/packages/transactions/src/getLobbies.ts @@ -1,7 +1,7 @@ -import { LobbyInfo, LobbyMessage } from "./LobbyMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; -import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; import { EntryFeePurseMessage, PurseEntry } from "./EntryFeePurseMessage.js"; +import { LobbyInfo, LobbyMessage } from "./LobbyMessage.js"; +import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** * @param {MessageHandlerArgs} args @@ -9,82 +9,82 @@ import { EntryFeePurseMessage, PurseEntry } from "./EntryFeePurseMessage.js"; */ async function _getLobbies({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - log.debug("In _getLobbies..."); + log.debug("In _getLobbies..."); - log.debug(`Received Message: ${packet.toString()}`); + log.debug(`Received Message: ${packet.toString()}`); - // Create new response packet - const lobbiesResponsePacket = new OldServerMessage(); - lobbiesResponsePacket._header.sequence = packet._header.sequence; - lobbiesResponsePacket._header.flags = 8; + // Create new response packet + const lobbiesResponsePacket = new OldServerMessage(); + lobbiesResponsePacket._header.sequence = packet._header.sequence; + lobbiesResponsePacket._header.flags = 8; - const lobbyResponse = new LobbyMessage(); - lobbyResponse._msgNo = 325; - lobbyResponse._shouldExpectMoreMessages = false; + const lobbyResponse = new LobbyMessage(); + lobbyResponse._msgNo = 325; + lobbyResponse._shouldExpectMoreMessages = false; - const lobby = new LobbyInfo(); - lobby._lobbyId = 1; - lobby._lobbyName = "Lobby 1"; - lobby._topDog = "Drazi Crendraven"; + const lobby = new LobbyInfo(); + lobby._lobbyId = 1; + lobby._lobbyName = "Lobby 1"; + lobby._topDog = "Drazi Crendraven"; - log.debug(`Logging LobbyInfo: ${lobby.serialize().toString("hex")}`); + log.debug(`Logging LobbyInfo: ${lobby.serialize().toString("hex")}`); - lobbyResponse.addLobby(lobby); + lobbyResponse.addLobby(lobby); - log.debug( - `Logging LobbyMessage: ${lobbyResponse.serialize().toString("hex")}`, - ); + log.debug( + `Logging LobbyMessage: ${lobbyResponse.serialize().toString("hex")}`, + ); - lobbiesResponsePacket.setBuffer(lobbyResponse.serialize()); + lobbiesResponsePacket.setBuffer(lobbyResponse.serialize()); - // Handle purse entries - const purseEntry = new PurseEntry(); - purseEntry._entryFee = 100; - purseEntry._purse = 1000; + // Handle purse entries + const purseEntry = new PurseEntry(); + purseEntry._entryFee = 100; + purseEntry._purse = 1000; - const perseEntryResponse = new EntryFeePurseMessage(); - perseEntryResponse._msgNo = 408; - perseEntryResponse._shouldExpectMoreMessages = false; - perseEntryResponse.addEntry(purseEntry); + const perseEntryResponse = new EntryFeePurseMessage(); + perseEntryResponse._msgNo = 408; + perseEntryResponse._shouldExpectMoreMessages = false; + perseEntryResponse.addEntry(purseEntry); - log.debug( - `Logging EntryFeePurseMessage: ${perseEntryResponse - .serialize() - .toString("hex")}`, - ); + log.debug( + `Logging EntryFeePurseMessage: ${perseEntryResponse + .serialize() + .toString("hex")}`, + ); - const perseEntriesResponsePacket = new OldServerMessage(); - perseEntriesResponsePacket._header.sequence = packet._header.sequence; - perseEntriesResponsePacket._header.flags = 8; + const perseEntriesResponsePacket = new OldServerMessage(); + perseEntriesResponsePacket._header.sequence = packet._header.sequence; + perseEntriesResponsePacket._header.flags = 8; - perseEntriesResponsePacket.setBuffer(perseEntryResponse.serialize()); + perseEntriesResponsePacket.setBuffer(perseEntryResponse.serialize()); - return { - connectionId, - messages: [lobbiesResponsePacket, perseEntriesResponsePacket], - }; + return { + connectionId, + messages: [lobbiesResponsePacket, perseEntriesResponsePacket], + }; } /** * @param {MessageHandlerArgs} args * @return {Promise} */ export async function getLobbies({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const result = await _getLobbies({ connectionId, packet, log }); - log.debug("Dumping Lobbies response packet..."); - result.messages.forEach((msg) => { - log.debug(msg.toString()); - }); - log.debug(result.messages.join().toString()); - return { - connectionId, - messages: result.messages, - }; + const result = await _getLobbies({ connectionId, packet, log }); + log.debug("Dumping Lobbies response packet..."); + result.messages.forEach((msg) => { + log.debug(msg.toString()); + }); + log.debug(result.messages.join().toString()); + return { + connectionId, + messages: result.messages, + }; } diff --git a/packages/transactions/src/handlers.ts b/packages/transactions/src/handlers.ts index dff14f1aa..3fda4234a 100644 --- a/packages/transactions/src/handlers.ts +++ b/packages/transactions/src/handlers.ts @@ -15,93 +15,93 @@ // along with this program. If not, see . import { OldServerMessage } from "../../shared/messageFactory.js"; -import { login } from "./login.js"; -import { trackingPing } from "./trackingPing.js"; -import { clientConnect } from "./clientConnect.js"; -import { getLobbies } from "./getLobbies.js"; +import { ServerMessage } from "../../shared/src/ServerMessage.js"; +import { _getArcadeCarInfo } from "./_getArcadeCarInfo.js"; +import { _getGameUrls } from "./_getGameUrls.js"; +import { _getOwnedParts } from "./_getOwnedParts.js"; import { _getOwnedVehicles } from "./_getOwnedVehicles.js"; import { _getPlayerInfo } from "./_getPlayerInfo.js"; import { _getPlayerPhysical } from "./_getPlayerPhysical.js"; -import { _getOwnedParts } from "./_getOwnedParts.js"; import { _getPlayerRaceHistory } from "./_getPlayerRaceHistory.js"; -import { _getTunables } from "./_getTunables.js"; -import { _getGameUrls } from "./_getGameUrls.js"; -import { _getArcadeCarInfo } from "./_getArcadeCarInfo.js"; import { _getStockCarInfo } from "./_getStockCarInfo.js"; +import { _getTunables } from "./_getTunables.js"; import { _logout } from "./_logout.js"; -import { ServerMessage } from "../../shared/src/ServerMessage.js"; +import { clientConnect } from "./clientConnect.js"; +import { getLobbies } from "./getLobbies.js"; +import { login } from "./login.js"; +import { trackingPing } from "./trackingPing.js"; export interface MessageHandlerArgs { - connectionId: string; - packet: OldServerMessage; - log: import("pino").Logger; + connectionId: string; + packet: OldServerMessage; + log: import("pino").Logger; } export interface MessageHandlerResult { - connectionId: string; - messages: OldServerMessage[] | ServerMessage[]; + connectionId: string; + messages: OldServerMessage[] | ServerMessage[]; } export interface MessageHandler { - name: string; - handler: (args: MessageHandlerArgs) => Promise; + name: string; + handler: (args: MessageHandlerArgs) => Promise; } export const messageHandlers: MessageHandler[] = [ - { - name: "MC_TRACKING_MSG", - handler: trackingPing, - }, - { - name: "MC_CLIENT_CONNECT_MSG", - handler: clientConnect, - }, - { - name: "MC_LOGIN", - handler: login, - }, - { - name: "MC_LOGOUT", - handler: _logout, - }, - { - name: "MC_GET_LOBBIES", - handler: getLobbies, - }, - { - name: "MC_STOCK_CAR_INFO", - handler: _getStockCarInfo, - }, - { - name: "MC_GET_ARCADE_CARS", - handler: _getArcadeCarInfo, - }, - { - name: "MC_GET_GAME_URLS", - handler: _getGameUrls, - }, - { - name: "MC_GET_MCO_TUNABLES", - handler: _getTunables, - }, - { - name: "MC_GET_OWNED_VEHICLES", - handler: _getOwnedVehicles, - }, - { - name: "MC_GET_PLAYER_INFO", - handler: _getPlayerInfo, - }, - { - name: "MC_GET_PLAYER_PHYSICAL", - handler: _getPlayerPhysical, - }, - { - name: "MC_GET_OWNED_PARTS", - handler: _getOwnedParts, - }, - { - name: "MC_GET_PLAYER_RACING_HISTORY", - handler: _getPlayerRaceHistory, - }, + { + name: "MC_TRACKING_MSG", + handler: trackingPing, + }, + { + name: "MC_CLIENT_CONNECT_MSG", + handler: clientConnect, + }, + { + name: "MC_LOGIN", + handler: login, + }, + { + name: "MC_LOGOUT", + handler: _logout, + }, + { + name: "MC_GET_LOBBIES", + handler: getLobbies, + }, + { + name: "MC_STOCK_CAR_INFO", + handler: _getStockCarInfo, + }, + { + name: "MC_GET_ARCADE_CARS", + handler: _getArcadeCarInfo, + }, + { + name: "MC_GET_GAME_URLS", + handler: _getGameUrls, + }, + { + name: "MC_GET_MCO_TUNABLES", + handler: _getTunables, + }, + { + name: "MC_GET_OWNED_VEHICLES", + handler: _getOwnedVehicles, + }, + { + name: "MC_GET_PLAYER_INFO", + handler: _getPlayerInfo, + }, + { + name: "MC_GET_PLAYER_PHYSICAL", + handler: _getPlayerPhysical, + }, + { + name: "MC_GET_OWNED_PARTS", + handler: _getOwnedParts, + }, + { + name: "MC_GET_PLAYER_RACING_HISTORY", + handler: _getPlayerRaceHistory, + }, ]; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index 3a9837868..e67e0d874 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -14,21 +14,21 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerError } from "../../shared/errors/ServerError.js"; -import { messageHandlers } from "./handlers.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerConfiguration } from "../../shared/Configuration.js"; import { - fetchStateFromDatabase, - getEncryption, - updateEncryption, + fetchStateFromDatabase, + getEncryption, + updateEncryption, } from "../../shared/State.js"; +import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerLogger } from "../../shared/log.js"; // eslint-disable-next-line no-unused-vars import { - SerializedBuffer, - OldServerMessage, + OldServerMessage, + SerializedBuffer, } from "../../shared/messageFactory.js"; -import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerMessage } from "../../shared/src/ServerMessage.js"; +import { messageHandlers } from "./handlers.js"; /** * @@ -37,9 +37,9 @@ import { ServerMessage } from "../../shared/src/ServerMessage.js"; * @return {boolean} */ function isMessageEncrypted( - message: OldServerMessage | ServerMessage, + message: OldServerMessage | ServerMessage, ): boolean { - return message._header.flags - 8 >= 0; + return message._header.flags - 8 >= 0; } /** @@ -49,38 +49,38 @@ function isMessageEncrypted( * @return {string} */ function _MSG_STRING(messageID: number): string { - const messageIds = [ - { id: 105, name: "MC_LOGIN" }, // 0x69 - { id: 106, name: "MC_LOGOUT" }, // 0x6a - { id: 108, name: "MC_GET_PLAYER_INFO" }, // 0x6c - { id: 109, name: "MC_SET_OPTIONS" }, // 0x6d - { id: 122, name: "MC_PLAYER_INFO" }, // 0x7a"} - { id: 141, name: "MC_STOCK_CAR_INFO" }, // 0x8d - { id: 172, name: "MC_GET_OWNED_VEHICLES" }, // 0xac"} - { id: 173, name: "MC_OWNED_VEHICLES_LIST" }, // 0xad"} - { id: 174, name: "MC_GET_OWNED_PARTS" }, // 0xae"} - { id: 213, name: "MC_LOGIN_COMPLETE" }, // 0xd5 - { id: 264, name: "MC_GET_PLAYER_PHYSICAL" }, // 0x108 - { id: 265, name: "MC_PLAYER_PHYSICAL_INFO" }, // 0x109 - { id: 363, name: "MC_GET_GAME_URLS" }, // 0x16b"} - { id: 266, name: "MC_UPDATE_PLAYER_PHYSICAL" }, // 0x10a - { id: 322, name: "MC_GET_ARCADE_CARS" }, // 0x142"} - { id: 324, name: "MC_GET_LOBBIES" }, // 0x144 - { id: 325, name: "MC_LOBBIES" }, // 0x145 - { id: 361, name: "MC_GET_PLAYER_RACING_HISTORY" }, // 0x169"} - { id: 362, name: "MC_PLAYER_RACING_HISTORY" }, // 0x16a"} - { id: 389, name: "MC_GET_MCO_TUNABLES" }, // 0x185"} - { id: 391, name: "MC_CLUB_GET_INVITATIONS" }, // 0x187 - { id: 438, name: "MC_CLIENT_CONNECT_MSG" }, // 0x1b6 - { id: 440, name: "MC_TRACKING_MSG" }, - ]; - const result = messageIds.find((id) => id.id === messageID); - - if (typeof result !== "undefined") { - return result.name; - } - - return "Unknown"; + const messageIds = [ + { id: 105, name: "MC_LOGIN" }, // 0x69 + { id: 106, name: "MC_LOGOUT" }, // 0x6a + { id: 108, name: "MC_GET_PLAYER_INFO" }, // 0x6c + { id: 109, name: "MC_SET_OPTIONS" }, // 0x6d + { id: 122, name: "MC_PLAYER_INFO" }, // 0x7a"} + { id: 141, name: "MC_STOCK_CAR_INFO" }, // 0x8d + { id: 172, name: "MC_GET_OWNED_VEHICLES" }, // 0xac"} + { id: 173, name: "MC_OWNED_VEHICLES_LIST" }, // 0xad"} + { id: 174, name: "MC_GET_OWNED_PARTS" }, // 0xae"} + { id: 213, name: "MC_LOGIN_COMPLETE" }, // 0xd5 + { id: 264, name: "MC_GET_PLAYER_PHYSICAL" }, // 0x108 + { id: 265, name: "MC_PLAYER_PHYSICAL_INFO" }, // 0x109 + { id: 363, name: "MC_GET_GAME_URLS" }, // 0x16b"} + { id: 266, name: "MC_UPDATE_PLAYER_PHYSICAL" }, // 0x10a + { id: 322, name: "MC_GET_ARCADE_CARS" }, // 0x142"} + { id: 324, name: "MC_GET_LOBBIES" }, // 0x144 + { id: 325, name: "MC_LOBBIES" }, // 0x145 + { id: 361, name: "MC_GET_PLAYER_RACING_HISTORY" }, // 0x169"} + { id: 362, name: "MC_PLAYER_RACING_HISTORY" }, // 0x16a"} + { id: 389, name: "MC_GET_MCO_TUNABLES" }, // 0x185"} + { id: 391, name: "MC_CLUB_GET_INVITATIONS" }, // 0x187 + { id: 438, name: "MC_CLIENT_CONNECT_MSG" }, // 0x1b6 + { id: 440, name: "MC_TRACKING_MSG" }, + ]; + const result = messageIds.find((id) => id.id === messageID); + + if (typeof result !== "undefined") { + return result.name; + } + + return "Unknown"; } /** @@ -89,44 +89,42 @@ function _MSG_STRING(messageID: number): string { * @returns {Promise} */ async function processInput({ - connectionId, - packet, - log = getServerLogger({ - module: "transactionServer", - }), + connectionId, + packet, + log = getServerLogger({ + module: "transactionServer", + }), }: import("./handlers.js").MessageHandlerArgs): Promise< - import("./handlers.js").MessageHandlerResult + import("./handlers.js").MessageHandlerResult > { - const currentMessageNo = packet._msgNo; - const currentMessageString = _MSG_STRING(currentMessageNo); - - log.debug( - `We are attempting to process a message with id ${currentMessageNo}(${currentMessageString})`, - ); - - const result = messageHandlers.find( - (msg) => msg.name === currentMessageString, - ); - - if (typeof result !== "undefined") { - try { - const responsePackets = await result.handler({ - connectionId, - packet, - log, - }); - return responsePackets; - } catch (error) { - const err = new ServerError( - `Error handling packet: ${String(error)}`, - ); - throw err; - } - } - - throw new ServerError( - `Message Number Not Handled: ${currentMessageNo} (${currentMessageString}`, - ); + const currentMessageNo = packet._msgNo; + const currentMessageString = _MSG_STRING(currentMessageNo); + + log.debug( + `We are attempting to process a message with id ${currentMessageNo}(${currentMessageString})`, + ); + + const result = messageHandlers.find( + (msg) => msg.name === currentMessageString, + ); + + if (typeof result !== "undefined") { + try { + const responsePackets = await result.handler({ + connectionId, + packet, + log, + }); + return responsePackets; + } catch (error) { + const err = new ServerError(`Error handling packet: ${String(error)}`); + throw err; + } + } + + throw new ServerError( + `Message Number Not Handled: ${currentMessageNo} (${currentMessageString}`, + ); } /** @@ -140,144 +138,131 @@ async function processInput({ * }>} */ export async function receiveTransactionsData({ - connectionId, - message, - log = getServerLogger({ - module: "transactionServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "transactionServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; + + log.debug(`Received Transaction Server packet: ${connectionId}`); - log.debug(`Received Transaction Server packet: ${connectionId}`); + // Going to use ServerMessage in this module - // Going to use ServerMessage in this module + const inboundMessage = new OldServerMessage(); + inboundMessage._doDeserialize(message.data); + log.debug(`Received Transaction Server packet: ${inboundMessage.toString()}`); - const inboundMessage = new OldServerMessage(); - inboundMessage._doDeserialize(message.data); - log.debug( - `Received Transaction Server packet: ${inboundMessage.toString()}`, - ); - - // Is the message encrypted? - if (isMessageEncrypted(inboundMessage)) { - log.debug("Message is encrypted"); - // Get the encryyption settings for this connection - const state = fetchStateFromDatabase(); - - const encryptionSettings = getEncryption(state, connectionId); - - if (typeof encryptionSettings === "undefined") { - throw new ServerError( - `Unable to locate encryption settings for connection ${connectionId}`, - ); - } - - // log the old buffer - log.debug(`Encrypted buffer: ${inboundMessage.data.toString("hex")}`); - - try { - const decryptedMessage = encryptionSettings.dataEncryption.decrypt( - inboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(inboundMessage.data, decryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - log.debug(`Decrypted buffer: ${decryptedMessage.toString("hex")}`); - - inboundMessage.setBuffer(decryptedMessage); - inboundMessage._header.flags -= 8; - inboundMessage.updateMsgNo(); - - log.debug(`Decrypted message: ${inboundMessage.toString()}`); - } catch (error) { - throw new ServerError( - `Unable to decrypt message: ${String(error)}`, - ); - } - } - - log.debug("Calling processInput()"); - const response = await processInput({ - connectionId, - packet: inboundMessage, - log, - }); - - // Loop through the outbound messages and encrypt them - const outboundMessages: SerializedBuffer[] = []; - - response.messages.forEach((outboundMessage) => { - log.debug(`Outbound message: ${outboundMessage.toString()}`); - - if (isMessageEncrypted(outboundMessage)) { - const state = fetchStateFromDatabase(); - - const encryptionSettings = getEncryption(state, connectionId); - - if (typeof encryptionSettings === "undefined") { - throw new ServerError( - `Unable to locate encryption settings for connection ${connectionId}`, - ); - } - - // log the old buffer - log.debug( - `Outbound buffer: ${outboundMessage.data.toString("hex")}`, - ); - - try { - const encryptedMessage = - encryptionSettings.dataEncryption.encrypt( - outboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(outboundMessage.data, encryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - - log.debug( - `Encrypted buffer: ${encryptedMessage.toString("hex")}`, - ); - - outboundMessage.setBuffer(encryptedMessage); - - log.debug(`Encrypted message: ${outboundMessage.toString()}`); - - const outboundRawMessage = new SerializedBuffer(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); - log.debug( - `Encrypted message: ${outboundRawMessage.toString()}`, - ); - outboundMessages.push(outboundRawMessage); - } catch (error) { - throw new ServerError( - `Unable to encrypt message: ${String(error)}`, - ); - } - } else { - const outboundRawMessage = new SerializedBuffer(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); - log.debug(`Outbound message: ${outboundRawMessage.toString()}`); - outboundMessages.push(outboundRawMessage); - } - }); - - return { - connectionId, - messages: outboundMessages, - }; + // Is the message encrypted? + if (isMessageEncrypted(inboundMessage)) { + log.debug("Message is encrypted"); + // Get the encryyption settings for this connection + const state = fetchStateFromDatabase(); + + const encryptionSettings = getEncryption(state, connectionId); + + if (typeof encryptionSettings === "undefined") { + throw new ServerError( + `Unable to locate encryption settings for connection ${connectionId}`, + ); + } + + // log the old buffer + log.debug(`Encrypted buffer: ${inboundMessage.data.toString("hex")}`); + + try { + const decryptedMessage = encryptionSettings.dataEncryption.decrypt( + inboundMessage.data, + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(inboundMessage.data, decryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + log.debug(`Decrypted buffer: ${decryptedMessage.toString("hex")}`); + + inboundMessage.setBuffer(decryptedMessage); + inboundMessage._header.flags -= 8; + inboundMessage.updateMsgNo(); + + log.debug(`Decrypted message: ${inboundMessage.toString()}`); + } catch (error) { + throw new ServerError(`Unable to decrypt message: ${String(error)}`); + } + } + + log.debug("Calling processInput()"); + const response = await processInput({ + connectionId, + packet: inboundMessage, + log, + }); + + // Loop through the outbound messages and encrypt them + const outboundMessages: SerializedBuffer[] = []; + + response.messages.forEach((outboundMessage) => { + log.debug(`Outbound message: ${outboundMessage.toString()}`); + + if (isMessageEncrypted(outboundMessage)) { + const state = fetchStateFromDatabase(); + + const encryptionSettings = getEncryption(state, connectionId); + + if (typeof encryptionSettings === "undefined") { + throw new ServerError( + `Unable to locate encryption settings for connection ${connectionId}`, + ); + } + + // log the old buffer + log.debug(`Outbound buffer: ${outboundMessage.data.toString("hex")}`); + + try { + const encryptedMessage = encryptionSettings.dataEncryption.encrypt( + outboundMessage.data, + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(outboundMessage.data, encryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + + log.debug(`Encrypted buffer: ${encryptedMessage.toString("hex")}`); + + outboundMessage.setBuffer(encryptedMessage); + + log.debug(`Encrypted message: ${outboundMessage.toString()}`); + + const outboundRawMessage = new SerializedBuffer(); + outboundRawMessage.setBuffer(outboundMessage.serialize()); + log.debug(`Encrypted message: ${outboundRawMessage.toString()}`); + outboundMessages.push(outboundRawMessage); + } catch (error) { + throw new ServerError(`Unable to encrypt message: ${String(error)}`); + } + } else { + const outboundRawMessage = new SerializedBuffer(); + outboundRawMessage.setBuffer(outboundMessage.serialize()); + log.debug(`Outbound message: ${outboundRawMessage.toString()}`); + outboundMessages.push(outboundRawMessage); + } + }); + + return { + connectionId, + messages: outboundMessages, + }; } /** @@ -285,9 +270,9 @@ export async function receiveTransactionsData({ * @param {Buffer} buffer2 */ export function verifyLength(buffer: Buffer, buffer2: Buffer) { - if (buffer.length !== buffer2.length) { - throw new ServerError( - `Length mismatch: ${buffer.length} !== ${buffer2.length}`, - ); - } + if (buffer.length !== buffer2.length) { + throw new ServerError( + `Length mismatch: ${buffer.length} !== ${buffer2.length}`, + ); + } } diff --git a/packages/transactions/src/login.ts b/packages/transactions/src/login.ts index 5558578dc..eaaf2f0d3 100644 --- a/packages/transactions/src/login.ts +++ b/packages/transactions/src/login.ts @@ -1,6 +1,6 @@ +import { OldServerMessage } from "../../shared/messageFactory.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { TLoginMessage } from "./TLoginMessage.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -8,25 +8,25 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function login({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Read the inbound packet - const loginMessage = new TLoginMessage(); - loginMessage.deserialize(packet.serialize()); - log.debug(`Received LoginMessage: ${loginMessage.toString()}`); + // Read the inbound packet + const loginMessage = new TLoginMessage(); + loginMessage.deserialize(packet.serialize()); + log.debug(`Received LoginMessage: ${loginMessage.toString()}`); - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 213; - pReply.msgReply = 105; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; - responsePacket.setBuffer(pReply.serialize()); + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 213; + pReply.msgReply = 105; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; + responsePacket.setBuffer(pReply.serialize()); - log.debug(`Response: ${responsePacket.toString()}`); + log.debug(`Response: ${responsePacket.toString()}`); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/trackingPing.ts b/packages/transactions/src/trackingPing.ts index 8aa28c2dc..accf4f30e 100644 --- a/packages/transactions/src/trackingPing.ts +++ b/packages/transactions/src/trackingPing.ts @@ -1,5 +1,5 @@ -import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; +import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; /** @@ -7,21 +7,21 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function trackingPing({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 101; - pReply.msgReply = 440; - const rPacket = new OldServerMessage(); - rPacket._header.sequence = packet._header.sequence; - rPacket._header.flags = 8; + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 101; + pReply.msgReply = 440; + const rPacket = new OldServerMessage(); + rPacket._header.sequence = packet._header.sequence; + rPacket._header.flags = 8; - rPacket.setBuffer(pReply.serialize()); + rPacket.setBuffer(pReply.serialize()); - log.debug(`TrackingPing: ${rPacket.toString()}`); + log.debug(`TrackingPing: ${rPacket.toString()}`); - return { connectionId, messages: [] }; + return { connectionId, messages: [] }; } diff --git a/packages/transactions/test/LobbyMessage.test.ts b/packages/transactions/test/LobbyMessage.test.ts index 3678ac6fb..660f228ee 100644 --- a/packages/transactions/test/LobbyMessage.test.ts +++ b/packages/transactions/test/LobbyMessage.test.ts @@ -1,100 +1,100 @@ -import { LobbyInfo, LobbyMessage } from "../src/LobbyMessage.js"; import { describe, expect, it } from "vitest"; +import { LobbyInfo, LobbyMessage } from "../src/LobbyMessage.js"; describe("LobbyMessage", () => { - describe(".size()", () => { - it("should have a starting value of 5", () => { - // Arrange - const testMessage = new LobbyMessage(); - - // Assert - expect(testMessage.size()).toBe(5); - }); - }); - - describe(".serialize()", () => { - it("should return a buffer of the correct size", () => { - // Arrange - const testMessage = new LobbyMessage(); - - // Act - const result = testMessage.serialize(); - - // Assert - expect(result).toBeInstanceOf(Buffer); - expect(result.length).toBe(5); - }); - }); + describe(".size()", () => { + it("should have a starting value of 5", () => { + // Arrange + const testMessage = new LobbyMessage(); + + // Assert + expect(testMessage.size()).toBe(5); + }); + }); + + describe(".serialize()", () => { + it("should return a buffer of the correct size", () => { + // Arrange + const testMessage = new LobbyMessage(); + + // Act + const result = testMessage.serialize(); + + // Assert + expect(result).toBeInstanceOf(Buffer); + expect(result.length).toBe(5); + }); + }); }); describe("LobbyInfo", () => { - describe(".size()", () => { - it("should have a starting value of 563", () => { - // Arrange - const testMessage = new LobbyInfo(); - - // Assert - expect(testMessage.size()).toBe(563); - }); - }); - - describe(".serialize()", () => { - it("should return a buffer of the correct size", () => { - // Arrange - const testMessage = new LobbyInfo(); - - // Act - const result = testMessage.serialize(); - - // Assert - expect(result).toBeInstanceOf(Buffer); - expect(result.length).toBe(563); - }); - }); - - describe(".deserialize()", () => { - it("should throw an error when passed a buffer of the wrong size", () => { - // Arrange - const testMessage = new LobbyInfo(); - const buffer = Buffer.alloc(1); - - // Act - const testFunction = () => { - testMessage.deserialize(buffer); - }; - - // Assert - expect(testFunction).toThrow( - "LobbyInfo.deserialize() expected 563 bytes but got 1 bytes", - ); - }); - - it("should not throw an error when passed a buffer of the correct size", () => { - // Arrange - const testMessage = new LobbyInfo(); - const buffer = Buffer.alloc(563); - - // Act - const testFunction = () => { - testMessage.deserialize(buffer); - }; - - // Assert - expect(testFunction).not.toThrow(); - }); - - it("should set the correct values when passed a buffer of the correct size", () => { - // Arrange - const testMessage = new LobbyInfo(); - const buffer = Buffer.alloc(563); - - // Act - testMessage.deserialize(buffer); - - // Assert - expect(testMessage.size()).toBe(563); - - expect(testMessage._lobbyId).toBe(0); - }); - }); + describe(".size()", () => { + it("should have a starting value of 563", () => { + // Arrange + const testMessage = new LobbyInfo(); + + // Assert + expect(testMessage.size()).toBe(563); + }); + }); + + describe(".serialize()", () => { + it("should return a buffer of the correct size", () => { + // Arrange + const testMessage = new LobbyInfo(); + + // Act + const result = testMessage.serialize(); + + // Assert + expect(result).toBeInstanceOf(Buffer); + expect(result.length).toBe(563); + }); + }); + + describe(".deserialize()", () => { + it("should throw an error when passed a buffer of the wrong size", () => { + // Arrange + const testMessage = new LobbyInfo(); + const buffer = Buffer.alloc(1); + + // Act + const testFunction = () => { + testMessage.deserialize(buffer); + }; + + // Assert + expect(testFunction).toThrow( + "LobbyInfo.deserialize() expected 563 bytes but got 1 bytes", + ); + }); + + it("should not throw an error when passed a buffer of the correct size", () => { + // Arrange + const testMessage = new LobbyInfo(); + const buffer = Buffer.alloc(563); + + // Act + const testFunction = () => { + testMessage.deserialize(buffer); + }; + + // Assert + expect(testFunction).not.toThrow(); + }); + + it("should set the correct values when passed a buffer of the correct size", () => { + // Arrange + const testMessage = new LobbyInfo(); + const buffer = Buffer.alloc(563); + + // Act + testMessage.deserialize(buffer); + + // Assert + expect(testMessage.size()).toBe(563); + + expect(testMessage._lobbyId).toBe(0); + }); + }); }); diff --git a/packages/transactions/test/OwnedVehiclesMessage.test.ts b/packages/transactions/test/OwnedVehiclesMessage.test.ts index 10e28695a..5d3497664 100644 --- a/packages/transactions/test/OwnedVehiclesMessage.test.ts +++ b/packages/transactions/test/OwnedVehiclesMessage.test.ts @@ -1,38 +1,38 @@ +import { describe, expect, it } from "vitest"; import { - OwnedVehiclesMessage, - OwnedVehicle, + OwnedVehicle, + OwnedVehiclesMessage, } from "../src/OwnedVehiclesMessage.js"; -import { describe, it, expect } from "vitest"; describe("OwnedVehiclesMessage", () => { - it("should serialize", () => { - // Arrange - const message = new OwnedVehiclesMessage(); - message._msgNo = 100; + it("should serialize", () => { + // Arrange + const message = new OwnedVehiclesMessage(); + message._msgNo = 100; - // Act - const buffer = message.serialize(); + // Act + const buffer = message.serialize(); - // Assert - expect(buffer.subarray(0, 4)).toEqual( - Buffer.from([0x64, 0x00, 0x00, 0x00]), - ); - }); + // Assert + expect(buffer.subarray(0, 4)).toEqual( + Buffer.from([0x64, 0x00, 0x00, 0x00]), + ); + }); }); describe("OwnedVehicle", () => { - it("should serialize", () => { - // Arrange - const message = new OwnedVehicle(); - message._vehicleId = 100; - message._brandedPartId = 200; + it("should serialize", () => { + // Arrange + const message = new OwnedVehicle(); + message._vehicleId = 100; + message._brandedPartId = 200; - // Act - const buffer = message.serialize(); + // Act + const buffer = message.serialize(); - // Assert - expect(buffer.subarray(0, 8)).toEqual( - Buffer.from([0x64, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00]), - ); - }); + // Assert + expect(buffer.subarray(0, 8)).toEqual( + Buffer.from([0x64, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00]), + ); + }); }); diff --git a/packages/transactions/test/PartsAssemblyMessage.test.ts b/packages/transactions/test/PartsAssemblyMessage.test.ts index 326ed88e2..7f1be23cb 100644 --- a/packages/transactions/test/PartsAssemblyMessage.test.ts +++ b/packages/transactions/test/PartsAssemblyMessage.test.ts @@ -1,48 +1,47 @@ -import { PartsAssemblyMessage, Part } from "../src/PartsAssemblyMessage.js"; -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; +import { Part, PartsAssemblyMessage } from "../src/PartsAssemblyMessage.js"; describe("PartsAssemblyMessage", () => { - it("should serialize", () => { - // Arrange - const message = new PartsAssemblyMessage(100); - message._msgNo = 100; + it("should serialize", () => { + // Arrange + const message = new PartsAssemblyMessage(100); + message._msgNo = 100; - // Act - const buffer = message.serialize(); + // Act + const buffer = message.serialize(); - // Assert - expect(buffer.subarray(0, 7)).toEqual( - Buffer.from([0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00]), - ); - }); + // Assert + expect(buffer.subarray(0, 7)).toEqual( + Buffer.from([0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00]), + ); + }); }); describe("Part", () => { - it("should serialize", () => { - // Arrange - const message = new Part(); - message._partId = 100; // 0x64 - message._parentPartId = 200; // 0xc8 - message._brandedPartId = 300; // 0x12c - message._repairPrice = 400; // 0x190 - message._junkPrice = 500; // 0x1f4 - message._wear = 600; // 0x258 - message._attachmentPoint = 7; // 0x7 - message._damage = 8; // 0x8 - message._retailPrice = 900; // 0x384 - message._maxWear = 1000; // 0x3e8 + it("should serialize", () => { + // Arrange + const message = new Part(); + message._partId = 100; // 0x64 + message._parentPartId = 200; // 0xc8 + message._brandedPartId = 300; // 0x12c + message._repairPrice = 400; // 0x190 + message._junkPrice = 500; // 0x1f4 + message._wear = 600; // 0x258 + message._attachmentPoint = 7; // 0x7 + message._damage = 8; // 0x8 + message._retailPrice = 900; // 0x384 + message._maxWear = 1000; // 0x3e8 - // Act - const buffer = message.serialize(); + // Act + const buffer = message.serialize(); - // Assert - expect(buffer.subarray(0, 34)).toEqual( - Buffer.from([ - 0x64, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x2c, 0x01, - 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, - 0x58, 0x02, 0x00, 0x00, 0x07, 0x08, 0x84, 0x03, 0x00, 0x00, - 0xe8, 0x03, 0x00, 0x00, - ]), - ); - }); + // Assert + expect(buffer.subarray(0, 34)).toEqual( + Buffer.from([ + 0x64, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, + 0x90, 0x01, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, + 0x07, 0x08, 0x84, 0x03, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, + ]), + ); + }); }); diff --git a/packages/transactions/test/PlayerInfoMessage.test.ts b/packages/transactions/test/PlayerInfoMessage.test.ts index ff9dd5eb8..96300a4b9 100644 --- a/packages/transactions/test/PlayerInfoMessage.test.ts +++ b/packages/transactions/test/PlayerInfoMessage.test.ts @@ -1,18 +1,18 @@ +import { describe, expect, it } from "vitest"; import { PlayerInfoMessage } from "../src/PlayerInfoMessage.js"; -import { describe, it, expect } from "vitest"; describe("PlayerInfoMessage", () => { - it("should serialize", () => { - // Arrange - const message = new PlayerInfoMessage(); - message._msgNo = 100; + it("should serialize", () => { + // Arrange + const message = new PlayerInfoMessage(); + message._msgNo = 100; - // Act - const buffer = message.serialize(); + // Act + const buffer = message.serialize(); - // Assert - expect(buffer.subarray(0, 4)).toEqual( - Buffer.from([0x64, 0x00, 0x00, 0x00]), - ); - }); + // Assert + expect(buffer.subarray(0, 4)).toEqual( + Buffer.from([0x64, 0x00, 0x00, 0x00]), + ); + }); }); diff --git a/packages/transactions/test/PlayerRacingHistoryMessage.test.ts b/packages/transactions/test/PlayerRacingHistoryMessage.test.ts index 15366a3f4..6b595c3c4 100644 --- a/packages/transactions/test/PlayerRacingHistoryMessage.test.ts +++ b/packages/transactions/test/PlayerRacingHistoryMessage.test.ts @@ -1,8 +1,8 @@ -import { PlayerRacingHistoryMessage } from "../src/PlayerRacingHistoryMessage.js"; import { expect, test } from "vitest"; +import { PlayerRacingHistoryMessage } from "../src/PlayerRacingHistoryMessage.js"; test("Create PlayerRacingHistoryMessage instance", () => { - const message = new PlayerRacingHistoryMessage(); - // Assert that the instance is created successfully - expect(message).toBeInstanceOf(PlayerRacingHistoryMessage); + const message = new PlayerRacingHistoryMessage(); + // Assert that the instance is created successfully + expect(message).toBeInstanceOf(PlayerRacingHistoryMessage); }); diff --git a/packages/transactions/test/TClientConnectMessage.test.ts b/packages/transactions/test/TClientConnectMessage.test.ts index dcf6b5de3..cda0f8279 100644 --- a/packages/transactions/test/TClientConnectMessage.test.ts +++ b/packages/transactions/test/TClientConnectMessage.test.ts @@ -14,17 +14,17 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; import { TClientConnectMessage } from "../src/TClientConnectMessage.js"; describe("TClientConnectMessage", () => { - describe(".byteLength", () => { - it("should have a value of 51", () => { - // Arrange - const testMessage = new TClientConnectMessage(); + describe(".byteLength", () => { + it("should have a value of 51", () => { + // Arrange + const testMessage = new TClientConnectMessage(); - // Assert - expect(testMessage.size()).toBe(51); - }); - }); + // Assert + expect(testMessage.size()).toBe(51); + }); + }); }); diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.ts b/packages/transactions/test/_getPlayerRaceHistory.test.ts index e81239a76..bb067ac73 100644 --- a/packages/transactions/test/_getPlayerRaceHistory.test.ts +++ b/packages/transactions/test/_getPlayerRaceHistory.test.ts @@ -1,24 +1,23 @@ -import { describe, it, expect } from "vitest"; -import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { describe, expect, it } from "vitest"; import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; +import { OldServerMessage } from "../../shared/messageFactory.js"; +import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; describe("_getPlayerRaceHistory", () => { - it("should return a PlayerRacingHistoryMessage", async () => { - const incomingMessage = new OldServerMessage(); - incomingMessage.internalBuffer = Buffer.from([ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x01, - ]); - mockPino(); - const result = await _getPlayerRaceHistory({ - connectionId: "0", - packet: incomingMessage, - log: getServerLogger({}), - }); + it("should return a PlayerRacingHistoryMessage", async () => { + const incomingMessage = new OldServerMessage(); + incomingMessage.internalBuffer = Buffer.from([ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, + ]); + mockPino(); + const result = await _getPlayerRaceHistory({ + connectionId: "0", + packet: incomingMessage, + log: getServerLogger({}), + }); - expect(result).toBeDefined(); - }); + expect(result).toBeDefined(); + }); }); diff --git a/packages/transactions/test/clientConnect.test.ts b/packages/transactions/test/clientConnect.test.ts index 95892adc1..a7bb51eff 100644 --- a/packages/transactions/test/clientConnect.test.ts +++ b/packages/transactions/test/clientConnect.test.ts @@ -1,55 +1,53 @@ +import { describe, expect, it } from "vitest"; +import { mockPino } from "../../../test/factoryMocks.js"; +import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { State } from "../../shared/State.js"; -import { getServerLogger } from "../../shared/log.js"; -import { clientConnect } from "../src/clientConnect.js"; -import { describe, it, expect } from "vitest"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; +import { getServerLogger } from "../../shared/log.js"; import { TClientConnectMessage } from "../src/TClientConnectMessage.js"; -import { mockPino } from "../../../test/factoryMocks.js"; +import { clientConnect } from "../src/clientConnect.js"; describe("clientConnect", () => { - it("throws when connection is not found", async () => { - // arrange - const customerId = 1234; - const connectionId = "test"; - const sessionKey = - "1234567890123456123456789012345612345678901234561234567890123456"; - const contextId = "test"; - const incomingMessage = new TClientConnectMessage(); - incomingMessage._customerId = customerId; + it("throws when connection is not found", async () => { + // arrange + const customerId = 1234; + const connectionId = "test"; + const sessionKey = + "1234567890123456123456789012345612345678901234561234567890123456"; + const contextId = "test"; + const incomingMessage = new TClientConnectMessage(); + incomingMessage._customerId = customerId; - mockPino(); - const log = getServerLogger({}); - const state: State = { - encryptions: {}, - sessions: {}, - filePaths: {}, - sockets: {}, - queuedConnections: {}, - onDataHandlers: {}, - save() {}, - }; - getDatabaseServer().updateSessionKey( - customerId, - sessionKey, - contextId, - connectionId, - ); + mockPino(); + const log = getServerLogger({}); + const state: State = { + encryptions: {}, + sessions: {}, + filePaths: {}, + sockets: {}, + queuedConnections: {}, + onDataHandlers: {}, + save() {}, + }; + getDatabaseServer().updateSessionKey( + customerId, + sessionKey, + contextId, + connectionId, + ); - // act - try { - await clientConnect({ - connectionId, - packet: incomingMessage, - log, - }); - } catch (error) { - // assert - expect(error).toEqual( - new ServerError( - `Encryption not found for connection ${connectionId}`, - ), - ); - } - }); + // act + try { + await clientConnect({ + connectionId, + packet: incomingMessage, + log, + }); + } catch (error) { + // assert + expect(error).toEqual( + new ServerError(`Encryption not found for connection ${connectionId}`), + ); + } + }); }); diff --git a/packages/transactions/test/getLobbies.test.ts b/packages/transactions/test/getLobbies.test.ts index a17c625fe..be8c74e0b 100644 --- a/packages/transactions/test/getLobbies.test.ts +++ b/packages/transactions/test/getLobbies.test.ts @@ -1,27 +1,27 @@ +import { describe, expect, it } from "vitest"; import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { getLobbies } from "../src/getLobbies.js"; -import { describe, expect, it } from "vitest"; describe("getLobbies", () => { - it("should return a promise", async () => { - // arrange - const connectionId = "1"; - const packet = new OldServerMessage(); - mockPino(); - const log = getServerLogger({}); + it("should return a promise", async () => { + // arrange + const connectionId = "1"; + const packet = new OldServerMessage(); + mockPino(); + const log = getServerLogger({}); - // act - const result = await getLobbies({ - connectionId, - packet, - log, - }); + // act + const result = await getLobbies({ + connectionId, + packet, + log, + }); - const resultMessage = result.messages[0].serialize().toString("hex"); + const resultMessage = result.messages[0].serialize().toString("hex"); - // assert - expect(resultMessage).toMatch(/4102544f4d43/); - }); + // assert + expect(resultMessage).toMatch(/4102544f4d43/); + }); }); diff --git a/packages/transactions/test/login.test.ts b/packages/transactions/test/login.test.ts index 691d6a934..d19f1bb01 100644 --- a/packages/transactions/test/login.test.ts +++ b/packages/transactions/test/login.test.ts @@ -1,27 +1,27 @@ +import { describe, expect, it } from "vitest"; +import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { login } from "../src/login.js"; -import { describe, it, expect } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; describe("login", () => { - it("returns a message", async () => { - // arrange - const connectionId = "test"; - const incomingMessage = new OldServerMessage(); - const imcommingBuffer = Buffer.from(JSON.stringify(incomingMessage)); - incomingMessage.setBuffer(imcommingBuffer); - mockPino(); - const log = getServerLogger({}); + it("returns a message", async () => { + // arrange + const connectionId = "test"; + const incomingMessage = new OldServerMessage(); + const imcommingBuffer = Buffer.from(JSON.stringify(incomingMessage)); + incomingMessage.setBuffer(imcommingBuffer); + mockPino(); + const log = getServerLogger({}); - // act - const result = await login({ - connectionId, - packet: incomingMessage, - log, - }); + // act + const result = await login({ + connectionId, + packet: incomingMessage, + log, + }); - // assert - expect(result.messages[0]).toBeInstanceOf(OldServerMessage); - }); + // assert + expect(result.messages[0]).toBeInstanceOf(OldServerMessage); + }); }); diff --git a/packages/transactions/test/trackingPing.test.ts b/packages/transactions/test/trackingPing.test.ts index 5fcb9f5f5..edaa44e1e 100644 --- a/packages/transactions/test/trackingPing.test.ts +++ b/packages/transactions/test/trackingPing.test.ts @@ -1,27 +1,27 @@ +import { describe, expect, test, vi } from "vitest"; import { P } from "vitest/dist/reporters-5f784f42.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { trackingPing } from "../src/trackingPing.js"; -import { describe, test, expect, vi } from "vitest"; describe("trackingPing", () => { - test("does not return a message", async () => { - // arrange - const inboundMessage = new OldServerMessage(); - vi.mock("pino", async () => { - const actual = await vi.importActual("pino"); - return { - ...(actual as P), - }; - }); - const log = getServerLogger({}); + test("does not return a message", async () => { + // arrange + const inboundMessage = new OldServerMessage(); + vi.mock("pino", async () => { + const actual = await vi.importActual("pino"); + return { + ...(actual as P), + }; + }); + const log = getServerLogger({}); - // act - const { messages } = await trackingPing({ - connectionId: "test", - packet: inboundMessage, - log, - }); - expect(messages.length).toBe(0); - }); + // act + const { messages } = await trackingPing({ + connectionId: "test", + packet: inboundMessage, + log, + }); + expect(messages.length).toBe(0); + }); }); diff --git a/prettierrc b/prettierrc deleted file mode 100644 index d1039fbcf..000000000 --- a/prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "trailingComma": "es5", - "tabWidth": 4, - "semi": false, - "singleQuote": true -} \ No newline at end of file diff --git a/server.ts b/server.ts index 931bfcbf4..dfc63871b 100755 --- a/server.ts +++ b/server.ts @@ -14,78 +14,77 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . +import { exit } from "node:process"; import Sentry from "@sentry/node"; -import { getServerLogger } from "./packages/shared/log.js"; +import { getGatewayServer } from "./packages/gateway/src/GatewayServer.js"; import { verifyLegacyCipherSupport } from "./packages/gateway/src/encryption.js"; import { getServerConfiguration } from "./packages/shared/Configuration.js"; -import { getGatewayServer } from "./packages/gateway/src/GatewayServer.js"; -import { exit } from "node:process"; +import { getServerLogger } from "./packages/shared/log.js"; const coreLogger = getServerLogger({ - module: "core", + module: "core", }); try { - verifyLegacyCipherSupport(); + verifyLegacyCipherSupport(); } catch (err) { - coreLogger.fatal(`Error in core server: ${String(err)}`); - exit(1); + coreLogger.fatal(`Error in core server: ${String(err)}`); + exit(1); } Sentry.init({ - dsn: process.env.SENTRY_DSN, + dsn: process.env.SENTRY_DSN, - // We recommend adjusting this value in production, or using tracesSampler - // for finer control - tracesSampleRate: 1.0, - profilesSampleRate: 1.0, // Profiling sample rate is relative to tracesSampleRate + // We recommend adjusting this value in production, or using tracesSampler + // for finer control + tracesSampleRate: 1.0, + profilesSampleRate: 1.0, // Profiling sample rate is relative to tracesSampleRate }); try { - if (typeof process.env.EXTERNAL_HOST === "undefined") { - console.error("Please set EXTERNAL_HOST"); - process.exit(1); - } - if (typeof process.env.CERTIFICATE_FILE === "undefined") { - console.error("Please set CERTIFICATE_FILE"); - process.exit(1); - } - if (typeof process.env.PRIVATE_KEY_FILE === "undefined") { - console.error("Please set PRIVATE_KEY_FILE"); - process.exit(1); - } - if (typeof process.env.PUBLIC_KEY_FILE === "undefined") { - console.error("Please set PUBLIC_KEY_FILE"); - process.exit(1); - } - const config = getServerConfiguration({ - host: process.env.EXTERNAL_HOST, - certificateFile: process.env.CERTIFICATE_FILE, - privateKeyFile: process.env.PRIVATE_KEY_FILE, - publicKeyFile: process.env.PUBLIC_KEY_FILE, - logLevel: process.env.LOG_LEVEL, - }); + if (typeof process.env.EXTERNAL_HOST === "undefined") { + console.error("Please set EXTERNAL_HOST"); + process.exit(1); + } + if (typeof process.env.CERTIFICATE_FILE === "undefined") { + console.error("Please set CERTIFICATE_FILE"); + process.exit(1); + } + if (typeof process.env.PRIVATE_KEY_FILE === "undefined") { + console.error("Please set PRIVATE_KEY_FILE"); + process.exit(1); + } + if (typeof process.env.PUBLIC_KEY_FILE === "undefined") { + console.error("Please set PUBLIC_KEY_FILE"); + process.exit(1); + } + const config = getServerConfiguration({ + host: process.env.EXTERNAL_HOST, + certificateFile: process.env.CERTIFICATE_FILE, + privateKeyFile: process.env.PRIVATE_KEY_FILE, + publicKeyFile: process.env.PUBLIC_KEY_FILE, + logLevel: process.env.LOG_LEVEL, + }); - const appLog = getServerLogger({ - level: config.logLevel, - module: "app", - }); + const appLog = getServerLogger({ + level: config.logLevel, + module: "app", + }); - const listeningPortList = [ - 6660, 7003, 8228, 8226, 8227, 9000, 9001, 9002, 9003, 9004, 9005, 9006, - 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, - 53303, - ]; + const listeningPortList = [ + 6660, 7003, 8228, 8226, 8227, 9000, 9001, 9002, 9003, 9004, 9005, 9006, + 9007, 9008, 9009, 9010, 9011, 9012, 9013, 9014, 43200, 43300, 43400, 53303, + ]; - const gatewayServer = getGatewayServer({ - config, - log: appLog, - listeningPortList, - }); + const gatewayServer = getGatewayServer({ + config, + log: appLog, + listeningPortList, + }); - gatewayServer.start(); + gatewayServer.start(); } catch (err) { - Sentry.captureException(err); - coreLogger.fatal(`Error in core server: ${String(err)}`); - process.exit(1); + Sentry.captureException(err); + coreLogger.fatal(`Error in core server: ${String(err)}`); + process.exit(1); } diff --git a/test/factoryMocks.ts b/test/factoryMocks.ts index 204aed661..7c1e14b5a 100644 --- a/test/factoryMocks.ts +++ b/test/factoryMocks.ts @@ -1,41 +1,41 @@ import { expect, it, vi } from "vitest"; -import { DatabaseManager } from "../packages/interfaces/index.js"; import { verifyLegacyCipherSupport } from "../packages/gateway/src/encryption.js"; +import { DatabaseManager } from "../packages/interfaces/index.js"; export function mockDatabaseManager(): DatabaseManager { - return { - updateSessionKey: vi.fn(), - fetchSessionKeyByCustomerId: vi.fn(), - }; + return { + updateSessionKey: vi.fn(), + fetchSessionKeyByCustomerId: vi.fn(), + }; } export function mockPino() { - vi.mock("pino", () => { - return { - default: vi.fn().mockImplementation(() => { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; - }), - pino: vi.fn().mockImplementation(() => { - return { - debug: vi.fn(), - info: vi.fn(), - warn: vi.fn(), - error: vi.fn(), - }; - }), - }; - }); + vi.mock("pino", () => { + return { + default: vi.fn().mockImplementation(() => { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; + }), + pino: vi.fn().mockImplementation(() => { + return { + debug: vi.fn(), + info: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + }; + }), + }; + }); } export function unmockPino() { - vi.unmock("pino"); + vi.unmock("pino"); } it("should have crypto", () => { - expect(() => verifyLegacyCipherSupport()).not.toThrow(); + expect(() => verifyLegacyCipherSupport()).not.toThrow(); }); diff --git a/tsconfig.json b/tsconfig.json index ecd9f5e30..2319a54af 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,21 +1,16 @@ { - "compilerOptions": { - "incremental": true, - "target": "es2016", - "module": "NodeNext", - "noImplicitOverride": true, - "declaration": true, - "declarationMap": true, - "outDir": "./dist", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true - }, - "include": [ - "src", - "test", - "packages", - "server.ts" - ] -} \ No newline at end of file + "compilerOptions": { + "incremental": true, + "target": "es2016", + "module": "NodeNext", + "noImplicitOverride": true, + "declaration": true, + "declarationMap": true, + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "include": ["src", "test", "packages", "server.ts"] +} diff --git a/vite.config.ts b/vite.config.ts index 33d8ac0c2..5d3ea5446 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,17 +1,17 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "interfaces", - ], - reporter: ["lcov", "text", "cobertura"], - }, - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "interfaces", + ], + reporter: ["lcov", "text", "cobertura"], + }, + }, }); From f8c6982ab59016c950a0c4226cd276d401d7e464 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 07:56:32 -0400 Subject: [PATCH 06/84] chore: wip - npm start still works --- package-lock.json | 19 +- package.json | 34 +- packages/gateway/index.ts | 1 + packages/transactions/package.json | 21 + packages/transactions/tsconfig.json | 12 + pnpm-lock.yaml | 11184 ++++++++++++++++++++++++++ pnpm-workspace.yaml | 2 + server.ts | 28 +- tsconfig.base.json | 81 + tsconfig.json | 16 +- 10 files changed, 11354 insertions(+), 44 deletions(-) create mode 100644 packages/gateway/index.ts create mode 100644 packages/transactions/package.json create mode 100644 packages/transactions/tsconfig.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 tsconfig.base.json diff --git a/package-lock.json b/package-lock.json index 63553d74d..968e3becd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,15 +11,20 @@ "workspaces": [ "apps/main", "packages/cli", - "packages/connection", + "packages/core", "packages/database", "packages/gateway", + "packages/interfaces", + "packages/lobby", + "packages/login", "packages/mcots", "packages/nps", "packages/patch", + "packages/persona", "packages/shard", "packages/shared", - "packages/shared-packets" + "packages/shared-packets", + "packages/transactions" ], "dependencies": { "@adminjs/sequelize": "^4.1.1", @@ -30,6 +35,7 @@ "fastify": "^4.25.1", "moment": "^2.29.4", "pino": "^8.17.1", + "rusty-motors-gateway": "^1.0.0", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" @@ -12596,6 +12602,10 @@ "resolved": "packages/shared-packets", "link": true }, + "node_modules/rusty-motors-transactions": { + "resolved": "packages/transactions", + "link": true + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -15243,6 +15253,11 @@ "dependencies": { "real-require": "^0.2.0" } + }, + "packages/transactions": { + "name": "rusty-motors-transactions", + "version": "1.0.0", + "license": "AGPL-3.0" } } } diff --git a/package.json b/package.json index 4d7d13d9c..929915fc5 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,11 @@ "types:db": "npm --workspace rusty-motors-database run types:db", "migrate": "pg-migrations apply --directory migrations " }, - "files": ["README.md", "CHANGELOG.md", "AUTHORS"], + "files": [ + "README.md", + "CHANGELOG.md", + "AUTHORS" + ], "type": "module", "dependencies": { "@adminjs/sequelize": "^4.1.1", @@ -32,23 +36,11 @@ "fastify": "^4.25.1", "moment": "^2.29.4", "pino": "^8.17.1", + "rusty-motors-gateway": "link:packages/gateway", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" }, - "workspaces": [ - "apps/main", - "packages/cli", - "packages/connection", - "packages/database", - "packages/gateway", - "packages/mcots", - "packages/nps", - "packages/patch", - "packages/shard", - "packages/shared", - "packages/shared-packets" - ], "devDependencies": { "@biomejs/biome": "1.8.3", "@sentry/cli": "^2.23.1", @@ -78,8 +70,18 @@ }, "c8": { "all": true, - "reporter": ["text", "cobertura", "html", "lcov"], - "exclude": ["coverage", "**/*.test.m{j,t}s", "docs", "docs2"] + "reporter": [ + "text", + "cobertura", + "html", + "lcov" + ], + "exclude": [ + "coverage", + "**/*.test.m{j,t}s", + "docs", + "docs2" + ] }, "lint-staged": { "**/*.js": "eslint" diff --git a/packages/gateway/index.ts b/packages/gateway/index.ts new file mode 100644 index 000000000..4f86d8559 --- /dev/null +++ b/packages/gateway/index.ts @@ -0,0 +1 @@ +export { getGatewayServer } from "./src/GatewayServer.js"; diff --git a/packages/transactions/package.json b/packages/transactions/package.json new file mode 100644 index 000000000..caa8e9d1c --- /dev/null +++ b/packages/transactions/package.json @@ -0,0 +1,21 @@ +{ + "name": "rusty-motors-transactions", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npx prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "description": "" +} diff --git a/packages/transactions/tsconfig.json b/packages/transactions/tsconfig.json new file mode 100644 index 000000000..5a7fd161b --- /dev/null +++ b/packages/transactions/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "references": [ + { + "path": "../shared-packets" + } + ] +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 000000000..847064ec2 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,11184 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@adminjs/sequelize': + specifier: ^4.1.1 + version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3) + '@fastify/sensible': + specifier: ^5.5.0 + version: 5.6.0 + '@sentry/node': + specifier: '7.88' + version: 7.88.0 + '@sentry/profiling-node': + specifier: ^1.3.2 + version: 1.3.5(@sentry/node@7.88.0) + adminjs: + specifier: ^7.5.2 + version: 7.8.11(@types/react@18.3.4) + fastify: + specifier: ^4.25.1 + version: 4.28.1 + moment: + specifier: ^2.29.4 + version: 2.30.1 + pino: + specifier: ^8.17.1 + version: 8.21.0 + rusty-motors-gateway: + specifier: link:packages/gateway + version: link:packages/gateway + sequelize: + specifier: ^6.35.2 + version: 6.37.3 + sqlite: + specifier: ^5.1.1 + version: 5.1.1 + ts-node: + specifier: 10.9.2 + version: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) + devDependencies: + '@biomejs/biome': + specifier: 1.8.3 + version: 1.8.3 + '@sentry/cli': + specifier: ^2.23.1 + version: 2.33.1 + '@tsconfig/node-lts': + specifier: ^20.1.0 + version: 20.1.3 + '@tsconfig/node20': + specifier: ^20.1.2 + version: 20.1.4 + '@types/chai': + specifier: 4.3.11 + version: 4.3.11 + '@types/node': + specifier: ^20.10.5 + version: 20.16.1 + '@types/sinon': + specifier: 17.0.2 + version: 17.0.2 + '@types/sinon-chai': + specifier: 3.2.12 + version: 3.2.12 + '@typescript-eslint/eslint-plugin': + specifier: ^6.15.0 + version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': + specifier: ^6.15.0 + version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@vitest/coverage-v8': + specifier: ^1.1.0 + version: 1.6.0(vitest@1.6.0(@types/node@20.16.1)) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.57.0) + eslint-plugin-prettier: + specifier: 5.1.1 + version: 5.1.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.1.1) + husky: + specifier: ^8.0.3 + version: 8.0.3 + jsdoc: + specifier: ^4.0.2 + version: 4.0.3 + lint-staged: + specifier: ^15.2.0 + version: 15.2.9 + prettier: + specifier: 3.1.1 + version: 3.1.1 + prettier-eslint: + specifier: 16.2.0 + version: 16.2.0 + rimraf: + specifier: ^5.0.5 + version: 5.0.10 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + tsx: + specifier: 4.7.0 + version: 4.7.0 + typescript: + specifier: ^5.3.3 + version: 5.5.4 + typescript-eslint-language-service: + specifier: ^5.0.5 + version: 5.0.5(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + vitest: + specifier: ^1.1.0 + version: 1.6.0(@types/node@20.16.1) + + packages/cli: + dependencies: + rusty-motors-shared: + specifier: ^1.0.0 + version: link:../shared + rusty-motors-shared-packets: + specifier: ^1.0.0 + version: link:../shared-packets + devDependencies: + '@vitest/coverage-v8': + specifier: 1.6.0 + version: 1.6.0(vitest@1.6.0(@types/node@20.16.1)) + + packages/database: + dependencies: + '@databases/pg': + specifier: ^5.5.0 + version: 5.5.0(typescript@5.5.4) + '@databases/pg-schema-cli': + specifier: ^4.4.0 + version: 4.4.0(typescript@5.5.4) + '@databases/pg-typed': + specifier: ^4.4.1 + version: 4.4.1(@databases/pg@5.5.0(typescript@5.5.4)) + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + '@types/pg': + specifier: ^8.11.6 + version: 8.11.6 + pg: + specifier: ^8.11.5 + version: 8.12.0 + pg-hstore: + specifier: ^2.3.4 + version: 2.3.4 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + + packages/gateway: + dependencies: + '@fastify/sensible': + specifier: ^5.5.0 + version: 5.6.0 + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + fastify: + specifier: ^4.25.2 + version: 4.28.1 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + + packages/mcots: + dependencies: + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + short-unique-id: + specifier: ^5.0.3 + version: 5.2.0 + + packages/nps: + dependencies: + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + short-unique-id: + specifier: ^5.0.3 + version: 5.2.0 + + packages/patch: + dependencies: + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + + packages/shard: + dependencies: + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + + packages/shared: + dependencies: + fastify: + specifier: ^4.27.0 + version: 4.28.1 + pino: + specifier: ^9.0.0 + version: 9.3.2 + pino-pretty: + specifier: ^11.0.0 + version: 11.2.2 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + + packages/shared-packets: {} + + packages/transactions: {} + +packages: + + '@adminjs/design-system@4.1.1': + resolution: {integrity: sha512-aUJjoOwXlBgJWckqDcgUDrRCiDnSrtSHnjFIYzfhhm0dFV107ToHNBemvh72/+krXHtMhRuWCkYkKnrJKh1Bjw==} + peerDependencies: + react: ^18.1.0 + react-dom: ^18.1.0 + + '@adminjs/sequelize@4.1.1': + resolution: {integrity: sha512-HKOuuFn79tvW6xKP+v7FvKc6V7vERlmdEu9oAAR3gz6SE3T+V7Uz8N+trwngFhOpTWVcuws2FchFvKG3Xrm9iw==} + peerDependencies: + adminjs: ^7.0.0 + sequelize: '>=6' + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.25.2': + resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.25.2': + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.25.0': + resolution: {integrity: sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.2': + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.25.0': + resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-create-regexp-features-plugin@7.25.2': + resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.2': + resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-member-expression-to-functions@7.24.8': + resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.25.2': + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.24.7': + resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.8': + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-remap-async-to-generator@7.25.0': + resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-replace-supers@7.25.0': + resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.8': + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.24.8': + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-wrap-function@7.25.0': + resolution: {integrity: sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.25.0': + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.25.3': + resolution: {integrity: sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3': + resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0': + resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0': + resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7': + resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0': + resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-export-namespace-from@7.8.3': + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-assertions@7.24.7': + resolution: {integrity: sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.24.7': + resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.7': + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-arrow-functions@7.24.7': + resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-generator-functions@7.25.0': + resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-async-to-generator@7.24.7': + resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoped-functions@7.24.7': + resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-block-scoping@7.25.0': + resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-properties@7.24.7': + resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-class-static-block@7.24.7': + resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + + '@babel/plugin-transform-classes@7.25.0': + resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-computed-properties@7.24.7': + resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-destructuring@7.24.8': + resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-dotall-regex@7.24.7': + resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-keys@7.24.7': + resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0': + resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-dynamic-import@7.24.7': + resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-exponentiation-operator@7.24.7': + resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-export-namespace-from@7.24.7': + resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-for-of@7.24.7': + resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-function-name@7.25.1': + resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-json-strings@7.24.7': + resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-literals@7.25.2': + resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7': + resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.24.7': + resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.24.7': + resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.8': + resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.25.0': + resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.24.7': + resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7': + resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.24.7': + resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7': + resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.24.7': + resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.24.7': + resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.24.7': + resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.24.7': + resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.24.8': + resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.24.7': + resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.24.7': + resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.24.7': + resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.24.7': + resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-display-name@7.24.7': + resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.24.7': + resolution: {integrity: sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.2': + resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.24.7': + resolution: {integrity: sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.24.7': + resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-reserved-words@7.24.7': + resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-runtime@7.24.7': + resolution: {integrity: sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.24.7': + resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.24.7': + resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.24.7': + resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.24.7': + resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.24.8': + resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.25.2': + resolution: {integrity: sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.24.7': + resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.24.7': + resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.24.7': + resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7': + resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.25.3': + resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-react@7.24.7': + resolution: {integrity: sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.7': + resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.24.6': + resolution: {integrity: sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/regjsgen@0.8.0': + resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} + + '@babel/runtime@7.25.0': + resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.0': + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.3': + resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.25.2': + resolution: {integrity: sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@biomejs/biome@1.8.3': + resolution: {integrity: sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==} + engines: {node: '>=14.21.3'} + hasBin: true + + '@biomejs/cli-darwin-arm64@1.8.3': + resolution: {integrity: sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + + '@biomejs/cli-darwin-x64@1.8.3': + resolution: {integrity: sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + + '@biomejs/cli-linux-arm64-musl@1.8.3': + resolution: {integrity: sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-arm64@1.8.3': + resolution: {integrity: sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + + '@biomejs/cli-linux-x64-musl@1.8.3': + resolution: {integrity: sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-linux-x64@1.8.3': + resolution: {integrity: sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + + '@biomejs/cli-win32-arm64@1.8.3': + resolution: {integrity: sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + + '@biomejs/cli-win32-x64@1.8.3': + resolution: {integrity: sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@databases/connection-pool@1.1.0': + resolution: {integrity: sha512-/12/SNgl0V77mJTo5SX3yGPz4c9XGQwAlCfA0vlfs/0HcaErNpYXpmhj0StET07w6TmTJTnaUgX2EPcQK9ez5A==} + + '@databases/escape-identifier@1.0.3': + resolution: {integrity: sha512-Su36iSVzaHxpVdISVMViUX/32sLvzxVgjZpYhzhotxZUuLo11GVWsiHwqkvUZijTLUxcDmUqEwGJO3O/soLuZA==} + + '@databases/lock@2.1.0': + resolution: {integrity: sha512-ReWnFE5qeCuO2SA5h5fDh/hE/vMolA+Epe6xkAQP1FL2nhnsTCYwN2JACk/kWctR4OQoh0njBjPZ0yfIptclcA==} + + '@databases/pg-bulk@1.2.0': + resolution: {integrity: sha512-GdzwFIllgOtuKbro4r6QBe0+4LipaUwb8+N7+z9QP+wg3XozGLnojnMFQlBrrc70jycw4aCM1O30w4vYtVlR/Q==} + peerDependencies: + '@databases/pg': '*' + + '@databases/pg-config@3.2.0': + resolution: {integrity: sha512-hoPAK/F8gLcLgEJ8mLSnNvRlKqShwx5+GglDHIIfQhKF+Zz6M6QceiOefckS4WSjA0x2HClPvpercnXp9i24ag==} + + '@databases/pg-connection-string@1.0.0': + resolution: {integrity: sha512-8czOF9jlv7PlS7BPjnL82ynpDs1t8cu+C2jvdtMr37e8daPKMS7n1KfNE9xtr2Gq4QYKjynep097eYa5yIwcLA==} + + '@databases/pg-data-type-id@3.0.0': + resolution: {integrity: sha512-VqW1csN8pRsWJxjPsGIC9FQ8wyenfmGv0P//BaeDMAu/giM3IXKxKM8fkScUSQ00uqFK/L1iHS5g6dgodF3XzA==} + + '@databases/pg-errors@1.0.0': + resolution: {integrity: sha512-Yz3exbptZwOn4ZD/MSwY6z++XVyOFsMh5DERvSw3awRwJFnfdaqdeiIxxX0MVjM6KPihF0xxp8lPO7vTc5ydpw==} + + '@databases/pg-schema-cli@4.4.0': + resolution: {integrity: sha512-pwLEjFrPl8Gk+7KmSbHHW9kYnUIWN9/V8DCb9Gwee7hXRkZeEZg9thdprG/ngxIdf983MfHyA/8np78IyNyhqg==} + hasBin: true + + '@databases/pg-schema-introspect@4.2.0': + resolution: {integrity: sha512-WaN79kbMwiQCS78XlCVOPE+Q6Go2gF3FNqatGWUZHnbHn+NR8I/5/1uC7T8HTruC5UfTe3CcCNPUglVad2YoVg==} + + '@databases/pg-schema-print-types@4.5.0': + resolution: {integrity: sha512-HlCHVPuu+qm1oNgkp+v3exdvmeJxflZnDTL6D6eSr3yMSClMQ7JBzCthymazWyZ9s4qsHO6gXfNhgUgjUz6LFw==} + peerDependencies: + '@databases/pg-schema-introspect': '*' + + '@databases/pg-typed@4.4.1': + resolution: {integrity: sha512-7UU7RzVKsB3WUfDm3rMI0x0lw79oNtzGQLTG5tVrpSlUxvHBRaZWm4F6kiov3Wo/HVxtQA+d9trGHcvfGOh+dw==} + peerDependencies: + '@databases/pg': '*' + + '@databases/pg@5.5.0': + resolution: {integrity: sha512-WIojK9AYIlNi5YRfc5YUOow3PQ82ClmwT9HG3nEsKLUERYieoVmHMYDQLS0ry6FjgJx+2yFs7LCw4kZpWu1TBw==} + + '@databases/push-to-async-iterable@3.0.0': + resolution: {integrity: sha512-xwu/yNgINdMU+fn6UwFsxh+pa6UrVPafY+0qm0RK0/nKyjllfDqSbwK4gSmdmLEwPYxKwch9CAE3P8NxN1hPSg==} + + '@databases/queue@1.0.1': + resolution: {integrity: sha512-dqRU+/aQ4lhFzjPIkIhjB0+UEKMb76FoBgHOJUTcEblgatr/IhdhHliT3VVwcImXh35Mz297PAXE4yFM4eYWUQ==} + + '@databases/shared-print-types@1.2.0': + resolution: {integrity: sha512-/TLxh4s1nbMU6fcqZd0u7KXaBvs7/kBDW92kLhkfKqB53vvhdnszOVlrX8G07697qffvtZuF4jLZjKceQcEmDw==} + + '@databases/shared@3.1.0': + resolution: {integrity: sha512-bO1DIYAYDiWOCqVPvBio1JqZQYh4dph2M1av2w/REeFT6WBd64mTrOFlcxKV0CUAYT0UiJsDfPqEfw0/APRzWg==} + + '@databases/split-sql-query@1.0.4': + resolution: {integrity: sha512-lDqDQvH34NNjLs0knaDvL6HKgPtishQlDYHfOkvbAd5VQOEhcDvvmG2zbBuFvS2HQAz5NsyLj5erGaxibkxhvQ==} + peerDependencies: + '@databases/sql': '*' + + '@databases/sql@3.3.0': + resolution: {integrity: sha512-vj9huEy4mjJ48GS1Z8yvtMm4BYAnFYACUds25ym6Gd/gsnngkJ17fo62a6mmbNNwCBS/8467PmZR01Zs/06TjA==} + + '@databases/validate-unicode@1.0.0': + resolution: {integrity: sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==} + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.13.1': + resolution: {integrity: sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.3.0': + resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.13.3': + resolution: {integrity: sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.1': + resolution: {integrity: sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.0': + resolution: {integrity: sha512-spEnrA1b6hDR/C68lC2M7m6ALPUHZC0lIY7jAS/B/9DuuO1ZP04eov8SMv/6fwRd8pzmsn2AuJEznRREWlQrlQ==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.23.1': + resolution: {integrity: sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.23.1': + resolution: {integrity: sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.23.1': + resolution: {integrity: sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.23.1': + resolution: {integrity: sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.23.1': + resolution: {integrity: sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.23.1': + resolution: {integrity: sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.23.1': + resolution: {integrity: sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.23.1': + resolution: {integrity: sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.23.1': + resolution: {integrity: sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.23.1': + resolution: {integrity: sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.23.1': + resolution: {integrity: sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.23.1': + resolution: {integrity: sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.23.1': + resolution: {integrity: sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.23.1': + resolution: {integrity: sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.23.1': + resolution: {integrity: sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.23.1': + resolution: {integrity: sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.23.1': + resolution: {integrity: sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.23.1': + resolution: {integrity: sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.23.1': + resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.23.1': + resolution: {integrity: sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.23.1': + resolution: {integrity: sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.23.1': + resolution: {integrity: sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.23.1': + resolution: {integrity: sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.23.1': + resolution: {integrity: sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.11.0': + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@fastify/ajv-compiler@3.6.0': + resolution: {integrity: sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/sensible@5.6.0': + resolution: {integrity: sha512-Vq6Z2ZQy10GDqON+hvLF52K99s9et5gVVxTul5n3SIAf0Kq5QjPRUKkAMT3zPAiiGvoHtS3APa/3uaxfDgCODQ==} + + '@floating-ui/core@1.6.7': + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + + '@floating-ui/dom@1.6.10': + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + + '@floating-ui/utils@0.2.7': + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + + '@hello-pangea/dnd@16.6.0': + resolution: {integrity: sha512-vfZ4GydqbtUPXSLfAvKvXQ6xwRzIjUSjVU0Sx+70VOhc2xx6CdmJXJ8YhH70RpbTUGjxctslQTHul9sIOxCfFQ==} + peerDependencies: + react: ^16.8.5 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.5 || ^17.0.0 || ^18.0.0 + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@hypnosphi/create-react-context@0.3.1': + resolution: {integrity: sha512-V1klUed202XahrWJLLOT3EXNeCpFHCcJntdFGI15ntCwau+jfT386w7OFTMaCqOgXUH1fa0w/I1oZs+i/Rfr0A==} + peerDependencies: + prop-types: ^15.0.0 + react: '>=0.14.0' + + '@inquirer/figures@1.0.5': + resolution: {integrity: sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA==} + engines: {node: '>=18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdoc/salty@0.2.8': + resolution: {integrity: sha512-5e+SFVavj1ORKlKaKr2BmTOekmXbelU7dC0cDkQLqag7xfuTPuGMUFx7KWJuv4bYZrTsoL2Z18VVCOKYxzoHcg==} + engines: {node: '>=v12.0.0'} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@opentelemetry/api-logs@0.52.1': + resolution: {integrity: sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A==} + engines: {node: '>=14'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@1.25.1': + resolution: {integrity: sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@1.25.1': + resolution: {integrity: sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-connect@0.38.0': + resolution: {integrity: sha512-2/nRnx3pjYEmdPIaBwtgtSviTKHWnDZN3R+TkRUnhIVrvBKVcq+I5B2rtd6mr6Fe9cHlZ9Ojcuh7pkNh/xdWWg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.41.1': + resolution: {integrity: sha512-uRx0V3LPGzjn2bxAnV8eUsDT82vT7NTwI0ezEuPMBOTOsnPpGhWdhcdNdhH80sM4TrWrOfXm9HGEdfWE3TRIww==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fastify@0.38.0': + resolution: {integrity: sha512-HBVLpTSYpkQZ87/Df3N0gAw7VzYZV3n28THIBrJWfuqw3Or7UqdhnjeuMIPQ04BKk3aZc0cWn2naSQObbh5vXw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.14.0': + resolution: {integrity: sha512-pVc8P5AgliC1DphyyBUgsxXlm2XaPH4BpYvt7rAZDMIqUpRk8gs19SioABtKqqxvFzg5jPtgJfJsdxq0Y+maLw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.42.0': + resolution: {integrity: sha512-N8SOwoKL9KQSX7z3gOaw5UaTeVQcfDO1c21csVHnmnmGUoqsXbArK2B8VuwPWcv6/BC/i3io+xTo7QGRZ/z28Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.40.0': + resolution: {integrity: sha512-8U/w7Ifumtd2bSN1OLaSwAAFhb9FyqWUki3lMMB0ds+1+HdSxYBe9aspEJEgvxAqOkrQnVniAPTEGf1pGM7SOw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.52.1': + resolution: {integrity: sha512-dG/aevWhaP+7OLv4BQQSEKMJv8GyeOp3Wxl31NHqE8xo9/fYMfEljiZphUHIfyg4gnZ9swMyWjfOQs5GUQe54Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.42.0': + resolution: {integrity: sha512-P11H168EKvBB9TUSasNDOGJCSkpT44XgoM6d3gRIWAa9ghLpYhl0uRkS8//MqPzcJVHr3h3RmfXIpiYLjyIZTw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.42.0': + resolution: {integrity: sha512-H1BEmnMhho8o8HuNRq5zEI4+SIHDIglNB7BPKohZyWG4fWNuR7yM4GTlR01Syq21vODAS7z5omblScJD/eZdKw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.46.0': + resolution: {integrity: sha512-VF/MicZ5UOBiXrqBslzwxhN7TVqzu1/LN/QDpkskqM0Zm0aZ4CVRbUygL8d7lrjLn15x5kGIe8VsSphMfPJzlA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.40.0': + resolution: {integrity: sha512-niRi5ZUnkgzRhIGMOozTyoZIvJKNJyhijQI4nF4iFSb+FUx2v5fngfR+8XLmdQAO7xmsD8E5vEGdDVYVtKbZew==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.40.0': + resolution: {integrity: sha512-0xfS1xcqUmY7WE1uWjlmI67Xg3QsSUlNT+AcXHeA4BDUPwZtWqF4ezIwLgpVZfHOnkAEheqGfNSWd1PIu3Wnfg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.40.0': + resolution: {integrity: sha512-d7ja8yizsOCNMYIJt5PH/fKZXjb/mS48zLROO4BzZTtDfhNCl2UM/9VIomP2qkGIFVouSJrGr/T00EzY7bPtKA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-nestjs-core@0.39.0': + resolution: {integrity: sha512-mewVhEXdikyvIZoMIUry8eb8l3HUjuQjSjVbmLVTt4NQi35tkpnHQrG9bTRBrl3403LoWZ2njMPJyg4l6HfKvA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.43.0': + resolution: {integrity: sha512-og23KLyoxdnAeFs1UWqzSonuCkePUzCX30keSYigIzJe/6WSYA8rnEI5lobcxPEzg+GcU06J7jzokuEHbjVJNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis-4@0.41.0': + resolution: {integrity: sha512-H7IfGTqW2reLXqput4yzAe8YpDC0fmVNal95GHMLOrS89W+qWUKIqxolSh63hJyfmwPSFwXASzj7wpSk8Az+Dg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.46.0': + resolution: {integrity: sha512-a9TijXZZbk0vI5TGLZl+0kxyFfrXHhX6Svtz7Pp2/VBlCSKrazuULEyoJQrOknJyFWNMEmbbJgOciHCCpQcisw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation@0.52.1': + resolution: {integrity: sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.36.2': + resolution: {integrity: sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==} + engines: {node: '>=14'} + + '@opentelemetry/resources@1.25.1': + resolution: {integrity: sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/sdk-metrics@1.25.1': + resolution: {integrity: sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@1.25.1': + resolution: {integrity: sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.25.1': + resolution: {integrity: sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.40.1': + resolution: {integrity: sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + + '@prisma/instrumentation@5.17.0': + resolution: {integrity: sha512-c1Sle4ji8aasMcYfBBHFM56We4ljfenVtRmS8aY06BllS7SoU6SmJBwG7vil+GHiR0Yrh+t9iBwt4AY0Jr4KNQ==} + + '@redux-devtools/extension@3.3.0': + resolution: {integrity: sha512-X34S/rC8S/M1BIrkYD1mJ5f8vlH0BDqxXrs96cvxSBo4FhMdbhU+GUGsmNYov1xjSyLMHgo8NYrUG8bNX7525g==} + peerDependencies: + redux: ^3.1.0 || ^4.0.0 || ^5.0.0 + + '@remirror/core-constants@2.0.2': + resolution: {integrity: sha512-dyHY+sMF0ihPus3O27ODd4+agdHMEmuRdyiZJ2CCWjPV5UFmn17ZbElvk6WOGVE4rdCJKZQCrPV2BcikOMLUGQ==} + + '@remix-run/router@1.19.1': + resolution: {integrity: sha512-S45oynt/WH19bHbIXjtli6QmwNYvaz+vtnubvNpNDvUOoA/OWh6j1OikIP3G+v5GHdxyC6EXoChG3HgYGEUfcg==} + engines: {node: '>=14.0.0'} + + '@rollup/plugin-babel@6.0.4': + resolution: {integrity: sha512-YF7Y52kFdFT/xVSuVdjkV5ZdX/3YtmX0QulG+x0taQOtJdHYzVU61aSSkAgVJ7NOv6qPkIYiJSgSWWN/DM5sGw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + rollup: + optional: true + + '@rollup/plugin-commonjs@25.0.8': + resolution: {integrity: sha512-ZEZWTK5n6Qde0to4vS9Mr5x/0UZoqCxPVR9KRUjU4kA2sO7GEUn1fop0DAwpO6z0Nw/kJON9bDmSxdWxO/TT1A==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-inject@5.0.5': + resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-json@6.1.0': + resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-node-resolve@15.2.3': + resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/plugin-replace@5.0.7': + resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/pluginutils@5.1.0': + resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + + '@rollup/rollup-android-arm-eabi@4.21.0': + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.21.0': + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.21.0': + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.21.0': + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.21.0': + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.21.0': + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.21.0': + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.21.0': + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.21.0': + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.21.0': + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.21.0': + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.21.0': + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} + cpu: [x64] + os: [win32] + + '@sentry-internal/tracing@7.88.0': + resolution: {integrity: sha512-xXQdcYhsS+ourzJHjXNjZC9zakuc97udmpgaXRjEP7FjPYclIx+YXwgFBdHM2kzAwZLFOsEce5dr46GVXUDfZw==} + engines: {node: '>=8'} + + '@sentry/cli-darwin@2.33.1': + resolution: {integrity: sha512-+4/VIx/E1L2hChj5nGf5MHyEPHUNHJ/HoG5RY+B+vyEutGily1c1+DM2bum7RbD0xs6wKLIyup5F02guzSzG8A==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.33.1': + resolution: {integrity: sha512-DbGV56PRKOLsAZJX27Jt2uZ11QfQEMmWB4cIvxkKcFVE+LJP4MVA+MGGRUL6p+Bs1R9ZUuGbpKGtj0JiG6CoXw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd] + + '@sentry/cli-linux-arm@2.33.1': + resolution: {integrity: sha512-zbxEvQju+tgNvzTOt635le4kS/Fbm2XC2RtYbCTs034Vb8xjrAxLnK0z1bQnStUV8BkeBHtsNVrG+NSQDym2wg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd] + + '@sentry/cli-linux-i686@2.33.1': + resolution: {integrity: sha512-g2LS4oPXkPWOfKWukKzYp4FnXVRRSwBxhuQ9eSw2peeb58ZIObr4YKGOA/8HJRGkooBJIKGaAR2mH2Pk1TKaiA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd] + + '@sentry/cli-linux-x64@2.33.1': + resolution: {integrity: sha512-IV3dcYV/ZcvO+VGu9U6kuxSdbsV2kzxaBwWUQxtzxJ+cOa7J8Hn1t0koKGtU53JVZNBa06qJWIcqgl4/pCuKIg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd] + + '@sentry/cli-win32-i686@2.33.1': + resolution: {integrity: sha512-F7cJySvkpzIu7fnLKNHYwBzZYYwlhoDbAUnaFX0UZCN+5DNp/5LwTp37a5TWOsmCaHMZT4i9IO4SIsnNw16/zQ==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.33.1': + resolution: {integrity: sha512-8VyRoJqtb2uQ8/bFRKNuACYZt7r+Xx0k2wXRGTyH05lCjAiVIXn7DiS2BxHFty7M1QEWUCMNsb/UC/x/Cu2wuA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.33.1': + resolution: {integrity: sha512-dUlZ4EFh98VFRPJ+f6OW3JEYQ7VvqGNMa0AMcmvk07ePNeK/GicAWmSQE4ZfJTTl80ul6HZw1kY01fGQOQlVRA==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@7.88.0': + resolution: {integrity: sha512-Jzbb7dcwiCO7kI0a1w+32UzWxbEn2OcZWzp55QMEeAh6nZ/5CXhXwpuHi0tW7doPj+cJdmxMTMu9LqMVfdGkzQ==} + engines: {node: '>=8'} + + '@sentry/core@8.26.0': + resolution: {integrity: sha512-g/tVmTZD4GNbLFf++hKJfBpcCAtduFEMLnbfa9iT/QEZjlmP+EzY+GsH9bafM5VsNe8DiOUp+kJKWtShzlVdBA==} + engines: {node: '>=14.18'} + + '@sentry/node@7.88.0': + resolution: {integrity: sha512-X6Xyh7AEitnWqn1CHQrmsUqRn0GKj/6nPE5VC2DLQfHiFH1Fknrt+csFzDchQ/86awXYwuY4Le5ECEH//X/WzQ==} + engines: {node: '>=8'} + + '@sentry/node@8.26.0': + resolution: {integrity: sha512-N9mNLzicnfGgsq6P10ckPdTzEFusjTC7gpqPopwq5eEMF7g798hH8CcE5o6FZ4iAAR3vWliAR/jgccdoMmJMpQ==} + engines: {node: '>=14.18'} + + '@sentry/opentelemetry@8.26.0': + resolution: {integrity: sha512-HBDheM/+ysfIz8R1OH4bBIxdgD7ZbQkKLJAUXkdAbBcfbpK/CTtwcplbauF5wY7Q+GYvwL/ShuDwvXRfW+gFyQ==} + engines: {node: '>=14.18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/core': ^1.25.1 + '@opentelemetry/instrumentation': ^0.52.1 + '@opentelemetry/sdk-trace-base': ^1.25.1 + '@opentelemetry/semantic-conventions': ^1.25.1 + + '@sentry/profiling-node@1.3.5': + resolution: {integrity: sha512-n2bfEbtLW3WuIMQGyxKJKzBNZOb1JYfMeJQ2WQn/42F++69m+u7T0S3EDGRN0Y//fbt5+r0any+4r3kChRXZkQ==} + engines: {node: '>=8.0.0'} + hasBin: true + peerDependencies: + '@sentry/node': ^7.44.1 + + '@sentry/types@7.88.0': + resolution: {integrity: sha512-FvwvmX1pWAZKicPj4EpKyho8Wm+C4+r5LiepbbBF8oKwSPJdD2QV1fo/LWxsrzNxWOllFIVIXF5Ed3nPYQWpTw==} + engines: {node: '>=8'} + + '@sentry/types@8.26.0': + resolution: {integrity: sha512-zKmh6SWsJh630rpt7a9vP4Cm4m1C2gDTUqUiH565CajCL/4cePpNWYrNwalSqsOSL7B9OrczA1+n6a6XvND+ng==} + engines: {node: '>=14.18'} + + '@sentry/utils@7.88.0': + resolution: {integrity: sha512-ukminfRmdBXTzk49orwJf3Lu3hR60ZRHjE2a4IXwYhyDT6JJgJqgsq1hzGXx0AyFfyS4WhfZ6QUBy7fu3BScZQ==} + engines: {node: '>=8'} + + '@sentry/utils@8.26.0': + resolution: {integrity: sha512-xvlPU9Hd2BlyT+FhWHGNwnxWqdVRk2AHnDtVcW4Ma0Ri5EwS+uy4Jeik5UkSv8C5RVb9VlxFmS8LN3I1MPJsLw==} + engines: {node: '>=14.18'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@styled-system/background@5.1.2': + resolution: {integrity: sha512-jtwH2C/U6ssuGSvwTN3ri/IyjdHb8W9X/g8Y0JLcrH02G+BW3OS8kZdHphF1/YyRklnrKrBT2ngwGUK6aqqV3A==} + + '@styled-system/border@5.1.5': + resolution: {integrity: sha512-JvddhNrnhGigtzWRCVuAHepniyVi6hBlimxWDVAdcTuk7aRn9BYJUwfHslURtwYFsF5FoEs8Zmr1oZq2M1AP0A==} + + '@styled-system/color@5.1.2': + resolution: {integrity: sha512-1kCkeKDZkt4GYkuFNKc7vJQMcOmTl3bJY3YBUs7fCNM6mMYJeT1pViQ2LwBSBJytj3AB0o4IdLBoepgSgGl5MA==} + + '@styled-system/core@5.1.2': + resolution: {integrity: sha512-XclBDdNIy7OPOsN4HBsawG2eiWfCcuFt6gxKn1x4QfMIgeO6TOlA2pZZ5GWZtIhCUqEPTgIBta6JXsGyCkLBYw==} + + '@styled-system/css@5.1.5': + resolution: {integrity: sha512-XkORZdS5kypzcBotAMPBoeckDs9aSZVkvrAlq5K3xP8IMAUek+x2O4NtwoSgkYkWWzVBu6DGdFZLR790QWGG+A==} + + '@styled-system/flexbox@5.1.2': + resolution: {integrity: sha512-6hHV52+eUk654Y1J2v77B8iLeBNtc+SA3R4necsu2VVinSD7+XY5PCCEzBFaWs42dtOEDIa2lMrgL0YBC01mDQ==} + + '@styled-system/grid@5.1.2': + resolution: {integrity: sha512-K3YiV1KyHHzgdNuNlaw8oW2ktMuGga99o1e/NAfTEi5Zsa7JXxzwEnVSDSBdJC+z6R8WYTCYRQC6bkVFcvdTeg==} + + '@styled-system/layout@5.1.2': + resolution: {integrity: sha512-wUhkMBqSeacPFhoE9S6UF3fsMEKFv91gF4AdDWp0Aym1yeMPpqz9l9qS/6vjSsDPF7zOb5cOKC3tcKKOMuDCPw==} + + '@styled-system/position@5.1.2': + resolution: {integrity: sha512-60IZfMXEOOZe3l1mCu6sj/2NAyUmES2kR9Kzp7s2D3P4qKsZWxD1Se1+wJvevb+1TP+ZMkGPEYYXRyU8M1aF5A==} + + '@styled-system/shadow@5.1.2': + resolution: {integrity: sha512-wqniqYb7XuZM7K7C0d1Euxc4eGtqEe/lvM0WjuAFsQVImiq6KGT7s7is+0bNI8O4Dwg27jyu4Lfqo/oIQXNzAg==} + + '@styled-system/space@5.1.2': + resolution: {integrity: sha512-+zzYpR8uvfhcAbaPXhH8QgDAV//flxqxSjHiS9cDFQQUSznXMQmxJegbhcdEF7/eNnJgHeIXv1jmny78kipgBA==} + + '@styled-system/typography@5.1.2': + resolution: {integrity: sha512-BxbVUnN8N7hJ4aaPOd7wEsudeT7CxarR+2hns8XCX1zp0DFfbWw4xYa/olA0oQaqx7F1hzDg+eRaGzAJbF+jOg==} + + '@styled-system/variant@5.1.5': + resolution: {integrity: sha512-Yn8hXAFoWIro8+Q5J8YJd/mP85Teiut3fsGVR9CAxwgNfIAiqlYxsk5iHU7VHJks/0KjL4ATSjmbtCDC/4l1qw==} + + '@tinymce/tinymce-react@4.3.2': + resolution: {integrity: sha512-wJHZhPf2Mk3yTtdVC/uIGh+kvDgKuTw/qV13uzdChTNo68JI1l7jYMrSQOpyimDyn5LHAw0E1zFByrm1WHAVeA==} + peerDependencies: + react: ^18.0.0 || ^17.0.1 || ^16.7.0 + react-dom: ^18.0.0 || ^17.0.1 || ^16.7.0 + + '@tiptap/core@2.1.13': + resolution: {integrity: sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==} + peerDependencies: + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-blockquote@2.6.5': + resolution: {integrity: sha512-lKg/8UfsToG0GycizXGqFlA4/ptB3KumM8ch3MBKRLqy/yViu4oXpbTCqE9sqx/WNUYiriPrvkQnBW10LfFIJQ==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-bold@2.6.5': + resolution: {integrity: sha512-ey78g9YCOQi+qQ58QBFvWJVIXLQ+9isamshO9lzoc4RdtWDm+WuIUmmyoeneRcQixbVlyvOOMUf7PNKdIZHHtg==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-bubble-menu@2.1.13': + resolution: {integrity: sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-bullet-list@2.6.5': + resolution: {integrity: sha512-6r1sc7voURIVU1bl6D9iBOJCHRQphQXHRzE2tLENCHdT8nlgO6wRwAIUVaps8Xkckr+WkLEeHTun+AD6bS+Q3A==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-character-count@2.1.13': + resolution: {integrity: sha512-FxPxS/Uqd4MgndInxXOcgNd225541Nsk1lT5e2uNTSNiQnG7dj7cSFG5KXGcSGLpGGt6e/E28WR6KLV+0/u+WA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-code-block@2.6.5': + resolution: {integrity: sha512-kV8VAerd3z23zv6vZSVkq0JJs0emzWb3KyrLsiUuhR1Yj+zgcxer3zw4IJlmDeDhp6qIXK/qTgHzNcxS+fV4Rw==} + peerDependencies: + '@tiptap/core': ^2.6.5 + '@tiptap/pm': ^2.6.5 + + '@tiptap/extension-code@2.1.13': + resolution: {integrity: sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-document@2.1.13': + resolution: {integrity: sha512-wLwiTWsVmZTGIE5duTcHRmW4ulVxNW4nmgfpk95+mPn1iKyNGtrVhGWleLhBlTj+DWXDtcfNWZgqZkZNzhkqYQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-dropcursor@2.6.5': + resolution: {integrity: sha512-4Kh/TseGVSwt4eoZ6EcFZiCxhK3wSrUUTwltxdeNQVsCYG1jBfflOhIyy41fMC8N73KlnaLjQXsCvesUNx/X2Q==} + peerDependencies: + '@tiptap/core': ^2.6.5 + '@tiptap/pm': ^2.6.5 + + '@tiptap/extension-floating-menu@2.1.13': + resolution: {integrity: sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-gapcursor@2.6.5': + resolution: {integrity: sha512-ga6bSmvcd0YuM6xKMg4E8YzzIPWbT9oZOIM2euNLPCZHDlIeUeNewbNa9exPotg1GZJIrYO52dKvOSJ+U0dVqA==} + peerDependencies: + '@tiptap/core': ^2.6.5 + '@tiptap/pm': ^2.6.5 + + '@tiptap/extension-hard-break@2.6.5': + resolution: {integrity: sha512-5DcI6hDm3pw5I1jWwzNo/tx/2Nx+as4Nl6Stk3tJO1WPKCWPWouyR62EHyzhgMqcPFKRUWtWpeHag2rGDoY4Bw==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-heading@2.1.13': + resolution: {integrity: sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-history@2.6.5': + resolution: {integrity: sha512-zDCXiVKfqii0D+Q9lu65skW3+4Jqzicge+sw42YBQp4H7jXLJC55QoLuctwhl4iGXliiWnobRpotTPdaUXYhoA==} + peerDependencies: + '@tiptap/core': ^2.6.5 + '@tiptap/pm': ^2.6.5 + + '@tiptap/extension-horizontal-rule@2.6.5': + resolution: {integrity: sha512-NzbbzR9VQ0YY/NbjiRxuk7k1M0GfCx327I/TXc7/0YTQ2Am3QvOtrnpwQsM4P9920yhc6QT65ZP63LXcJFkiBg==} + peerDependencies: + '@tiptap/core': ^2.6.5 + '@tiptap/pm': ^2.6.5 + + '@tiptap/extension-image@2.1.13': + resolution: {integrity: sha512-7oVAos+BU4KR/zQsfltrd8hgIxKxyxZ19dhwb1BJI2Nt3Mnx+yFPRlRSehID6RT9dYqgW4UW5d6vh/3HQcYYYw==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-italic@2.6.5': + resolution: {integrity: sha512-g+OC1KcgKu3xhaydTRDcw/Ydr+EEAVLelmtwNILv5UfypFDvcYZRQNqF5/m2ZJ6kjtXQQ8whC3ddMGUgxs29Bg==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-link@2.1.13': + resolution: {integrity: sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-list-item@2.6.5': + resolution: {integrity: sha512-Ks/m2spl3t3pX8W23H1clq0CQ2cGrLKdPxpSn3DAbZxYjT3SF7jpJaG3e+MKKh84PcjY0Xa3FextuLFRSLlgOw==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-ordered-list@2.6.5': + resolution: {integrity: sha512-brTZiwS3Lg3bFXCJABfJ1UOLiX08BNnWw/mOBYuKsnBvIPJQpJ98C1galnX77ihsjFtAUdVdm7xlwcX2q5x8Yg==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-paragraph@2.6.5': + resolution: {integrity: sha512-RGevQMVpqTxuU9Gz2G4STOVcqoP9i9Fc0QurM/B0mDjs5onzCCJLd6qIqxuT7WfFYILe8q3QIu8KB+XGmvmobQ==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-strike@2.6.5': + resolution: {integrity: sha512-ehA++vHPMmLNhfjKFDHJR6FAh3wziIfehaZShuvkjlF7mryTa19y7KJem+8d0wv2w5AwoFOMBJmC7EBXyG0boQ==} + peerDependencies: + '@tiptap/core': ^2.6.5 + + '@tiptap/extension-table-cell@2.1.13': + resolution: {integrity: sha512-30pyVt2PxGAk8jmsXKxDheql8K/xIRA9FiDo++kS2Kr6Y7I42/kNPQttJ2W+Q1JdRJvedNfQtziQfKWDRLLCNA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-table-header@2.1.13': + resolution: {integrity: sha512-FwIV5iso5kmpu01QyvrPCjJqZfqxRTjtjMsDyut2uIgx9v5TXk0V5XvMWobx435ANIDJoGTYCMRlIqcgtyqwAQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-table-row@2.1.13': + resolution: {integrity: sha512-27Mb9/oYbiLd+/BUFMhQzRIqMd2Z5j1BZMYsktwtDG8vGdYVlaW257UVaoNR9TmiXyIzd3Dh1mOil8G35+HRHg==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-table@2.1.13': + resolution: {integrity: sha512-yMWt2LqotOsWJhLwFNo8fyTwJNLPtnk+eCUxKLlMXP23mJ/lpF+jvTihhHVVic5GqV9vLYZFU2Tn+5k/Vd5P1w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + + '@tiptap/extension-text-align@2.1.13': + resolution: {integrity: sha512-ZmbGpi5FHGsWyzt+8DceXERr/Vwxhjpm2VKWZyFTVz8uNJVj+/ou196JQJZqxbp5VtKkS7UYujaO++G5eflb0Q==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-text@2.1.13': + resolution: {integrity: sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/extension-typography@2.1.13': + resolution: {integrity: sha512-//90Gzkci4/77CCmdWYyRGTcMUvsQ64jv3mqlL+JqWgLCffMHvWPGKhPMgSzoyHRlAIIACMhxniRtB7HixhTHQ==} + peerDependencies: + '@tiptap/core': ^2.0.0 + + '@tiptap/pm@2.1.13': + resolution: {integrity: sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==} + + '@tiptap/react@2.1.13': + resolution: {integrity: sha512-Dq3f8EtJnpImP3iDtJo+7bulnN9SJZRZcVVzxHXccLcC2MxtmDdlPGZjP+wxO800nd8toSIOd5734fPNf/YcfA==} + peerDependencies: + '@tiptap/core': ^2.0.0 + '@tiptap/pm': ^2.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + + '@tiptap/starter-kit@2.1.13': + resolution: {integrity: sha512-ph/mUR/OwPtPkZ5rNHINxubpABn8fHnvJSdhXFrY/q6SKoaO11NZXgegRaiG4aL7O6Sz4LsZVw6Sm0Ae+GJmrg==} + + '@tsconfig/node-lts@20.1.3': + resolution: {integrity: sha512-m3b7EP2U+h5tNSpaBMfcTuHmHn04wrgRPQQrfKt75YIPq6kPs2153/KfPHdqkEWGx5pEBvS6rnvToT+yTtC1iw==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@tsconfig/node20@20.1.4': + resolution: {integrity: sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg==} + + '@types/chai@4.3.11': + resolution: {integrity: sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==} + + '@types/connect@3.4.36': + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/mysql@2.15.22': + resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==} + + '@types/node@20.16.1': + resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/pg-pool@2.0.4': + resolution: {integrity: sha512-qZAvkv1K3QbmHHFYSNRYPkRjOWRLBYrL4B9c+wG0GSVGBw0NtJwPcgx/DSddeDJvRGMHCEQ4VMEVfuJ/0gZ3XQ==} + + '@types/pg@8.11.6': + resolution: {integrity: sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==} + + '@types/pg@8.6.1': + resolution: {integrity: sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-transition-group@4.4.11': + resolution: {integrity: sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==} + + '@types/react@18.3.4': + resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + + '@types/resolve@1.20.2': + resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/shimmer@1.2.0': + resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} + + '@types/sinon-chai@3.2.12': + resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} + + '@types/sinon@17.0.2': + resolution: {integrity: sha512-Zt6heIGsdqERkxctIpvN5Pv3edgBrhoeb3yHyxffd4InN0AX2SVNKSrhdDZKGQICVOxWP/q4DyhpfPNMSrpIiA==} + + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/use-sync-external-store@0.0.3': + resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + + '@types/validator@13.12.0': + resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} + + '@typescript-eslint/eslint-plugin@6.21.0': + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.21.0': + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.21.0': + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.21.0': + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.21.0': + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.21.0': + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.21.0': + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.21.0': + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitest/coverage-v8@1.6.0': + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + peerDependencies: + vitest: 1.6.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} + engines: {node: '>=0.4.0'} + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + adminjs@7.8.11: + resolution: {integrity: sha512-ytrNi1fUOXgMEnGTnsQrAbR1DFJC75SaR3zWUr+SeemriRv89j7jfk4IFXiyXAd+satsRA+v+pTsizJ3ZuC6rQ==} + engines: {node: '>=16.0.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@8.4.0: + resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} + + axios@1.7.4: + resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + babel-plugin-polyfill-corejs2@0.4.11: + resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.10.6: + resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.2: + resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-styled-components@2.1.4: + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + + catharsis@0.9.0: + resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} + engines: {node: '>= 10'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + commander@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + + cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-box-model@1.2.1: + resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + cssfilter@0.0.10: + resolution: {integrity: sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debug@4.3.6: + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + + dottie@2.0.6: + resolution: {integrity: sha512-iGCHkfUc5kFekGiqhe8B/mdaurD+lakO9txNnTvKtA6PISrw86LgqHvRzWYPyoE2Ph5aMIrCw9/uko6XHTKCwA==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.23.1: + resolution: {integrity: sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==} + engines: {node: '>=18'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-regexp@0.0.1: + resolution: {integrity: sha512-jVgdsYRa7RKxTT6MKNC3gdT+BF0Gfhpel19+HMRZJC2L0PufB0XOBuXBoXj29NKHwuktnAXd1Z1lyiH/8vOTpw==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.1.1: + resolution: {integrity: sha512-WQpV3mSmIobb77s4qiCZu3dBrZZ0rj8ckSfBtRrgNK9Wnh2s3eiaxNTWloz1LJ1WtvqZES/PAI7PLvsrGt/CEA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.16.1: + resolution: {integrity: sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.4.0: + resolution: {integrity: sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.28.1: + resolution: {integrity: sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@2.1.0: + resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} + engines: {node: '>=6'} + + find-my-way@8.2.0: + resolution: {integrity: sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==} + engines: {node: '>=14'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + funtypes@4.2.0: + resolution: {integrity: sha512-DvOtjiKvkeuXGV0O8LQh9quUP3bSOTEQPGv537Sao8kDq2rDbg48UsSJ7wlBLPzR2Mn0pV7cyAiq5pYG1oUyCQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gud@1.0.0: + resolution: {integrity: sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw==} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + html-parse-stringify@3.0.1: + resolution: {integrity: sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + i18next-browser-languagedetector@7.2.1: + resolution: {integrity: sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==} + + i18next-http-backend@2.6.1: + resolution: {integrity: sha512-rCilMAnlEQNeKOZY1+x8wLM5IpYOj10guGvEpeC59tNjj6MMreLIjIW8D1RclhD3ifLwn6d/Y9HEM1RUE6DSog==} + + i18next@22.5.1: + resolution: {integrity: sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-in-the-middle@1.11.0: + resolution: {integrity: sha512-5DimNQGoe0pLUHbR9qK84iWaWjjbsxiqXnw6Qz64+azRgleqv9k2kTt5fw7QsOpmaGYtuxxursnPPsnTKEx10Q==} + + import-in-the-middle@1.7.1: + resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflection@1.13.4: + resolution: {integrity: sha512-6I/HUDeYFfuNCVS3td055BaXBwKYuzw7K3ExVMStBowKo9oOAMJIXIHvdyR3iboTCp1b+1i5DSkIZTcwIktuDw==} + engines: {'0': node >= 0.4.0} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inquirer@9.3.6: + resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} + engines: {node: '>=18'} + + interrogator@2.0.1: + resolution: {integrity: sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-core-module@2.15.0: + resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-module@1.0.0: + resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + + is-reference@1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + js2xmlparser@4.0.2: + resolution: {integrity: sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA==} + + jsdoc@4.0.3: + resolution: {integrity: sha512-Nu7Sf35kXJ1MWDZIMAuATRQTg1iIPdzh7tqJ6jjvaU/GfDf+qi5UV8zJR3Mo+/pYFvm8mzay4+6O5EWigaQBQw==} + engines: {node: '>=12.0.0'} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jw-paginate@1.0.4: + resolution: {integrity: sha512-W0bv782exgCoynUL/egbRpaYwf/r6T6e02H870H5u3hfSgEYrxgz5POwmFF5aApS6iPi6yhZ0VF8IbafNFsntA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw@3.0.0: + resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + light-my-request@5.13.0: + resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + + linkifyjs@4.1.3: + resolution: {integrity: sha512-auMesunaJ8yfkHvK4gfg1K0SaKX/6Wn9g2Aac/NwX+l5VdmFZzo/hdPGxEOETj+ryRa4/fiOPjeeKURSAJx1sg==} + + lint-staged@15.2.9: + resolution: {integrity: sha512-BZAt8Lk3sEnxw7tfxM7jeZlPRuT4M68O0/CwZhhaw6eeWu0Lz5eERE3m386InivXB64fp/mDID452h48tvKlRQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.2.4: + resolution: {integrity: sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==} + engines: {node: '>=18.0.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.reduce@4.6.0: + resolution: {integrity: sha512-6raRe2vxCYBhpBu+B+TtNGUzah+hQjVdu3E17wfusjyrXBka2nBS8OH/gjVZ5PvHOhWmIZTYri09Z6n/QfnNMw==} + + lodash.startswith@4.2.1: + resolution: {integrity: sha512-XClYR1h4/fJ7H+mmCKppbiBmljN/nGs73iq2SjCT9SF4CBPoUHzLvWmH1GtZMhMBZSiRkHXfeA2RY1eIlJ75ww==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + + loglevel-colored-level-prefix@1.0.0: + resolution: {integrity: sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==} + + loglevel@1.9.1: + resolution: {integrity: sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==} + engines: {node: '>= 0.6.0'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.11: + resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-it-anchor@8.6.7: + resolution: {integrity: sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA==} + peerDependencies: + '@types/markdown-it': '*' + markdown-it: '*' + + markdown-it@14.1.0: + resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + hasBin: true + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + mdurl@2.0.0: + resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + + moment-timezone@0.5.45: + resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} + + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-abi@3.67.0: + resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} + engines: {node: '>=10'} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + obuf@1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + + opentelemetry-instrumentation-fetch-node@1.2.3: + resolution: {integrity: sha512-Qb11T7KvoCevMaSeuamcLsAD+pZnavkhDnlVL0kRozfhl42dKG5Q3anUklAFKJZjY3twLR+BnRa6DlwwkIE/+A==} + engines: {node: '>18.0.0'} + peerDependencies: + '@opentelemetry/api': ^1.6.0 + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ora@6.3.1: + resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + orderedmap@2.1.1: + resolution: {integrity: sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + + parameter-reducers@2.1.0: + resolution: {integrity: sha512-aj9V6DUnNbj4YEmVxloPLX9duhklIC+SIOVUrVdaT3WfgEownET+TYg/JsjANQUNGe46dmOCHEKiuycL36cOnw==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + + pg-connection-string@2.6.4: + resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} + + pg-cursor@2.11.0: + resolution: {integrity: sha512-TLCOCtu+rqMarzjUi+/Ffc2DV5ZqO/27y5GqnK9Z3w51rWXMwC8FcO96Uf9/ORo5o+qRXEVJxM9Ts3K2K31MLg==} + peerDependencies: + pg: ^8 + + pg-hstore@2.3.4: + resolution: {integrity: sha512-N3SGs/Rf+xA1M2/n0JBiXFDVMzdekwLZLAO0g7mpDY9ouX+fDI7jS6kTq3JujmYbtNSJ53TJ0q4G98KVZSM4EA==} + engines: {node: '>= 0.8.x'} + + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-numeric@1.0.2: + resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} + engines: {node: '>=4'} + + pg-pool@3.6.2: + resolution: {integrity: sha512-Htjbg8BlwXqSBQ9V8Vjtc+vzf/6fVUuak/3/XXKA9oxZprwW3IMDQTGHP+KDmVL7rtd+R1QjbnCFPuTHm3G4hg==} + peerDependencies: + pg: '>=8.0' + + pg-protocol@1.6.1: + resolution: {integrity: sha512-jPIlvgoD63hrEuihvIg+tJhoGjUsLPn6poJY9N5CnlPd91c2T18T/9zBtLxZSb1EhYxBRoZJtzScCaWlYLtktg==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + + pg-types@4.0.2: + resolution: {integrity: sha512-cRL3JpS3lKMGsKaWndugWQoLOCoP+Cic8oseVcbr0qhPzYD5DWXK+RZ9LY9wxRf7RQia4SCwQlXk0q6FCPrVng==} + engines: {node: '>=10'} + + pg@8.12.0: + resolution: {integrity: sha512-A+LHUSnwnxrnL/tZ+OLfqR1SxLN3c/pgDztZ47Rpbsd4jUytsTtwQo/TLPRzPJMp/1pbhYVhH9cuSZLAajNfjQ==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + + pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-pretty@11.2.2: + resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} + hasBin: true + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + + pino@9.3.2: + resolution: {integrity: sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@3.0.0: + resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} + engines: {node: '>=6'} + + pkg-types@1.1.3: + resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polished@4.3.1: + resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} + engines: {node: '>=10'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} + + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-array@3.0.2: + resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} + engines: {node: '>=12'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-bytea@3.0.0: + resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} + engines: {node: '>= 6'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-date@2.1.0: + resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} + engines: {node: '>=12'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + + postgres-interval@3.0.0: + resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} + engines: {node: '>=12'} + + postgres-range@1.1.4: + resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-eslint@16.2.0: + resolution: {integrity: sha512-GDTSKc62VaLceiaI/qMaKo2oco2CIWtbj4Zr6ckhbTgcBL/uR0d9jkMzh9OtBIT/Z7iBoCB4OHj/aJ5YuNgAuA==} + engines: {node: '>=16.10.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + prosemirror-changeset@2.2.1: + resolution: {integrity: sha512-J7msc6wbxB4ekDFj+n9gTW/jav/p53kdlivvuppHsrZXCaQdVgRghoZbSS3kwrRyAstRVQ4/+u5k7YfLgkkQvQ==} + + prosemirror-collab@1.3.1: + resolution: {integrity: sha512-4SnynYR9TTYaQVXd/ieUvsVV4PDMBzrq2xPUWutHivDuOshZXqQ5rGbZM84HEaXKbLdItse7weMGOUdDVcLKEQ==} + + prosemirror-commands@1.6.0: + resolution: {integrity: sha512-xn1U/g36OqXn2tn5nGmvnnimAj/g1pUx2ypJJIe8WkVX83WyJVC5LTARaxZa2AtQRwntu9Jc5zXs9gL9svp/mg==} + + prosemirror-dropcursor@1.8.1: + resolution: {integrity: sha512-M30WJdJZLyXHi3N8vxN6Zh5O8ZBbQCz0gURTfPmTIBNQ5pxrdU7A58QkNqfa98YEjSAL1HUyyU34f6Pm5xBSGw==} + + prosemirror-gapcursor@1.3.2: + resolution: {integrity: sha512-wtjswVBd2vaQRrnYZaBCbyDqr232Ed4p2QPtRIUK5FuqHYKGWkEwl08oQM4Tw7DOR0FsasARV5uJFvMZWxdNxQ==} + + prosemirror-history@1.4.1: + resolution: {integrity: sha512-2JZD8z2JviJrboD9cPuX/Sv/1ChFng+xh2tChQ2X4bB2HeK+rra/bmJ3xGntCcjhOqIzSDG6Id7e8RJ9QPXLEQ==} + + prosemirror-inputrules@1.4.0: + resolution: {integrity: sha512-6ygpPRuTJ2lcOXs9JkefieMst63wVJBgHZGl5QOytN7oSZs3Co/BYbc3Yx9zm9H37Bxw8kVzCnDsihsVsL4yEg==} + + prosemirror-keymap@1.2.2: + resolution: {integrity: sha512-EAlXoksqC6Vbocqc0GtzCruZEzYgrn+iiGnNjsJsH4mrnIGex4qbLdWWNza3AW5W36ZRrlBID0eM6bdKH4OStQ==} + + prosemirror-markdown@1.13.0: + resolution: {integrity: sha512-UziddX3ZYSYibgx8042hfGKmukq5Aljp2qoBiJRejD/8MH70siQNz5RB1TrdTPheqLMy4aCe4GYNF10/3lQS5g==} + + prosemirror-menu@1.2.4: + resolution: {integrity: sha512-S/bXlc0ODQup6aiBbWVsX/eM+xJgCTAfMq/nLqaO5ID/am4wS0tTCIkzwytmao7ypEtjj39i7YbJjAgO20mIqA==} + + prosemirror-model@1.22.3: + resolution: {integrity: sha512-V4XCysitErI+i0rKFILGt/xClnFJaohe/wrrlT2NSZ+zk8ggQfDH4x2wNK7Gm0Hp4CIoWizvXFP7L9KMaCuI0Q==} + + prosemirror-schema-basic@1.2.3: + resolution: {integrity: sha512-h+H0OQwZVqMon1PNn0AG9cTfx513zgIG2DY00eJ00Yvgb3UD+GQ/VlWW5rcaxacpCGT1Yx8nuhwXk4+QbXUfJA==} + + prosemirror-schema-list@1.4.1: + resolution: {integrity: sha512-jbDyaP/6AFfDfu70VzySsD75Om2t3sXTOdl5+31Wlxlg62td1haUpty/ybajSfJ1pkGadlOfwQq9kgW5IMo1Rg==} + + prosemirror-state@1.4.3: + resolution: {integrity: sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==} + + prosemirror-tables@1.4.0: + resolution: {integrity: sha512-fxryZZkQG12fSCNuZDrYx6Xvo2rLYZTbKLRd8rglOPgNJGMKIS8uvTt6gGC38m7UCu/ENnXIP9pEz5uDaPc+cA==} + + prosemirror-trailing-node@2.0.9: + resolution: {integrity: sha512-YvyIn3/UaLFlFKrlJB6cObvUhmwFNZVhy1Q8OpW/avoTbD/Y7H5EcjK4AZFKhmuS6/N6WkGgt7gWtBWDnmFvHg==} + peerDependencies: + prosemirror-model: ^1.22.1 + prosemirror-state: ^1.4.2 + prosemirror-view: ^1.33.8 + + prosemirror-transform@1.10.0: + resolution: {integrity: sha512-9UOgFSgN6Gj2ekQH5CTDJ8Rp/fnKR2IkYfGdzzp5zQMFsS4zDllLVx/+jGcX86YlACpG7UR5fwAXiWzxqWtBTg==} + + prosemirror-view@1.33.11: + resolution: {integrity: sha512-K0z9oMf6EI2ZifS9yW8PUPjEw2o1ZoFAaNzvcuyfcjIzsU6pJMo3tk9r26MyzEsuGHXZwmKPEmrjgFd78biTGA==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + deprecated: |- + You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. + + (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + raf-schd@4.0.3: + resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} + + react-currency-input-field@3.8.0: + resolution: {integrity: sha512-DKSIjacrvgUDOpuB16b+OVDvp5pbCt+s+RHJgpRZCHNhzg1yBpRUoy4fbnXpeOj0kdbwf5BaXCr2mAtxEujfhg==} + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18.0.0 + + react-datepicker@4.25.0: + resolution: {integrity: sha512-zB7CSi44SJ0sqo8hUQ3BF1saE/knn7u25qEMTO1CQGofY1VAKahO8k9drZtp0cfW1DMfoYLR3uSY1/uMvbEzbg==} + peerDependencies: + react: ^16.9.0 || ^17 || ^18 + react-dom: ^16.9.0 || ^17 || ^18 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-fast-compare@3.2.2: + resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} + + react-feather@2.0.10: + resolution: {integrity: sha512-BLhukwJ+Z92Nmdcs+EMw6dy1Z/VLiJTzEQACDUEnWMClhYnFykJCGWQx+NmwP/qQHGX/5CzQ+TGi8ofg2+HzVQ==} + peerDependencies: + react: '>=16.8.6' + + react-i18next@12.3.1: + resolution: {integrity: sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==} + peerDependencies: + i18next: '>= 19.0.0' + react: '>= 16.8.0' + react-dom: '*' + react-native: '*' + peerDependenciesMeta: + react-dom: + optional: true + react-native: + optional: true + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-onclickoutside@6.13.1: + resolution: {integrity: sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==} + peerDependencies: + react: ^15.5.x || ^16.x || ^17.x || ^18.x + react-dom: ^15.5.x || ^16.x || ^17.x || ^18.x + + react-phone-input-2@2.15.1: + resolution: {integrity: sha512-W03abwhXcwUoq+vUFvC6ch2+LJYMN8qSOiO889UH6S7SyMCQvox/LF3QWt+cZagZrRdi5z2ON3omnjoCUmlaYw==} + peerDependencies: + react: ^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + react-dom: ^16.12.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^20.0.0 || ^21.0.0 + + react-popper@2.3.0: + resolution: {integrity: sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==} + peerDependencies: + '@popperjs/core': ^2.0.0 + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + + react-redux@8.1.3: + resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} + peerDependencies: + '@types/react': ^16.8 || ^17.0 || ^18.0 + '@types/react-dom': ^16.8 || ^17.0 || ^18.0 + react: ^16.8 || ^17.0 || ^18.0 + react-dom: ^16.8 || ^17.0 || ^18.0 + react-native: '>=0.59' + redux: ^4 || ^5.0.0-beta.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + react-dom: + optional: true + react-native: + optional: true + redux: + optional: true + + react-router-dom@6.26.1: + resolution: {integrity: sha512-veut7m41S1fLql4pLhxeSW3jlqs+4MtjRLj0xvuCEXsxusJCbs6I8yn9BxzzDX2XDgafrccY6hwjmd/bL54tFw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.26.1: + resolution: {integrity: sha512-kIwJveZNwp7teQRI5QmwWo39A5bXRyqpH0COKKmPnyD2vBvDwgFXSqDUYtt1h+FEyfnE8eXr7oe0MxRzVwCcvQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react-select@5.8.0: + resolution: {integrity: sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + + react-text-mask@5.5.0: + resolution: {integrity: sha512-SLJlJQxa0uonMXsnXRpv5abIepGmHz77ylQcra0GNd7Jtk4Wj2Mtp85uGQHv1avba2uI8ZvRpIEQPpJKsqRGYw==} + peerDependencies: + react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + redux@4.2.1: + resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + + regenerate-unicode-properties@10.1.1: + resolution: {integrity: sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regenerator-transform@0.15.2: + resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + + regexpu-core@5.3.2: + resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} + engines: {node: '>=4'} + + regjsparser@0.9.1: + resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + hasBin: true + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-in-the-middle@7.4.0: + resolution: {integrity: sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==} + engines: {node: '>=8.6.0'} + + require-relative@0.8.7: + resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==} + + requizzle@0.2.4: + resolution: {integrity: sha512-JRrFk1D4OQ4SqovXOgdav+K8EAhSB/LJZqCz8tbX0KObcdeM15Ss59ozWMBWmmINMagCwmqn4ZNryUGpBsl6Jw==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + retry-as-promised@7.0.4: + resolution: {integrity: sha512-XgmCoxKWkDofwH8WddD0w85ZfqYz+ZHlr5yo+3YUCfycWawU56T5ckWXsScsj5B8tqUcIG67DxXByo3VUgiAdA==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + rollup-plugin-esbuild-minify@1.1.2: + resolution: {integrity: sha512-l8s3ggesd6WVpi7GPQG/X5MMhwg9thEQLRrsjO6X7xQMkKMxmmjm1NTunQid4pcIKcPYJdAkPwSo2vbI2Itf8Q==} + engines: {node: '>= 14.18'} + peerDependencies: + rollup: ^2 || ^3 || ^4 + + rollup-plugin-polyfill-node@0.13.0: + resolution: {integrity: sha512-FYEvpCaD5jGtyBuBFcQImEGmTxDTPbiHjJdrYIp+mFIwgXiXabxvKUK7ZT9P31ozu2Tqm9llYQMRWsfvTMTAOw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 + + rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rope-sequence@1.3.4: + resolution: {integrity: sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + sequelize-pool@7.1.0: + resolution: {integrity: sha512-G9c0qlIWQSK29pR/5U2JF5dDQeqqHRragoyahj/Nx4KOOQ3CPPfzxnfqFPCSB7x5UgjOgnZ61nSxz+fjDpRlJg==} + engines: {node: '>= 10.0.0'} + + sequelize@6.37.3: + resolution: {integrity: sha512-V2FTqYpdZjPy3VQrZvjTPnOoLm0KudCRXfGWp48QwhyPPp2yW8z0p0sCYZd/em847Tl2dVxJJ1DR+hF+O77T7A==} + engines: {node: '>=10.0.0'} + peerDependencies: + ibm_db: '*' + mariadb: '*' + mysql2: '*' + oracledb: '*' + pg: '*' + pg-hstore: '*' + snowflake-sdk: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + ibm_db: + optional: true + mariadb: + optional: true + mysql2: + optional: true + oracledb: + optional: true + pg: + optional: true + pg-hstore: + optional: true + snowflake-sdk: + optional: true + sqlite3: + optional: true + tedious: + optional: true + + set-cookie-parser@2.7.0: + resolution: {integrity: sha512-lXLOiqpkUumhRdFF3k1osNXCy9akgx/dyPZ5p8qAg9seJzXr5ZrlqZuWIMuY6ejOsVLE6flJ5/h3lsn57fQ/PQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shimmer@1.2.1: + resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} + + short-unique-id@5.2.0: + resolution: {integrity: sha512-cMGfwNyfDZ/nzJ2k2M+ClthBIh//GlZl1JEf47Uoa9XR11bz8Pa2T2wQO4bVrRdH48LrIDWJahQziKo3MjhsWg==} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + + sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sqlite@5.1.1: + resolution: {integrity: sha512-oBkezXa2hnkfuJwUo44Hl9hS3er+YFtueifoajrgidvqsJRQFpc5fKoAkAor1O5ZnLoa28GBScfHXs8j0K358Q==} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + styled-components@5.3.9: + resolution: {integrity: sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + styled-system@5.1.5: + resolution: {integrity: sha512-7VoD0o2R3RKzOzPK0jYrVnS8iJdfkKsQJNiLRDjikOpQVqQHns/DXWaPZOH4tIKkhAT7I6wIsy9FWTWh2X3q+A==} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-mask-addons@3.8.0: + resolution: {integrity: sha512-VSZSdc/tKn4zGxgpJ+uNBzoW1t472AoAFIlbw1K7hSNXz0DfSBYDJNRxLqgxOfWw1BY2z6DQpm7g0sYZn5qLpg==} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tiny-invariant@1.3.3: + resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinymce@6.8.4: + resolution: {integrity: sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + tippy.js@6.3.7: + resolution: {integrity: sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toposort-class@1.0.1: + resolution: {integrity: sha512-OsLcGGbYF3rMjPUf8oKktyvCiUxSbqMMS39m33MAjLTC1DVIH6x3WSt63/M77ihI09+Sdfk1AXvfhCEeUmC7mg==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tslib@2.6.3: + resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + + tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript-eslint-language-service@5.0.5: + resolution: {integrity: sha512-b7gWXpwSTqMVKpPX3WttNZEyVAMKs/2jsHKF79H+qaD6mjzCyU5jboJe/lOZgLJD+QRsXCr0GjIVxvl5kI1NMw==} + peerDependencies: + '@typescript-eslint/parser': '>= 5.0.0' + eslint: '>= 8.0.0' + typescript: '>= 4.0.0' + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + + uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + underscore@1.13.7: + resolution: {integrity: sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicode-canonical-property-names-ecmascript@2.0.0: + resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.1.0: + resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.1.0: + resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} + engines: {node: '>=4'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uppercamelcase@3.0.0: + resolution: {integrity: sha512-zTWmRiOJACCdFGWjzye3L5cjSuVdZ/c8C0iHIwVbfORFD8IhGNAO6BOWkZ+fj+SI6/aFbdjGXE6gwPG780H4gQ==} + engines: {node: '>=4'} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + use-isomorphic-layout-effect@1.1.2: + resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + use-memo-one@1.1.3: + resolution: {integrity: sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite@5.4.2: + resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + + vue-eslint-parser@9.4.3: + resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} + engines: {node: ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '>=6.0.0' + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + warning@4.0.3: + resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + + wkx@0.5.0: + resolution: {integrity: sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xmlcreate@2.0.4: + resolution: {integrity: sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg==} + + xss@1.0.15: + resolution: {integrity: sha512-FVdlVVC67WOIPvfOwhoMETV72f6GbW7aOabBC3WxN/oUdoEMDyLz4OgRv5/gck2ZeNqEQu+Tb0kloovXOfpYVg==} + engines: {node: '>= 0.10.0'} + hasBin: true + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + +snapshots: + + '@adminjs/design-system@4.1.1(@babel/core@7.25.2)(@types/react@18.3.4)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1)': + dependencies: + '@hypnosphi/create-react-context': 0.3.1(prop-types@15.8.1)(react@18.3.1) + '@tinymce/tinymce-react': 4.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-bubble-menu': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-character-count': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-code': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-document': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-floating-menu': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-heading': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-image': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-link': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-table': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-table-cell': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-table-header': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-table-row': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-text': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-text-align': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-typography': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/pm': 2.1.13 + '@tiptap/react': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@tiptap/starter-kit': 2.1.13(@tiptap/pm@2.1.13) + date-fns: 2.30.0 + flat: 5.0.2 + hoist-non-react-statics: 3.3.2 + jw-paginate: 1.0.4 + lodash: 4.17.21 + polished: 4.3.1 + react: 18.3.1 + react-currency-input-field: 3.8.0(react@18.3.1) + react-datepicker: 4.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-dom: 18.3.1(react@18.3.1) + react-feather: 2.0.10(react@18.3.1) + react-phone-input-2: 2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-select: 5.8.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-text-mask: 5.5.0(react@18.3.1) + styled-components: 5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + styled-system: 5.1.5 + text-mask-addons: 3.8.0 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - prop-types + - react-is + - supports-color + + '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3)': + dependencies: + adminjs: 7.8.11(@types/react@18.3.4) + escape-regexp: 0.0.1 + sequelize: 6.37.3 + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + + '@babel/compat-data@7.25.2': {} + + '@babel/core@7.25.2': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.0': + dependencies: + '@babel/types': 7.25.2 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-builder-binary-assignment-operator-visitor@7.24.7': + dependencies: + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + regexpu-core: 5.3.2 + semver: 6.3.1 + + '@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + debug: 4.3.6(supports-color@5.5.0) + lodash.debounce: 4.0.8 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + '@babel/helper-member-expression-to-functions@7.24.8': + dependencies: + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': + dependencies: + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-optimise-call-expression@7.24.7': + dependencies: + '@babel/types': 7.25.2 + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-wrap-function': 7.25.0 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-member-expression-to-functions': 7.24.8 + '@babel/helper-optimise-call-expression': 7.24.7 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-skip-transparent-expression-wrappers@7.24.7': + dependencies: + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helper-wrap-function@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/helpers@7.25.0': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + '@babel/parser@7.25.3': + dependencies: + '@babel/types': 7.25.2 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-classes@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.3(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/template': 7.25.0 + + '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-simple-access': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.3(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + + '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + + '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + + '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.2 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + regenerator-transform: 0.15.2 + + '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-plugin-utils': 7.24.8 + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/preset-env@7.25.3(@babel/core@7.25.2)': + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/types': 7.25.2 + esutils: 2.0.3 + + '@babel/preset-react@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-development': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-pure-annotations': 7.24.7(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/preset-typescript@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-validator-option': 7.24.8 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-typescript': 7.25.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + '@babel/register@7.24.6(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.6 + source-map-support: 0.5.21 + + '@babel/regjsgen@0.8.0': {} + + '@babel/runtime@7.25.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + + '@babel/traverse@7.25.3(supports-color@5.5.0)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.0 + '@babel/parser': 7.25.3 + '@babel/template': 7.25.0 + '@babel/types': 7.25.2 + debug: 4.3.6(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.2': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@biomejs/biome@1.8.3': + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.3 + '@biomejs/cli-darwin-x64': 1.8.3 + '@biomejs/cli-linux-arm64': 1.8.3 + '@biomejs/cli-linux-arm64-musl': 1.8.3 + '@biomejs/cli-linux-x64': 1.8.3 + '@biomejs/cli-linux-x64-musl': 1.8.3 + '@biomejs/cli-win32-arm64': 1.8.3 + '@biomejs/cli-win32-x64': 1.8.3 + + '@biomejs/cli-darwin-arm64@1.8.3': + optional: true + + '@biomejs/cli-darwin-x64@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-arm64@1.8.3': + optional: true + + '@biomejs/cli-linux-x64-musl@1.8.3': + optional: true + + '@biomejs/cli-linux-x64@1.8.3': + optional: true + + '@biomejs/cli-win32-arm64@1.8.3': + optional: true + + '@biomejs/cli-win32-x64@1.8.3': + optional: true + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@databases/connection-pool@1.1.0': + dependencies: + '@databases/queue': 1.0.1 + is-promise: 4.0.0 + + '@databases/escape-identifier@1.0.3': + dependencies: + '@databases/validate-unicode': 1.0.0 + + '@databases/lock@2.1.0': + dependencies: + '@databases/queue': 1.0.1 + + '@databases/pg-bulk@1.2.0(@databases/pg@5.5.0(typescript@5.5.4))': + dependencies: + '@databases/pg': 5.5.0(typescript@5.5.4) + + '@databases/pg-config@3.2.0(typescript@5.5.4)': + dependencies: + cosmiconfig: 8.3.6(typescript@5.5.4) + funtypes: 4.2.0 + transitivePeerDependencies: + - typescript + + '@databases/pg-connection-string@1.0.0': {} + + '@databases/pg-data-type-id@3.0.0': {} + + '@databases/pg-errors@1.0.0': {} + + '@databases/pg-schema-cli@4.4.0(typescript@5.5.4)': + dependencies: + '@databases/pg-config': 3.2.0(typescript@5.5.4) + '@databases/pg-schema-introspect': 4.2.0(typescript@5.5.4) + '@databases/pg-schema-print-types': 4.5.0(@databases/pg-schema-introspect@4.2.0(typescript@5.5.4))(typescript@5.5.4) + chalk: 4.1.2 + interrogator: 2.0.1 + is-interactive: 1.0.0 + parameter-reducers: 2.1.0 + transitivePeerDependencies: + - pg-native + - typescript + + '@databases/pg-schema-introspect@4.2.0(typescript@5.5.4)': + dependencies: + '@databases/pg': 5.5.0(typescript@5.5.4) + transitivePeerDependencies: + - pg-native + - typescript + + '@databases/pg-schema-print-types@4.5.0(@databases/pg-schema-introspect@4.2.0(typescript@5.5.4))(typescript@5.5.4)': + dependencies: + '@databases/pg-config': 3.2.0(typescript@5.5.4) + '@databases/pg-data-type-id': 3.0.0 + '@databases/pg-schema-introspect': 4.2.0(typescript@5.5.4) + '@databases/shared-print-types': 1.2.0 + assert-never: 1.3.0 + transitivePeerDependencies: + - typescript + + '@databases/pg-typed@4.4.1(@databases/pg@5.5.0(typescript@5.5.4))': + dependencies: + '@databases/pg': 5.5.0(typescript@5.5.4) + '@databases/pg-bulk': 1.2.0(@databases/pg@5.5.0(typescript@5.5.4)) + + '@databases/pg@5.5.0(typescript@5.5.4)': + dependencies: + '@babel/code-frame': 7.24.7 + '@databases/escape-identifier': 1.0.3 + '@databases/pg-config': 3.2.0(typescript@5.5.4) + '@databases/pg-connection-string': 1.0.0 + '@databases/pg-data-type-id': 3.0.0 + '@databases/pg-errors': 1.0.0 + '@databases/push-to-async-iterable': 3.0.0 + '@databases/shared': 3.1.0 + '@databases/split-sql-query': 1.0.4(@databases/sql@3.3.0) + '@databases/sql': 3.3.0 + assert-never: 1.3.0 + pg: 8.12.0 + pg-cursor: 2.11.0(pg@8.12.0) + transitivePeerDependencies: + - pg-native + - typescript + + '@databases/push-to-async-iterable@3.0.0': + dependencies: + '@databases/queue': 1.0.1 + + '@databases/queue@1.0.1': {} + + '@databases/shared-print-types@1.2.0': + dependencies: + camelcase: 6.3.0 + mkdirp: 1.0.4 + pluralize: 8.0.0 + uppercamelcase: 3.0.0 + + '@databases/shared@3.1.0': + dependencies: + '@databases/connection-pool': 1.1.0 + '@databases/lock': 2.1.0 + '@databases/queue': 1.0.1 + '@databases/split-sql-query': 1.0.4(@databases/sql@3.3.0) + '@databases/sql': 3.3.0 + + '@databases/split-sql-query@1.0.4(@databases/sql@3.3.0)': + dependencies: + '@databases/sql': 3.3.0 + + '@databases/sql@3.3.0': {} + + '@databases/validate-unicode@1.0.0': {} + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/runtime': 7.25.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.1 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.13.1': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.3.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.13.3(@types/react@18.3.4)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.13.1 + '@emotion/serialize': 1.3.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.0 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.4 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.1': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.0 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/unitless@0.7.5': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.0': {} + + '@emotion/weak-memoize@0.4.0': {} + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/aix-ppc64@0.23.1': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.23.1': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-arm@0.23.1': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/android-x64@0.23.1': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.23.1': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.23.1': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.23.1': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.23.1': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.23.1': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-arm@0.23.1': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.23.1': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.23.1': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.23.1': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.23.1': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.23.1': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.23.1': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/linux-x64@0.23.1': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.23.1': + optional: true + + '@esbuild/openbsd-arm64@0.23.1': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.23.1': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.23.1': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.23.1': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.23.1': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@esbuild/win32-x64@0.23.1': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.6(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@fastify/ajv-compiler@3.6.0': + dependencies: + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + fast-uri: 2.4.0 + + '@fastify/error@3.4.1': {} + + '@fastify/fast-json-stringify-compiler@4.3.0': + dependencies: + fast-json-stringify: 5.16.1 + + '@fastify/merge-json-schemas@0.1.1': + dependencies: + fast-deep-equal: 3.1.3 + + '@fastify/sensible@5.6.0': + dependencies: + '@lukeed/ms': 2.0.2 + fast-deep-equal: 3.1.3 + fastify-plugin: 4.5.1 + forwarded: 0.2.0 + http-errors: 2.0.0 + type-is: 1.6.18 + vary: 1.1.2 + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/utils@0.2.7': {} + + '@hello-pangea/dnd@16.6.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.25.0 + css-box-model: 1.2.1 + memoize-one: 6.0.0 + raf-schd: 4.0.3 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-redux: 8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + redux: 4.2.1 + use-memo-one: 1.1.3(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + - react-native + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@hutson/parse-repository-url@3.0.2': {} + + '@hypnosphi/create-react-context@0.3.1(prop-types@15.8.1)(react@18.3.1)': + dependencies: + gud: 1.0.0 + prop-types: 15.8.1 + react: 18.3.1 + warning: 4.0.3 + + '@inquirer/figures@1.0.5': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jsdoc/salty@0.2.8': + dependencies: + lodash: 4.17.21 + + '@lukeed/ms@2.0.2': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@opentelemetry/api-logs@0.52.1': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/instrumentation-connect@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@types/connect': 3.4.36 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.41.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fastify@0.38.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.14.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.42.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.46.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-metrics': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.40.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@types/mysql': 2.15.22 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-nestjs-core@0.39.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.43.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@opentelemetry/sql-common': 0.40.1(@opentelemetry/api@1.9.0) + '@types/pg': 8.6.1 + '@types/pg-pool': 2.0.4 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis-4@0.41.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.36.2 + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.46.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.7.1 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.52.1 + '@types/shimmer': 1.2.0 + import-in-the-middle: 1.11.0 + require-in-the-middle: 7.4.0 + semver: 7.6.3 + shimmer: 1.2.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.36.2': {} + + '@opentelemetry/resources@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/sdk-metrics@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + lodash.merge: 4.6.2 + + '@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + + '@opentelemetry/semantic-conventions@1.25.1': {} + + '@opentelemetry/sql-common@0.40.1(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@popperjs/core@2.11.8': {} + + '@prisma/instrumentation@5.17.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@redux-devtools/extension@3.3.0(redux@4.2.1)': + dependencies: + '@babel/runtime': 7.25.0 + immutable: 4.3.7 + redux: 4.2.1 + + '@remirror/core-constants@2.0.2': {} + + '@remix-run/router@1.19.1': {} + + '@rollup/plugin-babel@6.0.4(@babel/core@7.25.2)(rollup@4.21.0)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + optionalDependencies: + rollup: 4.21.0 + transitivePeerDependencies: + - supports-color + + '@rollup/plugin-commonjs@25.0.8(rollup@4.21.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 8.1.0 + is-reference: 1.2.1 + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.0 + + '@rollup/plugin-inject@5.0.5(rollup@4.21.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + estree-walker: 2.0.2 + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.0 + + '@rollup/plugin-json@6.1.0(rollup@4.21.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + optionalDependencies: + rollup: 4.21.0 + + '@rollup/plugin-node-resolve@15.2.3(rollup@4.21.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + '@types/resolve': 1.20.2 + deepmerge: 4.3.1 + is-builtin-module: 3.2.1 + is-module: 1.0.0 + resolve: 1.22.8 + optionalDependencies: + rollup: 4.21.0 + + '@rollup/plugin-replace@5.0.7(rollup@4.21.0)': + dependencies: + '@rollup/pluginutils': 5.1.0(rollup@4.21.0) + magic-string: 0.30.11 + optionalDependencies: + rollup: 4.21.0 + + '@rollup/pluginutils@5.1.0(rollup@4.21.0)': + dependencies: + '@types/estree': 1.0.5 + estree-walker: 2.0.2 + picomatch: 2.3.1 + optionalDependencies: + rollup: 4.21.0 + + '@rollup/rollup-android-arm-eabi@4.21.0': + optional: true + + '@rollup/rollup-android-arm64@4.21.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.0': + optional: true + + '@rollup/rollup-darwin-x64@4.21.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.0': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.0': + optional: true + + '@sentry-internal/tracing@7.88.0': + dependencies: + '@sentry/core': 7.88.0 + '@sentry/types': 7.88.0 + '@sentry/utils': 7.88.0 + + '@sentry/cli-darwin@2.33.1': + optional: true + + '@sentry/cli-linux-arm64@2.33.1': + optional: true + + '@sentry/cli-linux-arm@2.33.1': + optional: true + + '@sentry/cli-linux-i686@2.33.1': + optional: true + + '@sentry/cli-linux-x64@2.33.1': + optional: true + + '@sentry/cli-win32-i686@2.33.1': + optional: true + + '@sentry/cli-win32-x64@2.33.1': + optional: true + + '@sentry/cli@2.33.1': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.33.1 + '@sentry/cli-linux-arm': 2.33.1 + '@sentry/cli-linux-arm64': 2.33.1 + '@sentry/cli-linux-i686': 2.33.1 + '@sentry/cli-linux-x64': 2.33.1 + '@sentry/cli-win32-i686': 2.33.1 + '@sentry/cli-win32-x64': 2.33.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@7.88.0': + dependencies: + '@sentry/types': 7.88.0 + '@sentry/utils': 7.88.0 + + '@sentry/core@8.26.0': + dependencies: + '@sentry/types': 8.26.0 + '@sentry/utils': 8.26.0 + + '@sentry/node@7.88.0': + dependencies: + '@sentry-internal/tracing': 7.88.0 + '@sentry/core': 7.88.0 + '@sentry/types': 7.88.0 + '@sentry/utils': 7.88.0 + https-proxy-agent: 5.0.1 + transitivePeerDependencies: + - supports-color + + '@sentry/node@8.26.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.41.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fastify': 0.38.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.14.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.42.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.46.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.40.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-nestjs-core': 0.39.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.43.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis-4': 0.41.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@prisma/instrumentation': 5.17.0 + '@sentry/core': 8.26.0 + '@sentry/opentelemetry': 8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1) + '@sentry/types': 8.26.0 + '@sentry/utils': 8.26.0 + import-in-the-middle: 1.11.0 + optionalDependencies: + opentelemetry-instrumentation-fetch-node: 1.2.3(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@sentry/opentelemetry@8.26.0(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.52.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.25.1(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.25.1)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.52.1(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 1.25.1(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + '@sentry/core': 8.26.0 + '@sentry/types': 8.26.0 + '@sentry/utils': 8.26.0 + + '@sentry/profiling-node@1.3.5(@sentry/node@7.88.0)': + dependencies: + '@sentry/node': 7.88.0 + detect-libc: 2.0.3 + node-abi: 3.67.0 + + '@sentry/types@7.88.0': {} + + '@sentry/types@8.26.0': {} + + '@sentry/utils@7.88.0': + dependencies: + '@sentry/types': 7.88.0 + + '@sentry/utils@8.26.0': + dependencies: + '@sentry/types': 8.26.0 + + '@sinclair/typebox@0.27.8': {} + + '@styled-system/background@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/border@5.1.5': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/color@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/core@5.1.2': + dependencies: + object-assign: 4.1.1 + + '@styled-system/css@5.1.5': {} + + '@styled-system/flexbox@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/grid@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/layout@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/position@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/shadow@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/space@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/typography@5.1.2': + dependencies: + '@styled-system/core': 5.1.2 + + '@styled-system/variant@5.1.5': + dependencies: + '@styled-system/core': 5.1.2 + '@styled-system/css': 5.1.5 + + '@tinymce/tinymce-react@4.3.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tinymce: 6.8.4 + + '@tiptap/core@2.1.13(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-blockquote@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-bold@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-bubble-menu@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + tippy.js: 6.3.7 + + '@tiptap/extension-bullet-list@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-character-count@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-code-block@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-code@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-document@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-dropcursor@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-floating-menu@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + tippy.js: 6.3.7 + + '@tiptap/extension-gapcursor@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-hard-break@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-heading@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-history@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-horizontal-rule@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-image@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-italic@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-link@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + linkifyjs: 4.1.3 + + '@tiptap/extension-list-item@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-ordered-list@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-paragraph@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-strike@2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-table-cell@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-table-header@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-table-row@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-table@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + + '@tiptap/extension-text-align@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-text@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/extension-typography@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + + '@tiptap/pm@2.1.13': + dependencies: + prosemirror-changeset: 2.2.1 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.6.0 + prosemirror-dropcursor: 1.8.1 + prosemirror-gapcursor: 1.3.2 + prosemirror-history: 1.4.1 + prosemirror-inputrules: 1.4.0 + prosemirror-keymap: 1.2.2 + prosemirror-markdown: 1.13.0 + prosemirror-menu: 1.2.4 + prosemirror-model: 1.22.3 + prosemirror-schema-basic: 1.2.3 + prosemirror-schema-list: 1.4.1 + prosemirror-state: 1.4.3 + prosemirror-tables: 1.4.0 + prosemirror-trailing-node: 2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.11) + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.11 + + '@tiptap/react@2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-bubble-menu': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-floating-menu': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/pm': 2.1.13 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@tiptap/starter-kit@2.1.13(@tiptap/pm@2.1.13)': + dependencies: + '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13) + '@tiptap/extension-blockquote': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-bold': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-bullet-list': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-code': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-code-block': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-document': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-dropcursor': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-gapcursor': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-hard-break': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-heading': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-history': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-horizontal-rule': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13))(@tiptap/pm@2.1.13) + '@tiptap/extension-italic': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-list-item': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-ordered-list': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-paragraph': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-strike': 2.6.5(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + '@tiptap/extension-text': 2.1.13(@tiptap/core@2.1.13(@tiptap/pm@2.1.13)) + transitivePeerDependencies: + - '@tiptap/pm' + + '@tsconfig/node-lts@20.1.3': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@tsconfig/node20@20.1.4': {} + + '@types/chai@4.3.11': {} + + '@types/connect@3.4.36': + dependencies: + '@types/node': 20.16.1 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.5': {} + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.4 + hoist-non-react-statics: 3.3.2 + + '@types/json-schema@7.0.15': {} + + '@types/linkify-it@5.0.0': {} + + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + + '@types/mdurl@2.0.0': {} + + '@types/minimist@1.2.5': {} + + '@types/ms@0.7.34': {} + + '@types/mysql@2.15.22': + dependencies: + '@types/node': 20.16.1 + + '@types/node@20.16.1': + dependencies: + undici-types: 6.19.8 + + '@types/normalize-package-data@2.4.4': {} + + '@types/parse-json@4.0.2': {} + + '@types/pg-pool@2.0.4': + dependencies: + '@types/pg': 8.11.6 + + '@types/pg@8.11.6': + dependencies: + '@types/node': 20.16.1 + pg-protocol: 1.6.1 + pg-types: 4.0.2 + + '@types/pg@8.6.1': + dependencies: + '@types/node': 20.16.1 + pg-protocol: 1.6.1 + pg-types: 2.2.0 + + '@types/prop-types@15.7.12': {} + + '@types/react-transition-group@4.4.11': + dependencies: + '@types/react': 18.3.4 + + '@types/react@18.3.4': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/resolve@1.20.2': {} + + '@types/semver@7.5.8': {} + + '@types/shimmer@1.2.0': {} + + '@types/sinon-chai@3.2.12': + dependencies: + '@types/chai': 4.3.11 + '@types/sinon': 17.0.2 + + '@types/sinon@17.0.2': + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + + '@types/sinonjs__fake-timers@8.1.5': {} + + '@types/use-sync-external-store@0.0.3': {} + + '@types/validator@13.12.0': {} + + '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + + '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@6.21.0': {} + + '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.6(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.4) + eslint: 8.57.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@6.21.0': + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.0': {} + + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.16.1))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.11 + magicast: 0.3.4 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + test-exclude: 6.0.0 + vitest: 1.6.0(@types/node@20.16.1) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.5.0 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.11 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + abstract-logging@2.0.1: {} + + acorn-import-assertions@1.9.0(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + optional: true + + acorn-import-attributes@1.9.5(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + add-stream@1.0.0: {} + + adminjs@7.8.11(@types/react@18.3.4): + dependencies: + '@adminjs/design-system': 4.1.1(@babel/core@7.25.2)(@types/react@18.3.4)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + '@babel/core': 7.25.2 + '@babel/parser': 7.25.3 + '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.25.2) + '@babel/preset-env': 7.25.3(@babel/core@7.25.2) + '@babel/preset-react': 7.24.7(@babel/core@7.25.2) + '@babel/preset-typescript': 7.24.7(@babel/core@7.25.2) + '@babel/register': 7.24.6(@babel/core@7.25.2) + '@hello-pangea/dnd': 16.6.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@redux-devtools/extension': 3.3.0(redux@4.2.1) + '@rollup/plugin-babel': 6.0.4(@babel/core@7.25.2)(rollup@4.21.0) + '@rollup/plugin-commonjs': 25.0.8(rollup@4.21.0) + '@rollup/plugin-json': 6.1.0(rollup@4.21.0) + '@rollup/plugin-node-resolve': 15.2.3(rollup@4.21.0) + '@rollup/plugin-replace': 5.0.7(rollup@4.21.0) + axios: 1.7.4 + commander: 10.0.1 + flat: 5.0.2 + i18next: 22.5.1 + i18next-browser-languagedetector: 7.2.1 + i18next-http-backend: 2.6.1 + lodash: 4.17.21 + ora: 6.3.1 + prop-types: 15.8.1 + punycode: 2.3.1 + qs: 6.13.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-feather: 2.0.10(react@18.3.1) + react-i18next: 12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-is: 18.3.1 + react-redux: 8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1) + react-router: 6.26.1(react@18.3.1) + react-router-dom: 6.26.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + redux: 4.2.1 + regenerator-runtime: 0.14.1 + rollup: 4.21.0 + rollup-plugin-esbuild-minify: 1.1.2(rollup@4.21.0) + rollup-plugin-polyfill-node: 0.13.0(rollup@4.21.0) + slash: 5.1.0 + uuid: 9.0.1 + xss: 1.0.15 + transitivePeerDependencies: + - '@types/babel__core' + - '@types/react' + - '@types/react-dom' + - debug + - encoding + - react-native + - supports-color + + agent-base@6.0.2: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + + ansi-regex@2.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + arg@4.1.3: {} + + argparse@2.0.1: {} + + array-ify@1.0.0: {} + + array-union@2.1.0: {} + + arrify@1.0.1: {} + + assert-never@1.3.0: {} + + assertion-error@1.1.0: {} + + asynckit@0.4.0: {} + + atomic-sleep@1.0.0: {} + + avvio@8.4.0: + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.17.1 + + axios@1.7.4: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.25.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): + dependencies: + '@babel/compat-data': 7.25.2 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + transitivePeerDependencies: + - supports-color + + babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bl@5.1.0: + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.7.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + cac@6.7.14: {} + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@4.1.0: {} + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001651: {} + + catharsis@0.9.0: + dependencies: + lodash: 4.17.21 + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + chardet@0.7.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + cjs-module-lexer@1.3.1: {} + + classnames@2.5.1: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + + cli-truncate@4.0.0: + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + + cli-width@4.1.0: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + + clone@1.0.4: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colorette@2.0.20: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@10.0.1: {} + + commander@12.1.0: {} + + commander@2.20.3: {} + + common-tags@1.8.2: {} + + commondir@1.0.1: {} + + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + confbox@0.1.7: {} + + conventional-changelog-angular@5.0.13: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-atom@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-codemirror@2.0.8: + dependencies: + q: 1.5.1 + + conventional-changelog-config-spec@2.1.0: {} + + conventional-changelog-conventionalcommits@4.6.3: + dependencies: + compare-func: 2.0.0 + lodash: 4.17.21 + q: 1.5.1 + + conventional-changelog-core@4.2.4: + dependencies: + add-stream: 1.0.0 + conventional-changelog-writer: 5.0.1 + conventional-commits-parser: 3.2.4 + dateformat: 3.0.3 + get-pkg-repo: 4.2.1 + git-raw-commits: 2.0.11 + git-remote-origin-url: 2.0.0 + git-semver-tags: 4.1.1 + lodash: 4.17.21 + normalize-package-data: 3.0.3 + q: 1.5.1 + read-pkg: 3.0.0 + read-pkg-up: 3.0.0 + through2: 4.0.2 + + conventional-changelog-ember@2.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-eslint@3.0.9: + dependencies: + q: 1.5.1 + + conventional-changelog-express@2.0.6: + dependencies: + q: 1.5.1 + + conventional-changelog-jquery@3.0.11: + dependencies: + q: 1.5.1 + + conventional-changelog-jshint@2.0.9: + dependencies: + compare-func: 2.0.0 + q: 1.5.1 + + conventional-changelog-preset-loader@2.3.4: {} + + conventional-changelog-writer@5.0.1: + dependencies: + conventional-commits-filter: 2.0.7 + dateformat: 3.0.3 + handlebars: 4.7.8 + json-stringify-safe: 5.0.1 + lodash: 4.17.21 + meow: 8.1.2 + semver: 6.3.1 + split: 1.0.1 + through2: 4.0.2 + + conventional-changelog@3.1.25: + dependencies: + conventional-changelog-angular: 5.0.13 + conventional-changelog-atom: 2.0.8 + conventional-changelog-codemirror: 2.0.8 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-changelog-core: 4.2.4 + conventional-changelog-ember: 2.0.9 + conventional-changelog-eslint: 3.0.9 + conventional-changelog-express: 2.0.6 + conventional-changelog-jquery: 3.0.11 + conventional-changelog-jshint: 2.0.9 + conventional-changelog-preset-loader: 2.3.4 + + conventional-commits-filter@2.0.7: + dependencies: + lodash.ismatch: 4.4.0 + modify-values: 1.0.1 + + conventional-commits-parser@3.2.4: + dependencies: + JSONStream: 1.3.5 + is-text-path: 1.0.1 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + conventional-recommended-bump@6.1.0: + dependencies: + concat-stream: 2.0.0 + conventional-changelog-preset-loader: 2.3.4 + conventional-commits-filter: 2.0.7 + conventional-commits-parser: 3.2.4 + git-raw-commits: 2.0.11 + git-semver-tags: 4.1.1 + meow: 8.1.2 + q: 1.5.1 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.6.0: {} + + core-js-compat@3.38.1: + dependencies: + browserslist: 4.23.3 + + core-util-is@1.0.3: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@8.3.6(typescript@5.5.4): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.5.4 + + create-require@1.1.1: {} + + crelt@1.0.6: {} + + cross-fetch@4.0.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-box-model@1.2.1: + dependencies: + tiny-invariant: 1.3.3 + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + cssfilter@0.0.10: {} + + csstype@3.1.3: {} + + dargs@7.0.0: {} + + date-fns@2.30.0: + dependencies: + '@babel/runtime': 7.25.0 + + dateformat@3.0.3: {} + + dateformat@4.6.3: {} + + debug@4.3.6(supports-color@5.5.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-is@0.1.4: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + detect-indent@6.1.0: {} + + detect-libc@2.0.3: {} + + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + + diff@4.0.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.25.0 + csstype: 3.1.3 + + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + + dotgitignore@2.1.0: + dependencies: + find-up: 3.0.0 + minimatch: 3.1.2 + + dottie@2.0.6: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.13: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@4.5.0: {} + + environment@1.1.0: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + + esbuild@0.23.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.23.1 + '@esbuild/android-arm': 0.23.1 + '@esbuild/android-arm64': 0.23.1 + '@esbuild/android-x64': 0.23.1 + '@esbuild/darwin-arm64': 0.23.1 + '@esbuild/darwin-x64': 0.23.1 + '@esbuild/freebsd-arm64': 0.23.1 + '@esbuild/freebsd-x64': 0.23.1 + '@esbuild/linux-arm': 0.23.1 + '@esbuild/linux-arm64': 0.23.1 + '@esbuild/linux-ia32': 0.23.1 + '@esbuild/linux-loong64': 0.23.1 + '@esbuild/linux-mips64el': 0.23.1 + '@esbuild/linux-ppc64': 0.23.1 + '@esbuild/linux-riscv64': 0.23.1 + '@esbuild/linux-s390x': 0.23.1 + '@esbuild/linux-x64': 0.23.1 + '@esbuild/netbsd-x64': 0.23.1 + '@esbuild/openbsd-arm64': 0.23.1 + '@esbuild/openbsd-x64': 0.23.1 + '@esbuild/sunos-x64': 0.23.1 + '@esbuild/win32-arm64': 0.23.1 + '@esbuild/win32-ia32': 0.23.1 + '@esbuild/win32-x64': 0.23.1 + + escalade@3.1.2: {} + + escape-regexp@0.0.1: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@9.1.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-prettier@5.1.1(eslint-config-prettier@9.1.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.1.1): + dependencies: + eslint: 8.57.0 + prettier: 3.1.1 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@8.57.0) + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.11.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.6(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 3.4.3 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + event-target-shim@5.0.1: {} + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-content-type-parse@1.1.0: {} + + fast-copy@3.0.2: {} + + fast-decode-uri-component@1.0.1: {} + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + fast-json-stable-stringify@2.1.0: {} + + fast-json-stringify@5.16.1: + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + fast-deep-equal: 3.1.3 + fast-uri: 2.4.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.4.1 + + fast-levenshtein@2.0.6: {} + + fast-querystring@1.1.2: + dependencies: + fast-decode-uri-component: 1.0.1 + + fast-redact@3.5.0: {} + + fast-safe-stringify@2.1.1: {} + + fast-uri@2.4.0: {} + + fast-uri@3.0.1: {} + + fastify-plugin@4.5.1: {} + + fastify@4.28.1: + dependencies: + '@fastify/ajv-compiler': 3.6.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.4.0 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.1 + find-my-way: 8.2.0 + light-my-request: 5.13.0 + pino: 9.3.2 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.4.1 + secure-json-parse: 2.7.0 + semver: 7.6.3 + toad-cache: 3.7.0 + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@2.1.0: + dependencies: + commondir: 1.0.1 + make-dir: 2.1.0 + pkg-dir: 3.0.0 + + find-my-way@8.2.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + + find-root@1.1.0: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + follow-redirects@1.15.6: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + forwarded@0.2.0: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + funtypes@4.2.0: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-pkg-repo@4.2.1: + dependencies: + '@hutson/parse-repository-url': 3.0.2 + hosted-git-info: 4.1.0 + through2: 2.0.5 + yargs: 16.2.0 + + get-stream@8.0.1: {} + + get-tsconfig@4.7.6: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-raw-commits@2.0.11: + dependencies: + dargs: 7.0.0 + lodash: 4.17.21 + meow: 8.1.2 + split2: 3.2.2 + through2: 4.0.2 + + git-remote-origin-url@2.0.0: + dependencies: + gitconfiglocal: 1.0.0 + pify: 2.3.0 + + git-semver-tags@4.1.1: + dependencies: + meow: 8.1.2 + semver: 6.3.1 + + gitconfiglocal@1.0.0: + dependencies: + ini: 1.3.8 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + gud@1.0.0: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.2 + + hard-rejection@2.1.0: {} + + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + help-me@5.0.0: {} + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@2.8.9: {} + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + html-escaper@2.0.2: {} + + html-parse-stringify@3.0.1: + dependencies: + void-elements: 3.1.0 + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + human-signals@5.0.0: {} + + husky@8.0.3: {} + + i18next-browser-languagedetector@7.2.1: + dependencies: + '@babel/runtime': 7.25.0 + + i18next-http-backend@2.6.1: + dependencies: + cross-fetch: 4.0.0 + transitivePeerDependencies: + - encoding + + i18next@22.5.1: + dependencies: + '@babel/runtime': 7.25.0 + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.2: {} + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-in-the-middle@1.11.0: + dependencies: + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) + cjs-module-lexer: 1.3.1 + module-details-from-path: 1.0.3 + + import-in-the-middle@1.7.1: + dependencies: + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) + cjs-module-lexer: 1.3.1 + module-details-from-path: 1.0.3 + optional: true + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflection@1.13.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inquirer@9.3.6: + dependencies: + '@inquirer/figures': 1.0.5 + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + external-editor: 3.1.0 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + + interrogator@2.0.1: + dependencies: + inquirer: 9.3.6 + + ipaddr.js@1.9.1: {} + + is-arrayish@0.2.1: {} + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-core-module@2.15.0: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-fullwidth-code-point@4.0.0: {} + + is-fullwidth-code-point@5.0.0: + dependencies: + get-east-asian-width: 1.2.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-module@1.0.0: {} + + is-number@7.0.0: {} + + is-obj@2.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + + is-promise@4.0.0: {} + + is-reference@1.2.1: + dependencies: + '@types/estree': 1.0.5 + + is-stream@3.0.0: {} + + is-text-path@1.0.1: + dependencies: + text-extensions: 1.9.0 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + isarray@1.0.0: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.6(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + js2xmlparser@4.0.2: + dependencies: + xmlcreate: 2.0.4 + + jsdoc@4.0.3: + dependencies: + '@babel/parser': 7.25.3 + '@jsdoc/salty': 0.2.8 + '@types/markdown-it': 14.1.2 + bluebird: 3.7.2 + catharsis: 0.9.0 + escape-string-regexp: 2.0.0 + js2xmlparser: 4.0.2 + klaw: 3.0.0 + markdown-it: 14.1.0 + markdown-it-anchor: 8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0) + marked: 4.3.0 + mkdirp: 1.0.4 + requizzle: 0.2.4 + strip-json-comments: 3.1.1 + underscore: 1.13.7 + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-better-errors@1.0.2: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-ref-resolver@1.0.1: + dependencies: + fast-deep-equal: 3.1.3 + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@2.2.3: {} + + jsonparse@1.3.1: {} + + jw-paginate@1.0.4: {} + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + klaw@3.0.0: + dependencies: + graceful-fs: 4.2.11 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + light-my-request@5.13.0: + dependencies: + cookie: 0.6.0 + process-warning: 3.0.0 + set-cookie-parser: 2.7.0 + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + linkify-it@5.0.0: + dependencies: + uc.micro: 2.1.0 + + linkifyjs@4.1.3: {} + + lint-staged@15.2.9: + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 + lilconfig: 3.1.2 + listr2: 8.2.4 + micromatch: 4.0.7 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.5.0 + transitivePeerDependencies: + - supports-color + + listr2@8.2.4: + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.1 + pkg-types: 1.1.3 + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.debounce@4.0.8: {} + + lodash.ismatch@4.4.0: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.reduce@4.6.0: {} + + lodash.startswith@4.2.1: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@5.1.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + log-update@6.1.0: + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + + loglevel-colored-level-prefix@1.0.0: + dependencies: + chalk: 1.1.3 + loglevel: 1.9.1 + + loglevel@1.9.1: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.11: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.25.3 + '@babel/types': 7.25.2 + source-map-js: 1.2.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + + make-dir@4.0.0: + dependencies: + semver: 7.6.3 + + make-error@1.3.6: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-it-anchor@8.6.7(@types/markdown-it@14.1.2)(markdown-it@14.1.0): + dependencies: + '@types/markdown-it': 14.1.2 + markdown-it: 14.1.0 + + markdown-it@14.1.0: + dependencies: + argparse: 2.0.1 + entities: 4.5.0 + linkify-it: 5.0.0 + mdurl: 2.0.0 + punycode.js: 2.3.1 + uc.micro: 2.1.0 + + marked@4.3.0: {} + + mdurl@2.0.0: {} + + media-typer@0.3.0: {} + + memoize-one@6.0.0: {} + + meow@8.1.2: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.7: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + mimic-function@5.0.1: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.3: + dependencies: + brace-expansion: 2.0.1 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp@1.0.4: {} + + mlly@1.7.1: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.1.3 + ufo: 1.5.4 + + modify-values@1.0.1: {} + + module-details-from-path@1.0.3: {} + + moment-timezone@0.5.45: + dependencies: + moment: 2.30.1 + + moment@2.30.1: {} + + ms@2.1.2: {} + + mute-stream@1.0.0: {} + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-abi@3.67.0: + dependencies: + semver: 7.6.3 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.18: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.15.0 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + object-assign@4.1.1: {} + + object-inspect@1.13.2: {} + + obuf@1.1.2: {} + + on-exit-leak-free@2.1.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + + opentelemetry-instrumentation-fetch-node@1.2.3(@opentelemetry/api@1.9.0): + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.46.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.25.1 + transitivePeerDependencies: + - supports-color + optional: true + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ora@6.3.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + strip-ansi: 7.1.0 + wcwidth: 1.0.1 + + orderedmap@2.1.1: {} + + os-tmpdir@1.0.2: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-try@1.0.0: {} + + p-try@2.2.0: {} + + package-json-from-dist@1.0.0: {} + + parameter-reducers@2.1.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.7 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@3.0.0: + dependencies: + pify: 3.0.0 + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + pg-cloudflare@1.1.1: + optional: true + + pg-connection-string@2.6.4: {} + + pg-cursor@2.11.0(pg@8.12.0): + dependencies: + pg: 8.12.0 + + pg-hstore@2.3.4: + dependencies: + underscore: 1.13.7 + + pg-int8@1.0.1: {} + + pg-numeric@1.0.2: {} + + pg-pool@3.6.2(pg@8.12.0): + dependencies: + pg: 8.12.0 + + pg-protocol@1.6.1: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + + pg-types@4.0.2: + dependencies: + pg-int8: 1.0.1 + pg-numeric: 1.0.2 + postgres-array: 3.0.2 + postgres-bytea: 3.0.0 + postgres-date: 2.1.0 + postgres-interval: 3.0.0 + postgres-range: 1.1.4 + + pg@8.12.0: + dependencies: + pg-connection-string: 2.6.4 + pg-pool: 3.6.2(pg@8.12.0) + pg-protocol: 1.6.1 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + + pgpass@1.0.5: + dependencies: + split2: 4.2.0 + + picocolors@1.0.1: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pify@2.3.0: {} + + pify@3.0.0: {} + + pify@4.0.1: {} + + pino-abstract-transport@1.2.0: + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + pino-pretty@11.2.2: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 4.0.1 + strip-json-comments: 3.1.1 + + pino-std-serializers@6.2.2: {} + + pino-std-serializers@7.0.0: {} + + pino@8.21.0: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + + pino@9.3.2: + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.1.0 + + pirates@4.0.6: {} + + pkg-dir@3.0.0: + dependencies: + find-up: 3.0.0 + + pkg-types@1.1.3: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + + pluralize@8.0.0: {} + + polished@4.3.1: + dependencies: + '@babel/runtime': 7.25.0 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.41: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + + postgres-array@2.0.0: {} + + postgres-array@3.0.2: {} + + postgres-bytea@1.0.0: {} + + postgres-bytea@3.0.0: + dependencies: + obuf: 1.1.2 + + postgres-date@1.0.7: {} + + postgres-date@2.1.0: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + + postgres-interval@3.0.0: {} + + postgres-range@1.1.4: {} + + prelude-ls@1.2.1: {} + + prettier-eslint@16.2.0: + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + common-tags: 1.8.2 + dlv: 1.1.3 + eslint: 8.57.0 + indent-string: 4.0.0 + lodash.merge: 4.6.2 + loglevel-colored-level-prefix: 1.0.0 + prettier: 3.1.1 + pretty-format: 29.7.0 + require-relative: 0.8.7 + typescript: 5.5.4 + vue-eslint-parser: 9.4.3(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@3.1.1: {} + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process-warning@4.0.0: {} + + process@0.11.10: {} + + progress@2.0.3: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + prosemirror-changeset@2.2.1: + dependencies: + prosemirror-transform: 1.10.0 + + prosemirror-collab@1.3.1: + dependencies: + prosemirror-state: 1.4.3 + + prosemirror-commands@1.6.0: + dependencies: + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + + prosemirror-dropcursor@1.8.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.11 + + prosemirror-gapcursor@1.3.2: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.11 + + prosemirror-history@1.4.1: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.11 + rope-sequence: 1.3.4 + + prosemirror-inputrules@1.4.0: + dependencies: + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + + prosemirror-keymap@1.2.2: + dependencies: + prosemirror-state: 1.4.3 + w3c-keyname: 2.2.8 + + prosemirror-markdown@1.13.0: + dependencies: + markdown-it: 14.1.0 + prosemirror-model: 1.22.3 + + prosemirror-menu@1.2.4: + dependencies: + crelt: 1.0.6 + prosemirror-commands: 1.6.0 + prosemirror-history: 1.4.1 + prosemirror-state: 1.4.3 + + prosemirror-model@1.22.3: + dependencies: + orderedmap: 2.1.1 + + prosemirror-schema-basic@1.2.3: + dependencies: + prosemirror-model: 1.22.3 + + prosemirror-schema-list@1.4.1: + dependencies: + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + + prosemirror-state@1.4.3: + dependencies: + prosemirror-model: 1.22.3 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.11 + + prosemirror-tables@1.4.0: + dependencies: + prosemirror-keymap: 1.2.2 + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + prosemirror-view: 1.33.11 + + prosemirror-trailing-node@2.0.9(prosemirror-model@1.22.3)(prosemirror-state@1.4.3)(prosemirror-view@1.33.11): + dependencies: + '@remirror/core-constants': 2.0.2 + escape-string-regexp: 4.0.0 + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-view: 1.33.11 + + prosemirror-transform@1.10.0: + dependencies: + prosemirror-model: 1.22.3 + + prosemirror-view@1.33.11: + dependencies: + prosemirror-model: 1.22.3 + prosemirror-state: 1.4.3 + prosemirror-transform: 1.10.0 + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + proxy-from-env@1.1.0: {} + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode.js@2.3.1: {} + + punycode@2.3.1: {} + + q@1.5.1: {} + + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + + queue-microtask@1.2.3: {} + + quick-format-unescaped@4.0.4: {} + + quick-lru@4.0.1: {} + + raf-schd@4.0.3: {} + + react-currency-input-field@3.8.0(react@18.3.1): + dependencies: + react: 18.3.1 + + react-datepicker@4.25.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@popperjs/core': 2.11.8 + classnames: 2.5.1 + date-fns: 2.30.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-onclickoutside: 6.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-popper: 2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-fast-compare@3.2.2: {} + + react-feather@2.0.10(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + + react-i18next@12.3.1(i18next@22.5.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.0 + html-parse-stringify: 3.0.1 + i18next: 22.5.1 + react: 18.3.1 + optionalDependencies: + react-dom: 18.3.1(react@18.3.1) + + react-is@16.13.1: {} + + react-is@18.3.1: {} + + react-onclickoutside@6.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-phone-input-2@2.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + classnames: 2.5.1 + lodash.debounce: 4.0.8 + lodash.memoize: 4.1.2 + lodash.reduce: 4.6.0 + lodash.startswith: 4.2.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react-popper@2.3.0(@popperjs/core@2.11.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@popperjs/core': 2.11.8 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-fast-compare: 3.2.2 + warning: 4.0.3 + + react-redux@8.1.3(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(redux@4.2.1): + dependencies: + '@babel/runtime': 7.25.0 + '@types/hoist-non-react-statics': 3.3.5 + '@types/use-sync-external-store': 0.0.3 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-is: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.4 + react-dom: 18.3.1(react@18.3.1) + redux: 4.2.1 + + react-router-dom@6.26.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.26.1(react@18.3.1) + + react-router@6.26.1(react@18.3.1): + dependencies: + '@remix-run/router': 1.19.1 + react: 18.3.1 + + react-select@5.8.0(@types/react@18.3.4)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.0 + '@emotion/cache': 11.13.1 + '@emotion/react': 11.13.3(@types/react@18.3.4)(react@18.3.1) + '@floating-ui/dom': 1.6.10 + '@types/react-transition-group': 4.4.11 + memoize-one: 6.0.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + use-isomorphic-layout-effect: 1.1.2(@types/react@18.3.4)(react@18.3.1) + transitivePeerDependencies: + - '@types/react' + - supports-color + + react-text-mask@5.5.0(react@18.3.1): + dependencies: + prop-types: 15.8.1 + react: 18.3.1 + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.25.0 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-pkg-up@3.0.0: + dependencies: + find-up: 2.1.0 + read-pkg: 3.0.0 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@3.0.0: + dependencies: + load-json-file: 4.0.0 + normalize-package-data: 2.5.0 + path-type: 3.0.0 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-stream@4.5.2: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + real-require@0.2.0: {} + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + redux@4.2.1: + dependencies: + '@babel/runtime': 7.25.0 + + regenerate-unicode-properties@10.1.1: + dependencies: + regenerate: 1.4.2 + + regenerate@1.4.2: {} + + regenerator-runtime@0.14.1: {} + + regenerator-transform@0.15.2: + dependencies: + '@babel/runtime': 7.25.0 + + regexpu-core@5.3.2: + dependencies: + '@babel/regjsgen': 0.8.0 + regenerate: 1.4.2 + regenerate-unicode-properties: 10.1.1 + regjsparser: 0.9.1 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.1.0 + + regjsparser@0.9.1: + dependencies: + jsesc: 0.5.0 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-in-the-middle@7.4.0: + dependencies: + debug: 4.3.6(supports-color@5.5.0) + module-details-from-path: 1.0.3 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + require-relative@0.8.7: {} + + requizzle@0.2.4: + dependencies: + lodash: 4.17.21 + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + + ret@0.4.3: {} + + retry-as-promised@7.0.4: {} + + reusify@1.0.4: {} + + rfdc@1.4.1: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + + rollup-plugin-esbuild-minify@1.1.2(rollup@4.21.0): + dependencies: + esbuild: 0.23.1 + rollup: 4.21.0 + + rollup-plugin-polyfill-node@0.13.0(rollup@4.21.0): + dependencies: + '@rollup/plugin-inject': 5.0.5(rollup@4.21.0) + rollup: 4.21.0 + + rollup@4.21.0: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 + fsevents: 2.3.3 + + rope-sequence@1.3.4: {} + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.3 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex2@3.1.0: + dependencies: + ret: 0.4.3 + + safe-stable-stringify@2.4.3: {} + + safer-buffer@2.1.2: {} + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + secure-json-parse@2.7.0: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.3: {} + + sequelize-pool@7.1.0: {} + + sequelize@6.37.3: + dependencies: + '@types/debug': 4.1.12 + '@types/validator': 13.12.0 + debug: 4.3.6(supports-color@5.5.0) + dottie: 2.0.6 + inflection: 1.13.4 + lodash: 4.17.21 + moment: 2.30.1 + moment-timezone: 0.5.45 + pg-connection-string: 2.6.4 + retry-as-promised: 7.0.4 + semver: 7.6.3 + sequelize-pool: 7.1.0 + toposort-class: 1.0.1 + uuid: 8.3.2 + validator: 13.12.0 + wkx: 0.5.0 + transitivePeerDependencies: + - supports-color + + set-cookie-parser@2.7.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + shimmer@1.2.1: {} + + short-unique-id@5.2.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.2 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@5.0.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + + slice-ansi@7.1.0: + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + + sonic-boom@3.8.1: + dependencies: + atomic-sleep: 1.0.0 + + sonic-boom@4.0.1: + dependencies: + atomic-sleep: 1.0.0 + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + split2@4.2.0: {} + + split@1.0.1: + dependencies: + through: 2.3.8 + + sqlite@5.1.1: {} + + stackback@0.0.2: {} + + standard-version@9.5.0: + dependencies: + chalk: 2.4.2 + conventional-changelog: 3.1.25 + conventional-changelog-config-spec: 2.1.0 + conventional-changelog-conventionalcommits: 4.6.3 + conventional-recommended-bump: 6.1.0 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + dotgitignore: 2.1.0 + figures: 3.2.0 + find-up: 5.0.0 + git-semver-tags: 4.1.1 + semver: 7.6.3 + stringify-package: 1.0.1 + yargs: 16.2.0 + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + stdin-discarder@0.1.0: + dependencies: + bl: 5.1.0 + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-package@1.0.1: {} + + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): + dependencies: + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/traverse': 7.25.3(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.0 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + styled-system@5.1.5: + dependencies: + '@styled-system/background': 5.1.2 + '@styled-system/border': 5.1.5 + '@styled-system/color': 5.1.2 + '@styled-system/core': 5.1.2 + '@styled-system/flexbox': 5.1.2 + '@styled-system/grid': 5.1.2 + '@styled-system/layout': 5.1.2 + '@styled-system/position': 5.1.2 + '@styled-system/shadow': 5.1.2 + '@styled-system/space': 5.1.2 + '@styled-system/typography': 5.1.2 + '@styled-system/variant': 5.1.5 + object-assign: 4.1.1 + + stylis@4.2.0: {} + + supports-color@2.0.0: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.3 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-extensions@1.9.0: {} + + text-mask-addons@3.8.0: {} + + text-table@0.2.0: {} + + thread-stream@2.7.0: + dependencies: + real-require: 0.2.0 + + thread-stream@3.1.0: + dependencies: + real-require: 0.2.0 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + through@2.3.8: {} + + tiny-invariant@1.3.3: {} + + tinybench@2.9.0: {} + + tinymce@6.8.4: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + tippy.js@6.3.7: + dependencies: + '@popperjs/core': 2.11.8 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toad-cache@3.7.0: {} + + toidentifier@1.0.1: {} + + toposort-class@1.0.1: {} + + tr46@0.0.3: {} + + trim-newlines@3.0.1: {} + + ts-api-utils@1.3.0(typescript@5.5.4): + dependencies: + typescript: 5.5.4 + + ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.16.1 + acorn: 8.12.1 + acorn-walk: 8.3.3 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tslib@2.6.3: {} + + tsx@4.7.0: + dependencies: + esbuild: 0.19.12 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.1.0: {} + + type-fest@0.18.1: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typedarray@0.0.6: {} + + typescript-eslint-language-service@5.0.5(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4): + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + typescript: 5.5.4 + + typescript@5.5.4: {} + + uc.micro@2.1.0: {} + + ufo@1.5.4: {} + + uglify-js@3.19.2: + optional: true + + underscore@1.13.7: {} + + undici-types@6.19.8: {} + + unicode-canonical-property-names-ecmascript@2.0.0: {} + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.0 + unicode-property-aliases-ecmascript: 2.1.0 + + unicode-match-property-value-ecmascript@2.1.0: {} + + unicode-property-aliases-ecmascript@2.1.0: {} + + update-browserslist-db@1.1.0(browserslist@4.23.3): + dependencies: + browserslist: 4.23.3 + escalade: 3.1.2 + picocolors: 1.0.1 + + uppercamelcase@3.0.0: + dependencies: + camelcase: 4.1.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + use-isomorphic-layout-effect@1.1.2(@types/react@18.3.4)(react@18.3.1): + dependencies: + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.4 + + use-memo-one@1.1.3(react@18.3.1): + dependencies: + react: 18.3.1 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validator@13.12.0: {} + + vary@1.1.2: {} + + vite-node@1.6.0(@types/node@20.16.1): + dependencies: + cac: 6.7.14 + debug: 4.3.6(supports-color@5.5.0) + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.4.2(@types/node@20.16.1) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + vite@5.4.2(@types/node@20.16.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.41 + rollup: 4.21.0 + optionalDependencies: + '@types/node': 20.16.1 + fsevents: 2.3.3 + + vitest@1.6.0(@types/node@20.16.1): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.5.0 + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.11 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.2(@types/node@20.16.1) + vite-node: 1.6.0(@types/node@20.16.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 20.16.1 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + + void-elements@3.1.0: {} + + vue-eslint-parser@9.4.3(eslint@8.57.0): + dependencies: + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + lodash: 4.17.21 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + w3c-keyname@2.2.8: {} + + warning@4.0.3: + dependencies: + loose-envify: 1.4.0 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + wkx@0.5.0: + dependencies: + '@types/node': 20.16.1 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrap-ansi@9.0.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xmlcreate@2.0.4: {} + + xss@1.0.15: + dependencies: + commander: 2.20.3 + cssfilter: 0.0.10 + + xtend@4.0.2: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.5.0: {} + + yargs-parser@20.2.9: {} + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + yoctocolors-cjs@2.1.2: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 000000000..18ec407ef --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'packages/*' diff --git a/server.ts b/server.ts index dfc63871b..d965869de 100755 --- a/server.ts +++ b/server.ts @@ -16,10 +16,10 @@ import { exit } from "node:process"; import Sentry from "@sentry/node"; -import { getGatewayServer } from "./packages/gateway/src/GatewayServer.js"; -import { verifyLegacyCipherSupport } from "./packages/gateway/src/encryption.js"; -import { getServerConfiguration } from "./packages/shared/Configuration.js"; -import { getServerLogger } from "./packages/shared/log.js"; +import { getGatewayServer } from "rusty-motors-gateway"; +import { verifyLegacyCipherSupport } from "rusty-motors-gateway"; +import { getServerConfiguration } from "rusty-motors-shared"; +import { getServerLogger } from "rusty-motors-shared"; const coreLogger = getServerLogger({ module: "core", @@ -33,7 +33,7 @@ try { } Sentry.init({ - dsn: process.env.SENTRY_DSN, + dsn: process.env['SENTRY_DSN'], // We recommend adjusting this value in production, or using tracesSampler // for finer control @@ -42,28 +42,28 @@ Sentry.init({ }); try { - if (typeof process.env.EXTERNAL_HOST === "undefined") { + if (typeof process.env['EXTERNAL_HOST'] === "undefined") { console.error("Please set EXTERNAL_HOST"); process.exit(1); } - if (typeof process.env.CERTIFICATE_FILE === "undefined") { + if (typeof process.env['CERTIFICATE_FILE'] === "undefined") { console.error("Please set CERTIFICATE_FILE"); process.exit(1); } - if (typeof process.env.PRIVATE_KEY_FILE === "undefined") { + if (typeof process.env['PRIVATE_KEY_FILE'] === "undefined") { console.error("Please set PRIVATE_KEY_FILE"); process.exit(1); } - if (typeof process.env.PUBLIC_KEY_FILE === "undefined") { + if (typeof process.env['PUBLIC_KEY_FILE'] === "undefined") { console.error("Please set PUBLIC_KEY_FILE"); process.exit(1); } const config = getServerConfiguration({ - host: process.env.EXTERNAL_HOST, - certificateFile: process.env.CERTIFICATE_FILE, - privateKeyFile: process.env.PRIVATE_KEY_FILE, - publicKeyFile: process.env.PUBLIC_KEY_FILE, - logLevel: process.env.LOG_LEVEL, + host: process.env['EXTERNAL_HOST'], + certificateFile: process.env['CERTIFICATE_FILE'], + privateKeyFile: process.env['PRIVATE_KEY_FILE'], + publicKeyFile: process.env['PUBLIC_KEY_FILE'], + logLevel: process.env['LOG_LEVEL'] || "info", }); const appLog = getServerLogger({ diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 000000000..e28e57199 --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,81 @@ +{ + "compilerOptions": { + "incremental": true, + "target": "es2016", + "module": "NodeNext", + "noImplicitOverride": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitThis": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "noPropertyAccessFromIndexSignature": true, + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "inlineSources": true, + "outDir": "./dist", + "rootDir": ".", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true, + "verbatimModuleSyntax": true, + "isolatedModules": true + }, + "files": [], + "references": [ + { + "path": "packages/cli/tsconfig.json" + }, + { + "path": "packages/core/tsconfig.json" + }, + { + "path": "packages/database/tsconfig.json" + }, + { + "path": "packages/gateway/tsconfig.json" + }, + { + "path": "packages/interfaces/tsconfig.json" + }, + { + "path": "packages/lobby/tsconfig.json" + }, + { + "path": "packages/login/tsconfig.json" + }, + { + "path": "packages/mcots/tsconfig.json" + }, + { + "path": "packages/nps/tsconfig.json" + }, + { + "path": "packages/patch/tsconfig.json" + }, + { + "path": "packages/persona/tsconfig.json" + }, + { + "path": "packages/shard/tsconfig.json" + }, + { + "path": "packages/shared/tsconfig.json" + }, + { + "path": "packages/shared-packets/tsconfig.json" + }, + { + "path": "packages/transactions/tsconfig.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 2319a54af..df0975821 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,16 +1,8 @@ { - "compilerOptions": { + "extends": "./tsconfig.base.json", + "compilerOptions": { "incremental": true, - "target": "es2016", - "module": "NodeNext", - "noImplicitOverride": true, - "declaration": true, - "declarationMap": true, - "outDir": "./dist", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true + "composite": true }, - "include": ["src", "test", "packages", "server.ts"] + "include": ["server.ts"] } From abf00b1ea01629661a7745be0ac356296154f640 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 17:51:55 -0400 Subject: [PATCH 07/84] chore: wip - pnpm start works --- packages/database/package.json | 3 +-- packages/database/test/Database.test.ts | 13 +----------- packages/gateway/package.json | 6 +++--- packages/gateway/test/encryption.test.ts | 2 -- packages/patch/package.json | 3 --- packages/patch/test/PatchServer.test.ts | 2 -- packages/shared/package.json | 3 +-- packages/transactions/package.json | 3 ++- .../test/_getPlayerRaceHistory.test.ts | 2 -- .../transactions/test/clientConnect.test.ts | 2 -- packages/transactions/test/login.test.ts | 2 -- .../transactions/test/trackingPing.test.ts | 8 +------ pnpm-lock.yaml | 21 +------------------ server.ts | 9 ++++---- 14 files changed, 15 insertions(+), 64 deletions(-) diff --git a/packages/database/package.json b/packages/database/package.json index c56ff0eb4..904658ad3 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -25,8 +25,7 @@ "@sentry/node": "^8.0.0", "@types/pg": "^8.11.6", "pg": "^8.11.5", - "pg-hstore": "^2.3.4", - "vitest": "^1.6.0" + "pg-hstore": "^2.3.4" }, "directories": { "test": "test" diff --git a/packages/database/test/Database.test.ts b/packages/database/test/Database.test.ts index fcb7a25f3..db7351c2b 100644 --- a/packages/database/test/Database.test.ts +++ b/packages/database/test/Database.test.ts @@ -1,6 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; -import { P } from "vitest/dist/reporters-5f784f42.js"; -import { mockPino } from "../../../test/factoryMocks.js"; +import { describe, expect, it } from "vitest"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; import { Database } from "../src/DatabaseManager.js"; @@ -8,12 +6,6 @@ import { Database } from "../src/DatabaseManager.js"; describe("Database", () => { it("returns the same instance", () => { // arrange - vi.mock("pino", async () => { - const actual = await vi.importActual("pino"); - return { - ...(actual as P), - }; - }); const log = getServerLogger({}); // act const instance1 = Database.getInstance(log); @@ -25,7 +17,6 @@ describe("Database", () => { describe("fetchSessionKeyByCustomerId", () => { it("throws when session key is not found", async () => { // arrange - mockPino(); const log = getServerLogger({}); const instance = Database.getInstance(log); const customerId = 1234; @@ -44,7 +35,6 @@ describe("Database", () => { describe("fetchSessionKeyByConnectionId", () => { it("throws when session key is not found", async () => { // arrange - mockPino(); const log = getServerLogger({}); const instance = Database.getInstance(log); const connectionId = "1234"; @@ -65,7 +55,6 @@ describe("Database", () => { describe("updateUser", () => { it("returns successfully when passed a valid user record", async () => { // arrange - mockPino(); const log = getServerLogger({}); const instance = Database.getInstance(log); const userRecord = { diff --git a/packages/gateway/package.json b/packages/gateway/package.json index 5a45457ba..50149eeda 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -12,7 +12,8 @@ "check": "tsc", "lint": "eslint .", "format": "npm prettier --write .", - "test": "vitest run --coverage" + "test": "echo \"Error: no test specified\" && exit 0", + "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" }, "keywords": [], "author": "", @@ -20,8 +21,7 @@ "dependencies": { "@fastify/sensible": "^5.5.0", "@sentry/node": "^8.0.0", - "fastify": "^4.25.2", - "vitest": "^1.6.0" + "fastify": "^4.25.2" }, "directories": { "test": "test" diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index 2c465e6c8..db1a6ea42 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -1,7 +1,6 @@ import { randomUUID } from "node:crypto"; import { Socket } from "node:net"; import { beforeAll, beforeEach, describe, expect, it, test, vi } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; import { McosEncryption, State, @@ -22,7 +21,6 @@ let testSocket2: Socket; describe("Encryption", () => { beforeAll(() => { - mockPino(); testSave = (state?: State) => { if (typeof state === "undefined") { throw new ServerError("State not defined"); diff --git a/packages/patch/package.json b/packages/patch/package.json index e8c8af6e7..7cf18538f 100644 --- a/packages/patch/package.json +++ b/packages/patch/package.json @@ -17,9 +17,6 @@ "keywords": [], "author": "", "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - }, "directories": { "test": "test" }, diff --git a/packages/patch/test/PatchServer.test.ts b/packages/patch/test/PatchServer.test.ts index 00a6c2b1f..5207a8786 100644 --- a/packages/patch/test/PatchServer.test.ts +++ b/packages/patch/test/PatchServer.test.ts @@ -1,12 +1,10 @@ import { describe, expect, it, vi } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; import { CastanetResponse, PatchServer } from "../src/PatchServer.js"; describe("PatchServer", () => { it("should return the hard-coded value that tells the client there are no updates or patches", () => { // Arrange - mockPino(); const log = getServerLogger({ module: "Patch" }); const patchServer = PatchServer.getInstance(log); const request = { diff --git a/packages/shared/package.json b/packages/shared/package.json index a9dbcf93e..cea67010c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -24,8 +24,7 @@ "dependencies": { "fastify": "^4.27.0", "pino": "^9.0.0", - "pino-pretty": "^11.0.0", - "vitest": "^1.6.0" + "pino-pretty": "^11.0.0" }, "directories": { "test": "test" diff --git a/packages/transactions/package.json b/packages/transactions/package.json index caa8e9d1c..338419f87 100644 --- a/packages/transactions/package.json +++ b/packages/transactions/package.json @@ -12,7 +12,8 @@ "check": "tsc", "lint": "eslint .", "format": "npx prettier --write .", - "test": "vitest run --coverage" + "test": "echo \"Error: no test specified\" && exit 0", + "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" }, "keywords": [], "author": "", diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.ts b/packages/transactions/test/_getPlayerRaceHistory.test.ts index bb067ac73..5edac4f7b 100644 --- a/packages/transactions/test/_getPlayerRaceHistory.test.ts +++ b/packages/transactions/test/_getPlayerRaceHistory.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; @@ -11,7 +10,6 @@ describe("_getPlayerRaceHistory", () => { 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, ]); - mockPino(); const result = await _getPlayerRaceHistory({ connectionId: "0", packet: incomingMessage, diff --git a/packages/transactions/test/clientConnect.test.ts b/packages/transactions/test/clientConnect.test.ts index a7bb51eff..564a8d02c 100644 --- a/packages/transactions/test/clientConnect.test.ts +++ b/packages/transactions/test/clientConnect.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { State } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; @@ -18,7 +17,6 @@ describe("clientConnect", () => { const incomingMessage = new TClientConnectMessage(); incomingMessage._customerId = customerId; - mockPino(); const log = getServerLogger({}); const state: State = { encryptions: {}, diff --git a/packages/transactions/test/login.test.ts b/packages/transactions/test/login.test.ts index d19f1bb01..326394dfa 100644 --- a/packages/transactions/test/login.test.ts +++ b/packages/transactions/test/login.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "vitest"; -import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { login } from "../src/login.js"; @@ -11,7 +10,6 @@ describe("login", () => { const incomingMessage = new OldServerMessage(); const imcommingBuffer = Buffer.from(JSON.stringify(incomingMessage)); incomingMessage.setBuffer(imcommingBuffer); - mockPino(); const log = getServerLogger({}); // act diff --git a/packages/transactions/test/trackingPing.test.ts b/packages/transactions/test/trackingPing.test.ts index edaa44e1e..c748ec0c7 100644 --- a/packages/transactions/test/trackingPing.test.ts +++ b/packages/transactions/test/trackingPing.test.ts @@ -1,5 +1,4 @@ import { describe, expect, test, vi } from "vitest"; -import { P } from "vitest/dist/reporters-5f784f42.js"; import { getServerLogger } from "../../shared/log.js"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { trackingPing } from "../src/trackingPing.js"; @@ -8,12 +7,7 @@ describe("trackingPing", () => { test("does not return a message", async () => { // arrange const inboundMessage = new OldServerMessage(); - vi.mock("pino", async () => { - const actual = await vi.importActual("pino"); - return { - ...(actual as P), - }; - }); + const log = getServerLogger({}); // act diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 847064ec2..127f6195d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -157,9 +157,6 @@ importers: pg-hstore: specifier: ^2.3.4 version: 2.3.4 - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) packages/gateway: dependencies: @@ -172,9 +169,6 @@ importers: fastify: specifier: ^4.25.2 version: 4.28.1 - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) packages/mcots: dependencies: @@ -194,17 +188,7 @@ importers: specifier: ^5.0.3 version: 5.2.0 - packages/patch: - dependencies: - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) - - packages/shard: - dependencies: - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) + packages/patch: {} packages/shared: dependencies: @@ -217,9 +201,6 @@ importers: pino-pretty: specifier: ^11.0.0 version: 11.2.2 - vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) packages/shared-packets: {} diff --git a/server.ts b/server.ts index d965869de..0c0eab3bc 100755 --- a/server.ts +++ b/server.ts @@ -16,10 +16,11 @@ import { exit } from "node:process"; import Sentry from "@sentry/node"; -import { getGatewayServer } from "rusty-motors-gateway"; -import { verifyLegacyCipherSupport } from "rusty-motors-gateway"; -import { getServerConfiguration } from "rusty-motors-shared"; -import { getServerLogger } from "rusty-motors-shared"; +import { getGatewayServer } from "./packages/gateway/src/GatewayServer.js"; +import { verifyLegacyCipherSupport } from "./packages/gateway/src/encryption.js"; +import { getServerConfiguration } from "./packages/shared/Configuration.js"; +import { getServerLogger } from "./packages/shared/log.js"; + const coreLogger = getServerLogger({ module: "core", From b968a22c8eab830838d751b110ae508bed71bcee Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:03:17 -0400 Subject: [PATCH 08/84] chore: Update node.yml workflow to use pnpm instead of npm for installation and testing --- .github/workflows/node.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index bc661075f..b8c9e00fc 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -26,8 +26,8 @@ jobs: node-version: 22.x - name: Install and test run: | - npm install - npm test + pnpm install + pnpm test env: CODECOV_UPLOAD_BUNDLE_TOKEN: ${{ secrets.CODECOV_UPLOAD_BUNDLE_TOKEN }} - name: Codecov From ea4bc073b0c27f5d0cb34b8fde1fe5f0e6e17fca Mon Sep 17 00:00:00 2001 From: Molly Crendraven Date: Wed, 21 Aug 2024 18:08:06 -0400 Subject: [PATCH 09/84] chore(ci): switch to pnpm --- .github/workflows/node.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index b8c9e00fc..1473fb5c2 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -24,6 +24,8 @@ jobs: uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4 with: node-version: 22.x + - name: Setup pnpm + uses: pnpm/action-setup@v4.0.0 - name: Install and test run: | pnpm install @@ -54,4 +56,4 @@ jobs: - uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b # v4 with: name: coverage_${{ matrix.node-version }} - path: coverage \ No newline at end of file + path: coverage From 7eafd53c2b5aede7e9b3aeaeac6b5194fdaf5cf8 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:11:19 -0400 Subject: [PATCH 10/84] chore: Update package.json to use pnpm@9.7.1 --- package.json | 3 ++- pnpm-lock.yaml | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 929915fc5..887f19bb4 100644 --- a/package.json +++ b/package.json @@ -90,5 +90,6 @@ "hooks": { "pre-commit": "lint-staged" } - } + }, + "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 127f6195d..0006e4afb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -190,6 +190,12 @@ importers: packages/patch: {} + packages/shard: + dependencies: + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) + packages/shared: dependencies: fastify: From c4c59a6b7895ee5c9e2e8487540695c3aab688f0 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:12:25 -0400 Subject: [PATCH 11/84] chore: Add .deepsource.toml configuration file --- .deepsource.toml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .deepsource.toml diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 000000000..e924044c2 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,10 @@ +version = 1 + +[[analyzers]] +name = "javascript" + + [analyzers.meta] + environment = [ + "nodejs", + "vitest" + ] \ No newline at end of file From 4341bd5ab3ebd63dab85a2cd7470bd3cb4a4dd31 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:14:39 -0400 Subject: [PATCH 12/84] chore: Update test:all script to use pnpm for running tests --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 887f19bb4..d7ba993f1 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "lint:all": "npm run lint --workspaces --if-present", "format:all": "npm run format --workspaces --if-present", "test": "npm run test:all", - "test:all": "npm run test --workspaces --if-present", + "test:all": "pnpm run -r --stream test", "start:dev": "tsx --openssl-legacy-provider server.ts", "types:db": "npm --workspace rusty-motors-database run types:db", "migrate": "pg-migrations apply --directory migrations " From 52d0b8b79e6b56a8a4fa74a3ec3c8b4894826fb7 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:18:32 -0400 Subject: [PATCH 13/84] test: Add unit tests for ErrorNoKey class --- packages/mcots/test/ErrorNoKey.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 packages/mcots/test/ErrorNoKey.test.ts diff --git a/packages/mcots/test/ErrorNoKey.test.ts b/packages/mcots/test/ErrorNoKey.test.ts new file mode 100644 index 000000000..185aad170 --- /dev/null +++ b/packages/mcots/test/ErrorNoKey.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import { ErrorNoKey } from '../errors/ErrorNoKey'; + +describe('ErrorNoKey', () => { + it('should have default message "No key provided" when no message is given', () => { + const error = new ErrorNoKey(); + expect(error.message).toBe("No key provided"); + }); + + it('should use the provided message', () => { + const customMessage = "Custom error message"; + const error = new ErrorNoKey(customMessage); + expect(error.message).toBe(customMessage); + }); +}); \ No newline at end of file From c72b6569053bdc5fd24dda2e1275bdba0b2cc0bd Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:22:28 -0400 Subject: [PATCH 14/84] chore: Update tsconfig.json to extend base configuration --- packages/shared-packets/tsconfig.json | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/shared-packets/tsconfig.json b/packages/shared-packets/tsconfig.json index a1200ebec..4b0695a95 100644 --- a/packages/shared-packets/tsconfig.json +++ b/packages/shared-packets/tsconfig.json @@ -1,14 +1,7 @@ { - "compilerOptions": { - "target": "es2016", - "module": "commonjs", - "outDir": "./dist", - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "skipLibCheck": true, - "noImplicitAny": true, - "strictNullChecks": true, - "noUnusedLocals": true + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true } } From 4858b6dfd2a5b356065dc89cfc95fda529413ecd Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:22:42 -0400 Subject: [PATCH 15/84] chore: Update npm dependency to use npx for running prettier --- packages/gateway/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/gateway/package.json b/packages/gateway/package.json index 50149eeda..d452d968a 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -11,7 +11,7 @@ "scripts": { "check": "tsc", "lint": "eslint .", - "format": "npm prettier --write .", + "format": "npx prettier --write .", "test": "echo \"Error: no test specified\" && exit 0", "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" }, From 5e38ddf6b95a502ae4330371e73a5b2e959dae6b Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:23:05 -0400 Subject: [PATCH 16/84] chore: Update package.json to use pnpm for running check, lint, and format scripts --- package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index d7ba993f1..00f091514 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "scripts": { "clean": "rm --verbose -rf **/node_modules node_modules", "start": "make start", - "check:all": "npm run check --workspaces --if-present", - "lint:all": "npm run lint --workspaces --if-present", - "format:all": "npm run format --workspaces --if-present", + "check:all": "pnpm run -r --stream check", + "lint:all": "pnpm run -r --stream lint", + "format:all": "pnpm run -r --stream format", "test": "npm run test:all", "test:all": "pnpm run -r --stream test", "start:dev": "tsx --openssl-legacy-provider server.ts", From 01fae3c2acef5cb9600065e94c9327d8f33b5869 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:23:40 -0400 Subject: [PATCH 17/84] chore: Update web.ts to use consistent indentation and formatting --- packages/gateway/src/web.ts | 190 ++++++++++++++++++------------------ 1 file changed, 96 insertions(+), 94 deletions(-) diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index 0b261a0a8..f6eed1d72 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -17,9 +17,9 @@ import { CastanetResponse } from "../../patch/src/PatchServer.js"; import { generateShardList } from "../../shard/src/ShardServer.js"; import { - handleGetCert, - handleGetKey, - handleGetRegistry, + handleGetCert, + handleGetKey, + handleGetRegistry, } from "../../shard/src/index.js"; import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; @@ -30,95 +30,97 @@ import { ServerError } from "../../shared/errors/ServerError.js"; * @param {import("fastify").FastifyInstance} webServer The web server */ export function addWebRoutes(webServer: import("fastify").FastifyInstance) { - webServer.addContentTypeParser("*", (_request, payload, done) => { - let data = ""; - payload.on("data", (chunk) => { - data += chunk; - }); - payload.on("end", () => { - done(null, data); - }); - }); - - webServer.get("/", async (_request, reply) => { - return reply.send("Hello, world!"); - }); - - webServer.post( - "/games/EA_Seattle/MotorCity/UpdateInfo", - (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }, - ); - - webServer.post("/games/EA_Seattle/MotorCity/NPS", (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }); - - webServer.post("/games/EA_Seattle/MotorCity/MCO", (_request, reply) => { - const response = CastanetResponse; - reply.header(response.header.type, response.header.value); - return reply.send(response.body); - }); - - interface IQuerystring { - username: string; - password: string; - } - - interface IHeaders {} - - interface IReply {} - - webServer.get<{ - Querystring: IQuerystring; - Headers: IHeaders; - Reply: IReply; - }>("/AuthLogin", async (request, reply) => { - const username = request.query.username; - - if (username === "new") { - return reply.send( - "Valid=TRUE\nTicket=5213dee3a6bcdb133373b2d4f3b9962758", - ); - } - - return reply.send("Valid=TRUE\nTicket=d316cd2dd6bf870893dfbaaf17f965884e"); - }); - - webServer.get("/ShardList/", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(generateShardList(config.host)); - }); - - webServer.get("/cert", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetCert(config)); - }); - - webServer.get("/key", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetKey(config)); - }); - - webServer.get("/registry", (_request, reply) => { - const config = getServerConfiguration({}); - if (typeof config.host === "undefined") { - throw new ServerError("No host defined in config"); - } - return reply.send(handleGetRegistry(config)); - }); + webServer.addContentTypeParser("*", (_request, payload, done) => { + let data = ""; + payload.on("data", (chunk) => { + data += chunk; + }); + payload.on("end", () => { + done(null, data); + }); + }); + + webServer.get("/", async (_request, reply) => { + return reply.send("Hello, world!"); + }); + + webServer.post( + "/games/EA_Seattle/MotorCity/UpdateInfo", + (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }, + ); + + webServer.post("/games/EA_Seattle/MotorCity/NPS", (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }); + + webServer.post("/games/EA_Seattle/MotorCity/MCO", (_request, reply) => { + const response = CastanetResponse; + reply.header(response.header.type, response.header.value); + return reply.send(response.body); + }); + + interface IQuerystring { + username: string; + password: string; + } + + interface IHeaders {} + + interface IReply {} + + webServer.get<{ + Querystring: IQuerystring; + Headers: IHeaders; + Reply: IReply; + }>("/AuthLogin", async (request, reply) => { + const username = request.query.username; + + if (username === "new") { + return reply.send( + "Valid=TRUE\nTicket=5213dee3a6bcdb133373b2d4f3b9962758", + ); + } + + return reply.send( + "Valid=TRUE\nTicket=d316cd2dd6bf870893dfbaaf17f965884e", + ); + }); + + webServer.get("/ShardList/", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(generateShardList(config.host)); + }); + + webServer.get("/cert", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetCert(config)); + }); + + webServer.get("/key", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetKey(config)); + }); + + webServer.get("/registry", (_request, reply) => { + const config = getServerConfiguration({}); + if (typeof config.host === "undefined") { + throw new ServerError("No host defined in config"); + } + return reply.send(handleGetRegistry(config)); + }); } From 7aaff91cc80a746a58f5a2af04ead22c12256737 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:29:23 -0400 Subject: [PATCH 18/84] chore: Update log.debug message in getUser function to hide password --- packages/nps/services/account.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nps/services/account.ts b/packages/nps/services/account.ts index 065991925..1c9891b9d 100644 --- a/packages/nps/services/account.ts +++ b/packages/nps/services/account.ts @@ -19,7 +19,7 @@ export async function getUser( ): Promise { log.setName("getUser"); - log.debug(`Getting user ${username}, ${password}`); + log.debug(`Getting user: ${username}, password: ${"*".repeat(password.length)}`); const userAccount = await LoginSchema(db).findOne({ login_name: username, From 322cb24ffd96d409cebdb1ac15090cecdb57a359 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:33:46 -0400 Subject: [PATCH 19/84] chore: Refactor populateGameUsers function to remove unnecessary rename --- packages/nps/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nps/index.ts b/packages/nps/index.ts index b0ee48860..d3e94ae7e 100644 --- a/packages/nps/index.ts +++ b/packages/nps/index.ts @@ -18,7 +18,7 @@ export { UserInfo } from "./messageStructs/UserInfo.js"; export { UserStatus } from "./messageStructs/UserStatus.js"; export { getUser, - populateGameUsers as populateGameUsers, + populateGameUsers, } from "./services/account.js"; export { gameProfiles, From 4c8367d012d0a6544da6dd8085eb3cd771957766 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:53:48 -0400 Subject: [PATCH 20/84] refactor: Update EncryptionSession.ts to use DES for compatibility with the game --- packages/nps/src/EncryptionSession.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/nps/src/EncryptionSession.ts b/packages/nps/src/EncryptionSession.ts index 7e6993394..3a3d9b7a8 100644 --- a/packages/nps/src/EncryptionSession.ts +++ b/packages/nps/src/EncryptionSession.ts @@ -43,12 +43,22 @@ export function newEncryptionSession({ customerId: number; sessionKey: string; }): EncryptionSession { + /** + * Create a new encryption session + * + * While insecure, the use of DES is required for compatibility with the game + */ const gameCipher = createCipheriv( "des-cbc", Buffer.from(sessionKey, "hex"), Buffer.alloc(8), ); gameCipher.setAutoPadding(false); + /** + * Create a new decryption session + * + * While insecure, the use of DES is required for compatibility with the game + */ const gameDecipher = createDecipheriv( "des-cbc", Buffer.from(sessionKey, "hex"), From 43814e0d4714d71bfc19f2cdbd575c2b5a74f5ce Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 18:56:02 -0400 Subject: [PATCH 21/84] chore: Remove unnecessary return statement in processUserLogin.ts --- packages/nps/gameMessageProcessors/processUserLogin.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/nps/gameMessageProcessors/processUserLogin.ts b/packages/nps/gameMessageProcessors/processUserLogin.ts index cdf5b1119..7e858a8d7 100644 --- a/packages/nps/gameMessageProcessors/processUserLogin.ts +++ b/packages/nps/gameMessageProcessors/processUserLogin.ts @@ -68,5 +68,4 @@ export async function processUserLogin( socketCallback([responseBytes]); log.resetName(); - return Promise.resolve(); } From 228acc4046a9ead878b81308700db0d2e3ca5cf7 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:03:06 -0400 Subject: [PATCH 22/84] chore: Rename StackCarInfo to StockCarInfo for consistency --- packages/mcots/index.ts | 2 +- packages/mcots/messageProcessors/processStockCarInfo.ts | 6 +++--- packages/mcots/payloads/StockCar.ts | 6 +++--- packages/mcots/payloads/index.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/mcots/index.ts b/packages/mcots/index.ts index 547c5ac37..bb44ca9ab 100644 --- a/packages/mcots/index.ts +++ b/packages/mcots/index.ts @@ -11,7 +11,7 @@ export { LoginMessage, LoginCompleteMessage, SetOptionsMessage, - StackCarInfo, + StockCarInfo, StockCar, } from "./payloads/index.js"; diff --git a/packages/mcots/messageProcessors/processStockCarInfo.ts b/packages/mcots/messageProcessors/processStockCarInfo.ts index 3fc50c982..d677ab42e 100644 --- a/packages/mcots/messageProcessors/processStockCarInfo.ts +++ b/packages/mcots/messageProcessors/processStockCarInfo.ts @@ -2,7 +2,7 @@ import { type WarehouseInventory, getWarehouseInventory, } from "rusty-motors-database"; -import { StackCarInfo, StockCar } from "rusty-motors-mcots"; +import { StockCarInfo, StockCar } from "rusty-motors-mcots"; import { getServerLogger } from "rusty-motors-shared"; import { ServerGenericRequest, @@ -43,7 +43,7 @@ export async function processStockCarInfo( `Sending car info for lot owner ${lotOwnerId} and brand ${brandId}`, ); - const responsePacket = new StackCarInfo(); + const responsePacket = new StockCarInfo(); responsePacket.setMessageId(141); responsePacket.setStarterCash(100); @@ -52,7 +52,7 @@ export async function processStockCarInfo( const response = new ServerMessage(141); - if (inventoryCars.inventory.length > StackCarInfo.MAX_CARS_PER_MESSAGE) { + if (inventoryCars.inventory.length > StockCarInfo.MAX_CARS_PER_MESSAGE) { log.error( `Too many cars in inventory: ${inventoryCars.inventory.length}`, ); diff --git a/packages/mcots/payloads/StockCar.ts b/packages/mcots/payloads/StockCar.ts index 1701b0644..15b30b3e5 100644 --- a/packages/mcots/payloads/StockCar.ts +++ b/packages/mcots/payloads/StockCar.ts @@ -46,7 +46,7 @@ export class StockCar extends Serializable { } } -export class StackCarInfo extends ServerMessagePayload { +export class StockCarInfo extends ServerMessagePayload { static MAX_CARS_PER_MESSAGE = 100; private _cars: StockCar[] = []; // msgNo: 2 bytes @@ -98,7 +98,7 @@ export class StackCarInfo extends ServerMessagePayload { return buffer; } catch (error) { - log.error(`Error serializing StackCarInfo: ${error as string}`); + log.error(`Error serializing StockCarInfo: ${error as string}`); throw error; } } @@ -117,6 +117,6 @@ export class StackCarInfo extends ServerMessagePayload { } toString(): string { - return `StackCarInfo: ${this._cars.length} cars, ${this._starterCash} starter cash, ${this._dealerId} dealerId, ${this._brandId} brandId`; + return `StockCarInfo: ${this._cars.length} cars, ${this._starterCash} starter cash, ${this._dealerId} dealerId, ${this._brandId} brandId`; } } diff --git a/packages/mcots/payloads/index.ts b/packages/mcots/payloads/index.ts index 2e313375f..83f7b11ba 100644 --- a/packages/mcots/payloads/index.ts +++ b/packages/mcots/payloads/index.ts @@ -3,6 +3,6 @@ export { ClientTrackingMessage } from "./ClientTrackingMessage.js"; export { LoginMessage } from "./LoginMessage.js"; export { LoginCompleteMessage } from "./LoginCompleteMessage.js"; export { SetOptionsMessage } from "./SetOptionsMessage.js"; -export { StackCarInfo, StockCar } from "./StockCar.js"; +export { StockCarInfo, StockCar } from "./StockCar.js"; // Path: packages/mcots/payloads/index.ts From d92997dc3a61a21cf07018076a59aee05c715154 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:25:01 -0400 Subject: [PATCH 23/84] feat: Add BaseSerializable class for message serialization --- .../nps/messageStructs/BaseSerializable.ts | 16 +++++++++ packages/nps/test/BaseSerializable.test.ts | 34 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 packages/nps/messageStructs/BaseSerializable.ts create mode 100644 packages/nps/test/BaseSerializable.test.ts diff --git a/packages/nps/messageStructs/BaseSerializable.ts b/packages/nps/messageStructs/BaseSerializable.ts new file mode 100644 index 000000000..bab110019 --- /dev/null +++ b/packages/nps/messageStructs/BaseSerializable.ts @@ -0,0 +1,16 @@ +import type { ISerializable } from "../types"; + +export class BaseSerializable implements ISerializable { + serialize(): Buffer { + throw new Error("Method not implemented."); + } + deserialize(_data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + toString(): string { + throw new Error("Method not implemented."); + } +} diff --git a/packages/nps/test/BaseSerializable.test.ts b/packages/nps/test/BaseSerializable.test.ts new file mode 100644 index 000000000..966571a46 --- /dev/null +++ b/packages/nps/test/BaseSerializable.test.ts @@ -0,0 +1,34 @@ +import { beforeEach, describe, expect, it } from "vitest"; +import { BaseSerializable } from "../messageStructs/BaseSerializable.js"; + +describe("BaseSerializable", () => { + let baseSerializable: BaseSerializable; + + beforeEach(() => { + baseSerializable = new BaseSerializable(); + }); + + it("should throw an error when calling serialize", () => { + expect(() => { + baseSerializable.serialize(); + }).toThrow("Method not implemented."); + }); + + it("should throw an error when calling deserialize", () => { + expect(() => { + baseSerializable.deserialize(Buffer.from([])); + }).toThrow("Method not implemented."); + }); + + it("should throw an error when calling getByteSize", () => { + expect(() => { + baseSerializable.getByteSize(); + }).toThrow("Method not implemented."); + }); + + it("should throw an error when calling toString", () => { + expect(() => { + baseSerializable.toString(); + }).toThrow("Method not implemented."); + }); +}); From ceb021491583c440a54f286d2975a4ef9112e483 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:25:13 -0400 Subject: [PATCH 24/84] refactor: Update MiniUserList serialization logic --- packages/nps/messageStructs/MiniUserList.ts | 120 ++++++++++---------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/packages/nps/messageStructs/MiniUserList.ts b/packages/nps/messageStructs/MiniUserList.ts index af8fcb839..512c89da5 100644 --- a/packages/nps/messageStructs/MiniUserList.ts +++ b/packages/nps/messageStructs/MiniUserList.ts @@ -1,73 +1,71 @@ import type { ISerializable } from "rusty-motors-nps"; import { putLenString } from "rusty-motors-nps"; +import { BaseSerializable } from "./BaseSerializable.js"; -export class MiniUserInfo implements ISerializable { - userId: number; // 4 bytes - userName: string; // 32 bytes - max length +export class MiniUserInfo extends BaseSerializable { + userId: number; // 4 bytes + userName: string; // 32 bytes - max length - constructor(userId: number, userName: string) { - if (userName.length > 32) { - throw new Error(`User name too long: ${userName}`); - } + constructor(userId: number, userName: string) { + super(); + if (userName.length > 32) { + throw new Error(`User name too long: ${userName}`); + } - this.userId = userId; - this.userName = userName; - } + this.userId = userId; + this.userName = userName; + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeUInt32BE(this.userId, offset); - offset += 4; - putLenString(buffer, offset, this.userName, false); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return 4 + 4 + this.userName.length + 1; - } - toString(): string { - return `MiniUserInfo(userId=${this.userId}, userName=${this.userName})`; - } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.userId, offset); + offset += 4; + putLenString(buffer, offset, this.userName, false); + return buffer; + } + getByteSize(): number { + return 4 + 4 + this.userName.length + 1; + } + toString(): string { + return `MiniUserInfo(userId=${this.userId}, userName=${this.userName})`; + } } -export class MiniUserList implements ISerializable { - private channelId: number; // 4 bytes - private channelUsers: MiniUserInfo[] = []; +export class MiniUserList extends BaseSerializable { + private channelId: number; // 4 bytes + private channelUsers: MiniUserInfo[] = []; - constructor(channelId: number) { - this.channelId = channelId; - } + constructor(channelId: number) { + super(); + this.channelId = channelId; + } - addChannelUser(user: MiniUserInfo): void { - this.channelUsers.push(user); - } + addChannelUser(user: MiniUserInfo): void { + this.channelUsers.push(user); + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeUInt32BE(this.channelId, offset); - offset += 4; - buffer.writeUInt32BE(this.channelUsers.length, offset); - offset += 4; - this.channelUsers.forEach((user) => { - const userBuffer = user.serialize(); - userBuffer.copy(buffer, offset); - offset += userBuffer.length; - }); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return ( - 16 + this.channelUsers.reduce((acc, user) => acc + user.getByteSize(), 0) - ); - } - toString(): string { - return `MiniUserList(channelId=${this.channelId}, channelUsers=${this.channelUsers})`; - } + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeUInt32BE(this.channelId, offset); + offset += 4; + buffer.writeUInt32BE(this.channelUsers.length, offset); + offset += 4; + this.channelUsers.forEach((user) => { + const userBuffer = user.serialize(); + userBuffer.copy(buffer, offset); + offset += userBuffer.length; + }); + return buffer; + } + getByteSize(): number { + return ( + 16 + + this.channelUsers.reduce((acc, user) => acc + user.getByteSize(), 0) + ); + } + toString(): string { + return `MiniUserList(channelId=${this.channelId}, channelUsers=${this.channelUsers})`; + } } From 00c00eb7755f258095133e6cb5ea3fc698785fd4 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:33:05 -0400 Subject: [PATCH 25/84] refactor: Update MiniRiffList serialization logic and remove NPSList class --- packages/nps/messageStructs/MiniRiffList.ts | 23 ++++++-------- packages/nps/messageStructs/NPSList.ts | 34 --------------------- 2 files changed, 9 insertions(+), 48 deletions(-) delete mode 100644 packages/nps/messageStructs/NPSList.ts diff --git a/packages/nps/messageStructs/MiniRiffList.ts b/packages/nps/messageStructs/MiniRiffList.ts index 6a0724efa..62ff11aac 100644 --- a/packages/nps/messageStructs/MiniRiffList.ts +++ b/packages/nps/messageStructs/MiniRiffList.ts @@ -1,19 +1,19 @@ -import type { ISerializable } from "rusty-motors-nps"; import { putLenString } from "rusty-motors-nps"; -import { NPSList } from "./NPSList.js"; import { getServerLogger } from "rusty-motors-shared"; +import { BaseSerializable } from "./BaseSerializable.js"; const log = getServerLogger(); const channelRecordSize = 40; -export class MiniRiffInfo implements ISerializable { +export class MiniRiffInfo extends BaseSerializable { riffName: string; // 32 bytes - max length riffId: number; // 4 bytes population: number; // 2 bytes constructor(riffName: string, riffId: number, population: number) { + super(); if (riffName.length > 32) { throw new Error(`Riff name too long: ${riffName}`); } @@ -34,9 +34,6 @@ export class MiniRiffInfo implements ISerializable { log.debug(`MiniRiffInfo: ${this.toString()} - ${buffer.toString("hex")}`); return buffer; } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } getByteSize(): number { return 4 + this.riffName.length + 1 + 4 + 2; } @@ -45,17 +42,15 @@ export class MiniRiffInfo implements ISerializable { } } -export class MiniRiffList extends NPSList implements ISerializable { +export class MiniRiffList extends BaseSerializable { + private riffs: MiniRiffInfo[] = []; + override serialize(): Buffer { return this.toBytes(); } - override deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } override getByteSize(): number { return this.getSize(); } - private riffs: MiniRiffInfo[] = []; getMaxRiffs(): number { return this.riffs.length; @@ -65,7 +60,7 @@ export class MiniRiffList extends NPSList implements ISerializable { this.riffs.push(riff); } - override toBytes(): Buffer { + toBytes(): Buffer { const buffer = Buffer.alloc(this.getSize()); let offset = 0; buffer.writeUInt32BE(this.riffs.length, offset); @@ -82,11 +77,11 @@ export class MiniRiffList extends NPSList implements ISerializable { override toString(): string { return `MiniRiffList(riffs=${this.riffs})`; } - override toHex(): string { + toHex(): string { return this.toBytes().toString("hex"); } - override getSize(): number { + getSize(): number { let size = 4; for (const riff of this.riffs) { size += riff.getByteSize(); diff --git a/packages/nps/messageStructs/NPSList.ts b/packages/nps/messageStructs/NPSList.ts deleted file mode 100644 index c4d86c1bd..000000000 --- a/packages/nps/messageStructs/NPSList.ts +++ /dev/null @@ -1,34 +0,0 @@ -import type { IMessage, ISerializable } from "rusty-motors-nps"; - -export class NPSList implements ISerializable { - serialize(): Buffer { - throw new Error("Method not implemented."); - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - throw new Error("Method not implemented."); - } - private list: IMessage[] = []; - - toBytes(): Buffer { - throw new Error("Method not implemented."); - } - toString(): string { - throw new Error("Method not implemented."); - } - toHex(): string { - throw new Error("Method not implemented."); - } - setData(data: Buffer): void { - throw new Error("Method not implemented."); - } - getData(): Buffer { - throw new Error("Method not implemented."); - } - - getSize(): number { - return 0; - } -} From 8c15b2b861ef72e4422217dfa708a596cec1f00c Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:33:58 -0400 Subject: [PATCH 26/84] refactor: Update SessionKey to extend BaseSerializable class --- packages/nps/messageStructs/SessionKey.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts index 9382b95e5..c1b1a2298 100644 --- a/packages/nps/messageStructs/SessionKey.ts +++ b/packages/nps/messageStructs/SessionKey.ts @@ -1,15 +1,16 @@ -import type { ISerializable } from "rusty-motors-nps"; import { getAsHex, isOnlyOneSet } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; +import { BaseSerializable } from "./BaseSerializable.js"; const log = getServerLogger(); -export class SessionKey implements ISerializable { +export class SessionKey extends BaseSerializable { private key: Buffer = Buffer.alloc(0); private timestamp: number = 0; private _isSet: boolean = false; constructor({ key, timestamp }: { key?: Buffer; timestamp?: number }) { + super(); log.setName("SessionKey"); if (isOnlyOneSet(key, timestamp)) { throw new Error("Both key and timestamp must be set if one is set"); From 7fb1178ec679fa8567df974eca49995a62223560 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:37:56 -0400 Subject: [PATCH 27/84] refactor: Update UserInfo serialization logic and extend BaseSerializable class --- packages/nps/messageStructs/UserInfo.ts | 80 ++++++++++++------------- 1 file changed, 39 insertions(+), 41 deletions(-) diff --git a/packages/nps/messageStructs/UserInfo.ts b/packages/nps/messageStructs/UserInfo.ts index ae55e5855..caa0470cf 100644 --- a/packages/nps/messageStructs/UserInfo.ts +++ b/packages/nps/messageStructs/UserInfo.ts @@ -1,46 +1,44 @@ -import type { ISerializable } from "rusty-motors-nps"; +import { BaseSerializable } from "./BaseSerializable.js"; -export class UserInfo implements ISerializable { - private profileId: number; // 4 bytes - private profileName: string; // 32 bytes - max length - private userData; // 64 bytes +export class UserInfo extends BaseSerializable { + private profileId: number; // 4 bytes + private profileName: string; // 32 bytes - max length + private userData; // 64 bytes - constructor(id: number, name: string) { - if (name.length > 31) { - throw new Error( - `Profile name too long: ${name}, max length is 31, got ${name.length}`, - ); - } - this.profileId = id; - this.profileName = name; - this.userData = Buffer.alloc(64); - } + constructor(id: number, name: string) { + super(); + if (name.length > 31) { + throw new Error( + `Profile name too long: ${name}, max length is 31, got ${name.length}`, + ); + } + this.profileId = id; + this.profileName = name; + this.userData = Buffer.alloc(64); + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - let offset = 0; - buffer.writeInt32BE(this.profileId, offset); - offset += 4; - buffer.writeUInt16BE(this.profileName.length, offset); - offset += 2; - buffer.write( - `${this.profileName}\0`, - offset, - this.profileName.length + 1, - "utf8", - ); - offset += this.profileName.length + 1; - this.userData.copy(buffer, offset); - return buffer; - } - deserialize(data: Buffer): void { - throw new Error("Method not implemented."); - } - getByteSize(): number { - return 4 + 2 + this.profileName.length + 1 + 64; - } - toString(): string { - return `Profile ID: ${this.profileId}, + serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + let offset = 0; + buffer.writeInt32BE(this.profileId, offset); + offset += 4; + buffer.writeUInt16BE(this.profileName.length, offset); + offset += 2; + buffer.write( + `${this.profileName}\0`, + offset, + this.profileName.length + 1, + "utf8", + ); + offset += this.profileName.length + 1; + this.userData.copy(buffer, offset); + return buffer; + } + getByteSize(): number { + return 4 + 2 + this.profileName.length + 1 + 64; + } + toString(): string { + return `Profile ID: ${this.profileId}, Profile Name: ${this.profileName}`; - } + } } From 3b7ee26170707c8bf43acabf2f301b66e88e95d0 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:44:43 -0400 Subject: [PATCH 28/84] refactor: Update ServerMessageHeader to extend BasePacket class --- packages/shared-packets/src/ServerMessage.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts index 0bef3fa64..254ee1f10 100644 --- a/packages/shared-packets/src/ServerMessage.ts +++ b/packages/shared-packets/src/ServerMessage.ts @@ -1,5 +1,5 @@ import { McosEncryptionPair, getServerLogger } from "rusty-motors-shared"; -import { Serializable } from "./BasePacket.js"; +import { BasePacket, Serializable } from "./BasePacket.js"; import type { IMessage, ISerializable } from "./interfaces.js"; const log = getServerLogger(); @@ -7,7 +7,7 @@ const log = getServerLogger(); /** * */ -export class ServerMessageHeader extends Serializable implements ISerializable { +export class ServerMessageHeader extends BasePacket { // All fields are little-endian private length: number = 0; // 2 bytes private signature: string = ""; // 4 bytes @@ -52,7 +52,7 @@ export class ServerMessageHeader extends Serializable implements ISerializable { isPayloadEncrypted(): boolean { // Does the flags bitmask contain have 0x08 set? - return this.flags >= 0x08; + return (this.flags & 0x08) != 0; } setPayloadEncryption(encrypted: boolean): ServerMessageHeader { From 7c4d266cdad8cdbb704202966ef61aa02ee79c96 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:49:36 -0400 Subject: [PATCH 29/84] refactor: Update UserAction serialization logic and extend ISerializable interface --- packages/nps/messageStructs/UserAction.ts | 235 +++++++++++----------- 1 file changed, 120 insertions(+), 115 deletions(-) diff --git a/packages/nps/messageStructs/UserAction.ts b/packages/nps/messageStructs/UserAction.ts index 894683952..19723c520 100644 --- a/packages/nps/messageStructs/UserAction.ts +++ b/packages/nps/messageStructs/UserAction.ts @@ -5,129 +5,134 @@ import { getServerLogger } from "rusty-motors-shared"; const log = getServerLogger(); export class UserAction implements ISerializable { - private name: string; - private _endTimeMaybe = 0; // 4 bytes - private _b1 = 0; // 1 byte - private _b2 = 0; // 1 byte - private _initiator = ""; // 64 bytes - private _startComment = ""; // 256 bytes - private _endComment = ""; // 256 bytes + private name: string; + private _endTimeMaybe = 0; // 4 bytes + private _b1 = 0; // 1 byte + private _b2 = 0; // 1 byte + private _initiator = ""; // 64 bytes + private _startComment = ""; // 256 bytes + private _endComment = ""; // 256 bytes - constructor(name: string) { - this.name = name; - } + constructor(name: string) { + this.name = name; + } - serialize(): Buffer { - const buffer = Buffer.alloc(this.getSize()); - let offset = 0; - buffer.writeUInt32BE(this._endTimeMaybe, offset); - offset += 4; - buffer.writeUInt8(this._b1, offset); - offset += 1; - buffer.writeUInt8(this._b2, offset); - offset += 1; - buffer.write(this._initiator, offset, 0x40, "utf8"); - offset += 0x40; - buffer.write(this._startComment, offset, 0x100, "utf8"); - offset += 0x100; - buffer.write(this._endComment, offset, 0x100, "utf8"); + serialize(): Buffer { + try { + const buffer = Buffer.alloc(this.getSize()); + let offset = 0; + buffer.writeUInt32BE(this._endTimeMaybe, offset); + offset += 4; + buffer.writeUInt8(this._b1, offset); + offset += 1; + buffer.writeUInt8(this._b2, offset); + offset += 1; + buffer.write(this._initiator, offset, 0x40, "utf8"); + offset += 0x40; + buffer.write(this._startComment, offset, 0x100, "utf8"); + offset += 0x100; + buffer.write(this._endComment, offset, 0x100, "utf8"); - return buffer; - } - deserialize(data: Buffer): void { - try { - this._endTimeMaybe = data.readUInt32BE(0); - this._b1 = data.readUInt8(4); - this._b2 = data.readUInt8(5); - this._initiator = data.toString("utf8", 6, 0x46); - this._startComment = data.toString("utf8", 0x46, 0x146); - this._endComment = data.toString("utf8", 0x146, 0x246); - } catch (error) { - log.error(`Error deserializing UserAction: ${error as string}`); - throw error; - } - } - getByteSize(): number { - throw new Error("Method not implemented."); - } - setData(): void { - throw new Error("Method not implemented."); - } - getData(): Buffer { - throw new Error("Method not implemented."); - } + return buffer; + } catch (error: unknown) { + log.error(`Error serializing UserAction: ${error as string}`); + throw error; + } + } + deserialize(data: Buffer): void { + try { + this._endTimeMaybe = data.readUInt32BE(0); + this._b1 = data.readUInt8(4); + this._b2 = data.readUInt8(5); + this._initiator = data.toString("utf8", 6, 0x46); + this._startComment = data.toString("utf8", 0x46, 0x146); + this._endComment = data.toString("utf8", 0x146, 0x246); + } catch (error) { + log.error(`Error deserializing UserAction: ${error as string}`); + throw error; + } + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + setData(): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } - static fromBytes(name: string, bytes: Buffer): UserAction { - const userAction = new UserAction(name); - userAction.deserialize(bytes); + static fromBytes(name: string, bytes: Buffer): UserAction { + const userAction = new UserAction(name); + userAction.deserialize(bytes); - return userAction; - } + return userAction; + } - toBytes(): Buffer { - return this.serialize(); - } - toString(): string { - return `UserAction: ${this.name} - ${this._initiator} - ${this._startComment} - ${this._endComment}`; - } - toHex(): string { - return getAsHex(this.serialize()); - } + toBytes(): Buffer { + return this.serialize(); + } + toString(): string { + return `UserAction: ${this.name} - ${this._initiator} - ${this._startComment} - ${this._endComment}`; + } + toHex(): string { + return getAsHex(this.serialize()); + } - getSize(): number { - return 4 + 1 + 1 + 0x40 + 0x100 + 0x100; - } + getSize(): number { + return 4 + 1 + 1 + 0x40 + 0x100 + 0x100; + } - public set({ - endTimeMaybe, - b1, - b2, - initiator, - startComment, - endComment, - }: { - endTimeMaybe?: number; - b1?: number; - b2?: number; - initiator: string; - startComment: string; - endComment?: string; - }): void { - this._endTimeMaybe = endTimeMaybe || 0; - this._b1 = b1 || 0; - this._b2 = b2 || 0; - this._initiator = initiator; - this._startComment = startComment; - this._endComment = endComment || ""; - } + public set({ + endTimeMaybe, + b1, + b2, + initiator, + startComment, + endComment, + }: { + endTimeMaybe?: number; + b1?: number; + b2?: number; + initiator: string; + startComment: string; + endComment?: string; + }): void { + this._endTimeMaybe = endTimeMaybe || 0; + this._b1 = b1 || 0; + this._b2 = b2 || 0; + this._initiator = initiator; + this._startComment = startComment; + this._endComment = endComment || ""; + } - public clear(): void { - this._endTimeMaybe = 0; - this._b1 = 0; - this._b2 = 0; - this._initiator = ""; - this._startComment = ""; - this._endComment = ""; - } + public clear(): void { + this._endTimeMaybe = 0; + this._b1 = 0; + this._b2 = 0; + this._initiator = ""; + this._startComment = ""; + this._endComment = ""; + } - updateEmptyValuesFrom(other: UserAction) { - if (this._endTimeMaybe === 0) { - this._endTimeMaybe = other._endTimeMaybe; - } - if (this._b1 === 0) { - this._b1 = other._b1; - } - if (this._b2 === 0) { - this._b2 = other._b2; - } - if (this._initiator === "") { - this._initiator = other._initiator; - } - if (this._startComment === "") { - this._startComment = other._startComment; - } - if (this._endComment === "") { - this._endComment = other._endComment; - } - } + updateEmptyValuesFrom(other: UserAction) { + if (this._endTimeMaybe === 0) { + this._endTimeMaybe = other._endTimeMaybe; + } + if (this._b1 === 0) { + this._b1 = other._b1; + } + if (this._b2 === 0) { + this._b2 = other._b2; + } + if (this._initiator === "") { + this._initiator = other._initiator; + } + if (this._startComment === "") { + this._startComment = other._startComment; + } + if (this._endComment === "") { + this._endComment = other._endComment; + } + } } From e3aa58e793e49ef42f4b0d77cd7ebbe24fe518bc Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:52:48 -0400 Subject: [PATCH 30/84] refactor: Update UserStatus serialization logic and extend BaseSerializable class --- packages/nps/messageStructs/UserStatus.ts | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts index 5ffcf5548..d2054aaa6 100644 --- a/packages/nps/messageStructs/UserStatus.ts +++ b/packages/nps/messageStructs/UserStatus.ts @@ -1,9 +1,9 @@ -import { randomUUID } from "crypto"; -import type { ISerializable } from "../types.js"; +import { randomUUID } from "node:crypto"; import { SessionKey } from "./SessionKey.js"; import { UserAction } from "./UserAction.js"; +import { BaseSerializable } from "./BaseSerializable.js"; -export class UserStatus implements ISerializable { +export class UserStatus extends BaseSerializable { private _sessionId: string = ""; private _remoteIp: string = ""; private _machineId: string = ""; @@ -23,6 +23,7 @@ export class UserStatus implements ISerializable { personaId?: number; sessionKey?: SessionKey; }) { + super(); this._sessionId = randomUUID(); this.customerId = customerId; this.personaId = personaId || 0; @@ -34,9 +35,6 @@ export class UserStatus implements ISerializable { serialize(): Buffer { return this.toBytes(); } - deserialize(): void { - throw new Error("Method not implemented."); - } getByteSize(): number { return this.getSize(); } @@ -169,7 +167,4 @@ export class UserStatus implements ISerializable { return this.toBytes().toString("hex"); } - setData() { - throw new Error("Method not implemented."); - } } From ff85357814c09624fbbfaa9acee056febea1070f Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 19:57:54 -0400 Subject: [PATCH 31/84] refactor: Update UserStatus serialization logic and extend BaseSerializable class --- packages/nps/messageStructs/UserStatus.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nps/messageStructs/UserStatus.ts b/packages/nps/messageStructs/UserStatus.ts index d2054aaa6..1a949e275 100644 --- a/packages/nps/messageStructs/UserStatus.ts +++ b/packages/nps/messageStructs/UserStatus.ts @@ -10,8 +10,8 @@ export class UserStatus extends BaseSerializable { private customerId: number = 0; private personaId: number = 0; private isCacheHit: boolean = false; - readonly ban: UserAction = new UserAction("ban"); - readonly gag: UserAction = new UserAction("gag"); + readonly ban: UserAction; + readonly gag: UserAction; private sessionKey: SessionKey = new SessionKey({}); constructor({ From d76d7966328536af4774a23c91fb18f5f02a451a Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Wed, 21 Aug 2024 20:14:48 -0400 Subject: [PATCH 32/84] refactor: Update UserStatus serialization logic and extend BaseSerializable class --- packages/database/src/models/Player.ts | 2 +- packages/gateway/src/index.ts | 266 ++-- packages/interfaces/index.d.ts | 234 ++-- packages/lobby/src/LoginInfoMessage.ts | 182 ++- packages/lobby/src/UserInfoMessage.ts | 218 ++- packages/lobby/src/handlers/_setMyUserData.ts | 91 +- .../lobby/src/handlers/encryptedCommand.ts | 342 +++-- .../src/handlers/handleGetMiniUserList.ts | 95 +- .../src/handlers/handleSendMiniRiffList.ts | 92 +- .../lobby/src/handlers/handleTrackingPing.ts | 38 +- .../src/handlers/requestConnectGameServer.ts | 202 +-- packages/lobby/src/internal.ts | 164 ++- packages/login/src/NPSUserStatus.ts | 188 +-- packages/login/src/index.ts | 230 ++-- packages/login/src/internal.ts | 327 ++--- packages/persona/src/BuddyInfoMessage.ts | 200 +-- packages/persona/src/PersonaMapsMessage.ts | 622 ++++----- packages/persona/src/_gameLogout.ts | 68 +- packages/persona/src/_getFirstBuddy.ts | 176 ++- packages/persona/src/_selectGamePersona.ts | 78 +- .../src/handlers/validatePersonaName.ts | 66 +- packages/persona/src/internal.ts | 374 ++--- packages/shared/GameMessage.ts | 67 + packages/shared/GameMessageHeader.ts | 56 + packages/shared/LegacyMessage.ts | 63 + packages/shared/ListMessage.ts | 62 + packages/shared/MessageBuffer.ts | 128 ++ packages/shared/MessageHeader.ts | 73 + packages/shared/MessageNode.ts | 178 +-- packages/shared/NPSHeader.ts | 83 ++ packages/shared/NPSMessage.ts | 44 + packages/shared/OldServerMessage.ts | 61 + packages/shared/SerializedBuffer.ts | 35 + packages/shared/ServerMessage.test.ts | 2 +- packages/shared/State.ts | 432 +++--- packages/shared/TimeStamp.ts | 130 +- packages/shared/deserializeString.ts | 21 + packages/shared/index.ts | 9 +- packages/shared/legacyHeader.ts | 61 + packages/shared/messageFactory.ts | 952 +------------ packages/shared/serializeString.ts | 21 + packages/shared/serializeStringRaw.ts | 20 + packages/shared/serverHeader.ts | 74 + packages/shared/tsconfig.json | 7 + packages/transactions/src/ArcadeCarMessage.ts | 132 +- .../transactions/src/EntryFeePurseMessage.ts | 172 +-- packages/transactions/src/GameUrlsMessage.ts | 134 +- .../transactions/src/GenericReplyMessage.ts | 286 ++-- packages/transactions/src/LobbyMessage.ts | 1216 ++++++++--------- .../transactions/src/OwnedVehiclesMessage.ts | 122 +- .../transactions/src/PartsAssemblyMessage.ts | 174 +-- .../transactions/src/PlayerInfoMessage.ts | 375 ++--- .../transactions/src/PlayerPhysicalMessage.ts | 86 +- .../src/PlayerRacingHistoryMessage.ts | 294 ++-- .../transactions/src/TClientConnectMessage.ts | 148 +- packages/transactions/src/TLoginMessage.ts | 230 ++-- packages/transactions/src/TunablesMessage.ts | 248 ++-- .../transactions/src/_getArcadeCarInfo.ts | 36 +- packages/transactions/src/_getGameUrls.ts | 36 +- packages/transactions/src/_getOwnedParts.ts | 42 +- .../transactions/src/_getOwnedVehicles.ts | 52 +- packages/transactions/src/_getPlayerInfo.ts | 40 +- .../transactions/src/_getPlayerPhysical.ts | 32 +- packages/transactions/src/_getStockCarInfo.ts | 40 +- packages/transactions/src/_getTunables.ts | 28 +- packages/transactions/src/_logout.ts | 28 +- packages/transactions/src/clientConnect.ts | 126 +- packages/transactions/src/getLobbies.ts | 114 +- packages/transactions/src/handlers.ts | 128 +- packages/transactions/src/internal.ts | 411 +++--- packages/transactions/src/login.ts | 36 +- packages/transactions/src/trackingPing.ts | 28 +- 72 files changed, 5846 insertions(+), 5782 deletions(-) create mode 100644 packages/shared/GameMessage.ts create mode 100644 packages/shared/GameMessageHeader.ts create mode 100644 packages/shared/LegacyMessage.ts create mode 100644 packages/shared/ListMessage.ts create mode 100644 packages/shared/MessageBuffer.ts create mode 100644 packages/shared/MessageHeader.ts create mode 100644 packages/shared/NPSHeader.ts create mode 100644 packages/shared/NPSMessage.ts create mode 100644 packages/shared/OldServerMessage.ts create mode 100644 packages/shared/SerializedBuffer.ts create mode 100644 packages/shared/deserializeString.ts create mode 100644 packages/shared/legacyHeader.ts create mode 100644 packages/shared/serializeString.ts create mode 100644 packages/shared/serializeStringRaw.ts create mode 100644 packages/shared/serverHeader.ts create mode 100644 packages/shared/tsconfig.json diff --git a/packages/database/src/models/Player.ts b/packages/database/src/models/Player.ts index 3f50c285d..5e6a5ac6e 100644 --- a/packages/database/src/models/Player.ts +++ b/packages/database/src/models/Player.ts @@ -1,5 +1,5 @@ import { ServerError } from "../../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; export class PlayerModel extends SerializedBuffer { override serialize(): Buffer { diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 61d949083..471ed42e4 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -16,19 +16,19 @@ import { randomUUID } from "node:crypto"; import { - OnDataHandler, - addSocket, - fetchStateFromDatabase, - getOnDataHandler, - removeSocket, - wrapSocket, + OnDataHandler, + addSocket, + fetchStateFromDatabase, + getOnDataHandler, + removeSocket, + wrapSocket, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; import { Socket } from "node:net"; import { Logger } from "pino"; -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { getGatewayServer } from "./GatewayServer.js"; /** @@ -56,24 +56,24 @@ import { getGatewayServer } from "./GatewayServer.js"; * Handle socket errors */ export function socketErrorHandler({ - connectionId, - error, - log = getServerLogger({ - module: "socketErrorHandler", - }), + connectionId, + error, + log = getServerLogger({ + module: "socketErrorHandler", + }), }: { - connectionId: string; - error: NodeJS.ErrnoException; - log?: Logger; + connectionId: string; + error: NodeJS.ErrnoException; + log?: Logger; }) { - // Handle socket errors - if (error.code == "ECONNRESET") { - log.debug(`Connection ${connectionId} reset`); - return; - } - throw new ServerError( - `Socket error: ${error.message} on connection ${connectionId}`, - ); + // Handle socket errors + if (error.code == "ECONNRESET") { + log.debug(`Connection ${connectionId} reset`); + return; + } + throw new ServerError( + `Socket error: ${error.message} on connection ${connectionId}`, + ); } /** @@ -84,18 +84,18 @@ export function socketErrorHandler({ * @param {import("pino").Logger} [options.log=getServerLogger({ module: "socketEndHandler" })] The logger to use */ export function socketEndHandler({ - connectionId, - log = getServerLogger({ - module: "socketEndHandler", - }), + connectionId, + log = getServerLogger({ + module: "socketEndHandler", + }), }: { - connectionId: string; - log?: import("pino").Logger; + connectionId: string; + log?: import("pino").Logger; }) { - log.debug(`Connection ${connectionId} ended`); + log.debug(`Connection ${connectionId} ended`); - // Remove the socket from the global state - removeSocket(fetchStateFromDatabase(), connectionId).save(); + // Remove the socket from the global state + removeSocket(fetchStateFromDatabase(), connectionId).save(); } /** @@ -107,105 +107,109 @@ export function socketEndHandler({ * */ export function onSocketConnection({ - incomingSocket, - log = getServerLogger({ - module: "onDataHandler", - }), + incomingSocket, + log = getServerLogger({ + module: "onDataHandler", + }), }: { - incomingSocket: Socket; - log?: import("pino").Logger; + incomingSocket: Socket; + log?: import("pino").Logger; }) { - // Get the local port and remote address - const { localPort, remoteAddress } = incomingSocket; - - if (localPort === undefined || remoteAddress === undefined) { - throw new ServerError("localPort or remoteAddress is undefined"); - } - - // This is a new connection so generate a new connection ID - const newConnectionId = randomUUID(); - - // Wrap the socket and add it to the global state - const wrappedSocket = wrapSocket(incomingSocket, newConnectionId); - - // Add the socket to the global state - addSocket(fetchStateFromDatabase(), wrappedSocket).save(); - - // This is a new TCP socket, so it's probably not using HTTP - // Let's look for a port onData handler - /** @type {OnDataHandler | undefined} */ - const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( - fetchStateFromDatabase(), - localPort, - ); - - // Throw an error if there is no onData handler - if (!portOnDataHandler) { - log.warn(`No onData handler for port ${localPort}`); - return; - } - - incomingSocket.on("error", (error) => - socketErrorHandler({ connectionId: newConnectionId, error }), - ); - - // Add the data handler to the socket - incomingSocket.on( - "data", - (/** @type {Buffer} */ incomingDataAsBuffer: Buffer) => { - log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); - - // Deserialize the raw message - const rawMessage = new SerializedBuffer()._doDeserialize( - incomingDataAsBuffer, - ); - - // Log the raw message - log.trace(`Raw message: ${rawMessage.toString()}`); - - log.debug("Calling onData handler"); - - portOnDataHandler({ - connectionId: newConnectionId, - message: rawMessage, - }) - .then( - ( - /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, - ) => { - log.debug("onData handler returned"); - const { messages } = response; - - // Log the messages - log.trace(`Messages: ${messages.map((m) => m.toString())}`); - - // Serialize the messages - const serializedMessages = messages.map((m) => m.serialize()); - - try { - // Send the messages - serializedMessages.forEach((m) => { - incomingSocket.write(m); - log.trace(`Sent data: ${m.toString("hex")}`); - }); - } catch (error) { - log.error(`Error sending data: ${String(error)}`); - } - }, - ) - .catch((/** @type {Error} */ error: Error) => { - log.error(`Error handling data: ${String(error)}`); - - // Call server shutdown - getGatewayServer({}).shutdown(); - }); - }, - ); - - log.debug(`Client ${remoteAddress} connected to port ${localPort}`); - - if (localPort === 7003) { - // Sent ok to login packet - incomingSocket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); - } + // Get the local port and remote address + const { localPort, remoteAddress } = incomingSocket; + + if (localPort === undefined || remoteAddress === undefined) { + throw new ServerError("localPort or remoteAddress is undefined"); + } + + // This is a new connection so generate a new connection ID + const newConnectionId = randomUUID(); + + // Wrap the socket and add it to the global state + const wrappedSocket = wrapSocket(incomingSocket, newConnectionId); + + // Add the socket to the global state + addSocket(fetchStateFromDatabase(), wrappedSocket).save(); + + // This is a new TCP socket, so it's probably not using HTTP + // Let's look for a port onData handler + /** @type {OnDataHandler | undefined} */ + const portOnDataHandler: OnDataHandler | undefined = getOnDataHandler( + fetchStateFromDatabase(), + localPort, + ); + + // Throw an error if there is no onData handler + if (!portOnDataHandler) { + log.warn(`No onData handler for port ${localPort}`); + return; + } + + incomingSocket.on("error", (error) => + socketErrorHandler({ connectionId: newConnectionId, error }), + ); + + // Add the data handler to the socket + incomingSocket.on( + "data", + (/** @type {Buffer} */ incomingDataAsBuffer: Buffer) => { + log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); + + // Deserialize the raw message + const rawMessage = new SerializedBuffer()._doDeserialize( + incomingDataAsBuffer, + ); + + // Log the raw message + log.trace(`Raw message: ${rawMessage.toString()}`); + + log.debug("Calling onData handler"); + + portOnDataHandler({ + connectionId: newConnectionId, + message: rawMessage, + }) + .then( + ( + /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, + ) => { + log.debug("onData handler returned"); + const { messages } = response; + + // Log the messages + log.trace( + `Messages: ${messages.map((m) => m.toString())}`, + ); + + // Serialize the messages + const serializedMessages = messages.map((m) => + m.serialize(), + ); + + try { + // Send the messages + serializedMessages.forEach((m) => { + incomingSocket.write(m); + log.trace(`Sent data: ${m.toString("hex")}`); + }); + } catch (error) { + log.error(`Error sending data: ${String(error)}`); + } + }, + ) + .catch((/** @type {Error} */ error: Error) => { + log.error(`Error handling data: ${String(error)}`); + + // Call server shutdown + getGatewayServer({}).shutdown(); + }); + }, + ); + + log.debug(`Client ${remoteAddress} connected to port ${localPort}`); + + if (localPort === 7003) { + // Sent ok to login packet + incomingSocket.write(Buffer.from([0x02, 0x30, 0x00, 0x00])); + } } diff --git a/packages/interfaces/index.d.ts b/packages/interfaces/index.d.ts index abe04f64d..539841e36 100644 --- a/packages/interfaces/index.d.ts +++ b/packages/interfaces/index.d.ts @@ -4,7 +4,7 @@ import { Socket } from "node:net"; import pino from "pino"; import { Configuration } from "../shared/Configuration.js"; import { ServerError } from "../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../shared/messageFactory.js"; +import { SerializedBuffer } from "../shared/SerializedBuffer.ts"; /** * @module interfaces @@ -13,9 +13,9 @@ import { SerializedBuffer } from "../shared/messageFactory.js"; export as namespace interfaces; export namespace external { - export namespace pino { - export type Logger = pino.Logger; - } + export namespace pino { + export type Logger = pino.Logger; + } } export const name = "interfaces"; @@ -25,184 +25,184 @@ export const name = "interfaces"; * @interface */ interface SerializedObject { - serialize: () => Buffer; - serializeSize: () => number; + serialize: () => Buffer; + serializeSize: () => number; } export const SerializedObject = { - serialize() { - throw new ServerError("Not implemented"); - }, - serializeSize() { - throw new ServerError("Not implemented"); - }, + serialize() { + throw new ServerError("Not implemented"); + }, + serializeSize() { + throw new ServerError("Not implemented"); + }, }; interface EncryptionSession { - connectionId: string; - remoteAddress: string; - localPort: number; - sessionKey: string; - sKey: string; - gsCipher: Cipher; - gsDecipher: Decipher; - tsCipher: Cipher; - tsDecipher: Decipher; + connectionId: string; + remoteAddress: string; + localPort: number; + sessionKey: string; + sKey: string; + gsCipher: Cipher; + gsDecipher: Decipher; + tsCipher: Cipher; + tsDecipher: Decipher; } interface ClientConnection { - status: number; - appID: number; - id: string; - socket: Socket; - remoteAddress: string; - seq: number; - personaId: number; - lastMessageTimestamp: number; - inQueue: boolean; - encryptionSession: EncryptionSession; - useEncryption: boolean; - port: number; - ip: string; + status: number; + appID: number; + id: string; + socket: Socket; + remoteAddress: string; + seq: number; + personaId: number; + lastMessageTimestamp: number; + inQueue: boolean; + encryptionSession: EncryptionSession; + useEncryption: boolean; + port: number; + ip: string; } interface SocketWithConnectionInfo { - connectionId: string; - socket: Socket; - seq: number; - id: string; - remoteAddress: string; - localPort: number; - personaId: number; - lastMessageTimestamp: number; - inQueue: boolean; - encryptionSession: EncryptionSession; - useEncryption: boolean; + connectionId: string; + socket: Socket; + seq: number; + id: string; + remoteAddress: string; + localPort: number; + personaId: number; + lastMessageTimestamp: number; + inQueue: boolean; + encryptionSession: EncryptionSession; + useEncryption: boolean; } export interface DatabaseManager { - updateSessionKey: ( - arg0: number, - arg1: string, - arg2: string, - arg3: string, - ) => Promise; - fetchSessionKeyByCustomerId: (arg0: number) => Promise; + updateSessionKey: ( + arg0: number, + arg1: string, + arg2: string, + arg3: string, + ) => Promise; + fetchSessionKeyByCustomerId: (arg0: number) => Promise; } /** * @exports */ export interface ConnectionRecord { - customerId: number; - connectionId: string; - sessionKey: string; - sKey: string; - contextId: string; + customerId: number; + connectionId: string; + sessionKey: string; + sKey: string; + contextId: string; } interface SessionKeys { - sessionKey: string; - sKey: string; + sessionKey: string; + sKey: string; } interface TConnection { - connectionId: string; - localPort: number; - remoteAddress: string; - socket: Socket; - encryptionSession: EncryptionSession; - useEncryption: boolean; - inQueue: boolean; + connectionId: string; + localPort: number; + remoteAddress: string; + socket: Socket; + encryptionSession: EncryptionSession; + useEncryption: boolean; + inQueue: boolean; } interface JSONResponseOfGameMessage { - msgNo: number; - opCode: number | null; - msgLength: number; - msgVersion: number; - content: string; - contextId: string; - direction: "sent" | "received"; - sessionKey: string | null; - rawBuffer: string; + msgNo: number; + opCode: number | null; + msgLength: number; + msgVersion: number; + content: string; + contextId: string; + direction: "sent" | "received"; + sessionKey: string | null; + rawBuffer: string; } interface GameMessage { - serialize: () => Buffer; - deserialize: (arg0: Buffer) => void; - toJSON: () => JSONResponseOfGameMessage; - dumpPacket: () => string; + serialize: () => Buffer; + deserialize: (arg0: Buffer) => void; + toJSON: () => JSONResponseOfGameMessage; + dumpPacket: () => string; } export interface GameMessageOpCode { - name: string; - value: number; - module: "Lobby" | "Login"; + name: string; + value: number; + module: "Lobby" | "Login"; } interface BuiltinError { - code: number; - message: string; + code: number; + message: string; } export interface PersonaRecord { - customerId: number; - id: Buffer; - maxPersonas: Buffer; - name: Buffer; - personaCount: Buffer; - shardId: Buffer; + customerId: number; + id: Buffer; + maxPersonas: Buffer; + name: Buffer; + personaCount: Buffer; + shardId: Buffer; } export interface UserRecordMini { - contextId: string; - customerId: number; - userId: number; + contextId: string; + customerId: number; + userId: number; } interface WebJSONResponse { - code: number; - headers: - | import("http").OutgoingHttpHeaders - | import("http").OutgoingHttpHeader[] - | undefined; - body: { connectionId: string; remoteAddress: string; inQueue: boolean }[]; + code: number; + headers: + | import("http").OutgoingHttpHeaders + | import("http").OutgoingHttpHeader[] + | undefined; + body: { connectionId: string; remoteAddress: string; inQueue: boolean }[]; } type WebConnectionHandler = ( - req: IncomingMessage, - res: ServerResponse, - config: Configuration, - log: import("pino").Logger, + req: IncomingMessage, + res: ServerResponse, + config: Configuration, + log: import("pino").Logger, ) => void; /** * @exports */ export interface RaceLobbyRecord { - lobbyId: number; - raceTypeId: number; - turfId: number; - riffName: string; - eTurfName: string; + lobbyId: number; + raceTypeId: number; + turfId: number; + riffName: string; + eTurfName: string; } export interface ServiceArgs { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; } type Service = ( - args: ServiceArgs, + args: ServiceArgs, ) => Promise; export interface KeypressEvent { - sequence: string; - name: string; - ctrl: boolean; - meta: boolean; - shift: boolean; + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; } export as namespace interfaces; diff --git a/packages/lobby/src/LoginInfoMessage.ts b/packages/lobby/src/LoginInfoMessage.ts index f4a848d94..3a87b32ec 100644 --- a/packages/lobby/src/LoginInfoMessage.ts +++ b/packages/lobby/src/LoginInfoMessage.ts @@ -1,104 +1,102 @@ import { ServerError } from "../../shared/errors/ServerError.js"; -import { - LegacyMessage, - deserializeString, - serializeString, -} from "../../shared/messageFactory.js"; +import { deserializeString } from "../../shared/deserializeString.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; +import { serializeString } from "../../shared/serializeString.js"; export class LoginInfoMessage extends LegacyMessage { - _userId: number; - _userName: string; - _userData: Buffer; - _customerId: number; - _flags: number; - _dllVersion: string; - _hostname: string; - _idAddress: string; - _hashKey: Buffer; - constructor() { - super(); - this._userId = 0; // 4 bytes - this._userName = ""; - this._userData = Buffer.alloc(64); - this._customerId = 0; // 4 bytes - this._flags = 0; // 4 bytes - this._dllVersion = ""; - this._hostname = ""; - this._idAddress = ""; - this._hashKey = Buffer.alloc(16); - } + _userId: number; + _userName: string; + _userData: Buffer; + _customerId: number; + _flags: number; + _dllVersion: string; + _hostname: string; + _idAddress: string; + _hashKey: Buffer; + constructor() { + super(); + this._userId = 0; // 4 bytes + this._userName = ""; + this._userData = Buffer.alloc(64); + this._customerId = 0; // 4 bytes + this._flags = 0; // 4 bytes + this._dllVersion = ""; + this._hostname = ""; + this._idAddress = ""; + this._hashKey = Buffer.alloc(16); + } - /** - * @param {Buffer} buffer - * @returns {LoginInfoMessage} - */ - override deserialize(buffer: Buffer): LoginInfoMessage { - try { - this._header._doDeserialize(buffer); - let offset = this._header._size; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length + 1; - buffer.copy(this._userData, 0, offset, offset + 64); - offset += 64; - this._customerId = buffer.readInt32BE(offset); - offset += 4; - this._flags = buffer.readInt32BE(offset); - offset += 4; - this._dllVersion = deserializeString(buffer.subarray(offset)); - offset += 4 + this._dllVersion.length + 1; - this._hostname = deserializeString(buffer.subarray(offset)); - offset += 4 + this._hostname.length + 1; - this._idAddress = deserializeString(buffer.subarray(offset)); - offset += 4 + this._idAddress.length + 1; - buffer.copy(this._hashKey, 0, offset, offset + 16); + /** + * @param {Buffer} buffer + * @returns {LoginInfoMessage} + */ + override deserialize(buffer: Buffer): LoginInfoMessage { + try { + this._header._doDeserialize(buffer); + let offset = this._header._size; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length + 1; + buffer.copy(this._userData, 0, offset, offset + 64); + offset += 64; + this._customerId = buffer.readInt32BE(offset); + offset += 4; + this._flags = buffer.readInt32BE(offset); + offset += 4; + this._dllVersion = deserializeString(buffer.subarray(offset)); + offset += 4 + this._dllVersion.length + 1; + this._hostname = deserializeString(buffer.subarray(offset)); + offset += 4 + this._hostname.length + 1; + this._idAddress = deserializeString(buffer.subarray(offset)); + offset += 4 + this._idAddress.length + 1; + buffer.copy(this._hashKey, 0, offset, offset + 16); - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing LoginInfoMessage", - ); - } - } + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing LoginInfoMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); - offset += 64; - buffer.writeInt32BE(this._customerId, offset); - offset += 4; - buffer.writeInt32BE(this._flags, offset); - offset += 4; - offset = serializeString(this._dllVersion, buffer, offset); + this._userData.copy(buffer, offset); + offset += 64; + buffer.writeInt32BE(this._customerId, offset); + offset += 4; + buffer.writeInt32BE(this._flags, offset); + offset += 4; + offset = serializeString(this._dllVersion, buffer, offset); - offset = serializeString(this._hostname, buffer, offset); + offset = serializeString(this._hostname, buffer, offset); - offset = serializeString(this._idAddress, buffer, offset); - offset += 4 + this._idAddress.length + 1; - this._hashKey.copy(buffer, offset); + offset = serializeString(this._idAddress, buffer, offset); + offset += 4 + this._idAddress.length + 1; + this._hashKey.copy(buffer, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - override toString() { - return `LoginInfoMessage: ${this._userName}`; - } + override toString() { + return `LoginInfoMessage: ${this._userName}`; + } } diff --git a/packages/lobby/src/UserInfoMessage.ts b/packages/lobby/src/UserInfoMessage.ts index 651185b46..ffe526c9e 100644 --- a/packages/lobby/src/UserInfoMessage.ts +++ b/packages/lobby/src/UserInfoMessage.ts @@ -1,131 +1,129 @@ import { ServerError } from "../../shared/errors/ServerError.js"; -import { - LegacyMessage, - deserializeString, - serializeString, -} from "../../shared/messageFactory.js"; +import { deserializeString } from "../../shared/deserializeString.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; +import { serializeString } from "../../shared/serializeString.js"; // eslint-disable-next-line no-unused-vars import { LoginInfoMessage } from "./LoginInfoMessage.js"; export class UserInfo { - _userId: number; - _userName: string; - _userData: Buffer; - constructor() { - this._userId = 0; // 4 bytes - this._userName = ""; // 4 bytes + string + 1 byte - this._userData = Buffer.alloc(64); // 64 bytes - } + _userId: number; + _userName: string; + _userData: Buffer; + constructor() { + this._userId = 0; // 4 bytes + this._userName = ""; // 4 bytes + string + 1 byte + this._userData = Buffer.alloc(64); // 64 bytes + } - deserialize(buffer: Buffer) { - let offset = 0; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length; - buffer.copy(this._userData, 0, offset, offset + 64); - return this; - } + deserialize(buffer: Buffer) { + let offset = 0; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length; + buffer.copy(this._userData, 0, offset, offset + 64); + return this; + } - serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); - return buffer; - } + this._userData.copy(buffer, offset); + return buffer; + } - size() { - let size = 4; // userId - size += 4 + this._userName.length + 1; - size += this._userData.length; - return size; - } + size() { + let size = 4; // userId + size += 4 + this._userName.length + 1; + size += this._userData.length; + return size; + } } export class UserInfoMessage extends LegacyMessage { - _userId: number; - _userName: string; - _userData: Buffer; - constructor() { - super(); - this._userId = 0; // 4 bytes - this._userName = ""; // 4 bytes + string + 1 byte - this._userData = Buffer.alloc(64); // 64 bytes - } + _userId: number; + _userName: string; + _userData: Buffer; + constructor() { + super(); + this._userId = 0; // 4 bytes + this._userName = ""; // 4 bytes + string + 1 byte + this._userData = Buffer.alloc(64); // 64 bytes + } - /** - * @param {Buffer} buffer - * @returns {UserInfoMessage} - */ - override deserialize(buffer: Buffer): this { - try { - this._header._doDeserialize(buffer); - let offset = this._header._size; - this._userId = buffer.readInt32BE(offset); - offset += 4; - this._userName = deserializeString(buffer.subarray(offset)); - offset += 4 + this._userName.length + 1; - buffer.copy(this._userData, 0, offset, offset + 64); + /** + * @param {Buffer} buffer + * @returns {UserInfoMessage} + */ + override deserialize(buffer: Buffer): this { + try { + this._header._doDeserialize(buffer); + let offset = this._header._size; + this._userId = buffer.readInt32BE(offset); + offset += 4; + this._userName = deserializeString(buffer.subarray(offset)); + offset += 4 + this._userName.length + 1; + buffer.copy(this._userData, 0, offset, offset + 64); - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing LoginInfoMessage", - ); - } - } + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing LoginInfoMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; - buffer.writeInt32BE(this._userId, offset); - offset += 4; - offset = serializeString(this._userName, buffer, offset); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; + buffer.writeInt32BE(this._userId, offset); + offset += 4; + offset = serializeString(this._userName, buffer, offset); - this._userData.copy(buffer, offset); + this._userData.copy(buffer, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - /** - * @param {LoginInfoMessage} loginInfoMessage - */ - fromLoginInfoMessage(loginInfoMessage: LoginInfoMessage) { - this._userId = loginInfoMessage._userId; - this._userName = loginInfoMessage._userName; - this._userData = loginInfoMessage._userData; - this._header.length = this.calculateLength(); - return this; - } + /** + * @param {LoginInfoMessage} loginInfoMessage + */ + fromLoginInfoMessage(loginInfoMessage: LoginInfoMessage) { + this._userId = loginInfoMessage._userId; + this._userName = loginInfoMessage._userName; + this._userData = loginInfoMessage._userData; + this._header.length = this.calculateLength(); + return this; + } - calculateLength() { - this._header._size = 4 + 4 + 64; - this._header.length += 4 + this._userName.length + 1; - this._header.length += this._userData.length; - return this._header.length; - } + calculateLength() { + this._header._size = 4 + 4 + 64; + this._header.length += 4 + this._userName.length + 1; + this._header.length += this._userData.length; + return this._header.length; + } - override toString() { - return `UserInfoMessage: ${JSON.stringify({ - userId: this._userId, - userName: this._userName, - userData: this._userData.toString("hex"), - })}`; - } + override toString() { + return `UserInfoMessage: ${JSON.stringify({ + userId: this._userId, + userName: this._userName, + userData: this._userData.toString("hex"), + })}`; + } } diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 2e1a6651a..4972c02c0 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -2,52 +2,57 @@ import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "../../../shared/log.js"; -import { LegacyMessage } from "../../../shared/messageFactory.js"; +import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { UserInfo } from "../UserInfoMessage.js"; export async function _setMyUserData({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; - - try { - log.debug("Handling NPS_SET_MY_USER_DATA"); - log.debug(`Received command: ${message.serialize().toString("hex")}`); - - const incomingMessage = new UserInfo(); - incomingMessage.deserialize(message.serialize()); - - log.debug(`User ID: ${incomingMessage._userId}`); - - // Get the database instance - const db = getDatabaseServer(); - - // Update the user's data - db.updateUser({ - userId: incomingMessage._userId, - userData: incomingMessage._userData, - }); - - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._header.id = 516; - packetResult.deserialize(incomingMessage.serialize()); - - log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); - - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown(error, "Error handling NPS_SET_MY_USER_DATA"); - } + log.level = getServerConfiguration({}).logLevel ?? "info"; + + try { + log.debug("Handling NPS_SET_MY_USER_DATA"); + log.debug(`Received command: ${message.serialize().toString("hex")}`); + + const incomingMessage = new UserInfo(); + incomingMessage.deserialize(message.serialize()); + + log.debug(`User ID: ${incomingMessage._userId}`); + + // Get the database instance + const db = getDatabaseServer(); + + // Update the user's data + db.updateUser({ + userId: incomingMessage._userId, + userData: incomingMessage._userData, + }); + + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._header.id = 516; + packetResult.deserialize(incomingMessage.serialize()); + + log.debug( + `Sending response: ${packetResult.serialize().toString("hex")}`, + ); + + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error handling NPS_SET_MY_USER_DATA", + ); + } } diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index e008f3c1b..2e01cd234 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -1,16 +1,14 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { - fetchStateFromDatabase, - getEncryption, - updateEncryption, + fetchStateFromDatabase, + getEncryption, + updateEncryption, } from "../../../shared/State.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "../../../shared/log.js"; -import { - LegacyMessage, - MessageBuffer, - SerializedBuffer, -} from "../../../shared/messageFactory.js"; +import { MessageBuffer } from "../../../shared/MessageBuffer.js"; +import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { _setMyUserData } from "./_setMyUserData.js"; import { handleGetMiniUserList } from "./handleGetMiniUserList.js"; import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; @@ -32,16 +30,16 @@ import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = []; /** @@ -57,41 +55,41 @@ export const messageHandlers: { * }>} */ async function encryptCmd({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage | MessageBuffer; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage | MessageBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: LegacyMessage | MessageBuffer; + connectionId: string; + message: LegacyMessage | MessageBuffer; }> { - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const encryption = getEncryption(state, connectionId); + const encryption = getEncryption(state, connectionId); - if (typeof encryption === "undefined") { - throw new ServerError( - `Unable to locate encryption session for connection id ${connectionId}`, - ); - } + if (typeof encryption === "undefined") { + throw new ServerError( + `Unable to locate encryption session for connection id ${connectionId}`, + ); + } - const result = encryption.commandEncryption.encrypt(message.data); + const result = encryption.commandEncryption.encrypt(message.data); - updateEncryption(state, encryption).save(); + updateEncryption(state, encryption).save(); - log.debug(`[ciphered Cmd: ${result.toString("hex")}`); + log.debug(`[ciphered Cmd: ${result.toString("hex")}`); - message.setBuffer(result); + message.setBuffer(result); - return { - connectionId, - message, - }; + return { + connectionId, + message, + }; } /** @@ -107,72 +105,72 @@ async function encryptCmd({ * }>} */ async function decryptCmd({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: LegacyMessage; + connectionId: string; + message: LegacyMessage; }> { - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const encryption = getEncryption(state, connectionId); + const encryption = getEncryption(state, connectionId); - if (typeof encryption === "undefined") { - throw new ServerError( - `Unable to locate encryption session for connection id ${connectionId}`, - ); - } + if (typeof encryption === "undefined") { + throw new ServerError( + `Unable to locate encryption session for connection id ${connectionId}`, + ); + } - const result = encryption.commandEncryption.decrypt(message.data); + const result = encryption.commandEncryption.decrypt(message.data); - updateEncryption(state, encryption).save(); + updateEncryption(state, encryption).save(); - log.debug(`[Deciphered Cmd: ${result.toString("hex")}`); + log.debug(`[Deciphered Cmd: ${result.toString("hex")}`); - message.setBuffer(result); + message.setBuffer(result); - return { - connectionId, - message, - }; + return { + connectionId, + message, + }; } export type NpsCommandHandler = { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: LegacyMessage; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - message: LegacyMessage; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + message: LegacyMessage; + }>; }; const npsCommandHandlers: NpsCommandHandler[] = [ - { - opCode: 0x128, - name: "NPS_GET_MINI_USER_LIST", - handler: handleGetMiniUserList, - }, - { - opCode: 0x30c, - name: "NPS_SEND_MINI_RIFF_LIST", - handler: handleSendMiniRiffList, - }, - { - opCode: 0x103, - name: "NPS_SET_MY_USER_DATA", - handler: _setMyUserData, - }, + { + opCode: 0x128, + name: "NPS_GET_MINI_USER_LIST", + handler: handleGetMiniUserList, + }, + { + opCode: 0x30c, + name: "NPS_SEND_MINI_RIFF_LIST", + handler: handleSendMiniRiffList, + }, + { + opCode: 0x103, + name: "NPS_SET_MY_USER_DATA", + handler: _setMyUserData, + }, ]; /** @@ -188,42 +186,42 @@ const npsCommandHandlers: NpsCommandHandler[] = [ * }>}} */ async function handleCommand({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - message: MessageBuffer | LegacyMessage; + connectionId: string; + message: MessageBuffer | LegacyMessage; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - const incommingRequest = message; + log.level = getServerConfiguration({}).logLevel ?? "info"; + const incommingRequest = message; - log.debug( - `Received command: ${incommingRequest._doSerialize().toString("hex")}`, - ); + log.debug( + `Received command: ${incommingRequest._doSerialize().toString("hex")}`, + ); - // What is the command? - const command = incommingRequest.data.readUInt16BE(0); + // What is the command? + const command = incommingRequest.data.readUInt16BE(0); - log.debug(`Command: ${command}`); + log.debug(`Command: ${command}`); - const handler = npsCommandHandlers.find((h) => h.opCode === command); + const handler = npsCommandHandlers.find((h) => h.opCode === command); - if (typeof handler === "undefined") { - throw new ServerError(`Unknown command: ${command}`); - } + if (typeof handler === "undefined") { + throw new ServerError(`Unknown command: ${command}`); + } - return handler.handler({ - connectionId, - message, - log, - }); + return handler.handler({ + connectionId, + message, + log, + }); } /** @@ -240,64 +238,64 @@ async function handleCommand({ */ export async function handleEncryptedNPSCommand({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - - const inboundMessage = new LegacyMessage(); - inboundMessage._doDeserialize(message.data); - - // Decipher - const decipheredMessage = decryptCmd({ - connectionId, - message: inboundMessage, - log, - }); - - const response = handleCommand({ - connectionId, - message: (await decipheredMessage).message, - log, - }); - - // Encipher - const encryptedResponse = encryptCmd({ - connectionId, - message: (await response).message, - log, - }); - - const outboundMessage = new SerializedBuffer(); - outboundMessage.setBuffer((await encryptedResponse).message.serialize()); - - return { - connectionId, - messages: [outboundMessage], - }; + log.level = getServerConfiguration({}).logLevel ?? "info"; + + const inboundMessage = new LegacyMessage(); + inboundMessage._doDeserialize(message.data); + + // Decipher + const decipheredMessage = decryptCmd({ + connectionId, + message: inboundMessage, + log, + }); + + const response = handleCommand({ + connectionId, + message: (await decipheredMessage).message, + log, + }); + + // Encipher + const encryptedResponse = encryptCmd({ + connectionId, + message: (await response).message, + log, + }); + + const outboundMessage = new SerializedBuffer(); + outboundMessage.setBuffer((await encryptedResponse).message.serialize()); + + return { + connectionId, + messages: [outboundMessage], + }; } export const channelRecordSize = 40; export const channels = [ - { - id: 0, - name: "Channel 1", - population: 1, - }, - { - id: 191, - name: "MCCHAT", - population: 0, - }, + { + id: 0, + name: "Channel 1", + population: 1, + }, + { + id: 191, + name: "MCCHAT", + population: 0, + }, ]; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index a7be8eef6..3bff16086 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -1,11 +1,9 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "../../../shared/log.js"; -import { - GameMessage, - LegacyMessage, - serializeString, -} from "../../../shared/messageFactory.js"; +import { GameMessage } from "../../../shared/GameMessage.js"; +import { LegacyMessage } from "../../../shared/LegacyMessage.js"; +import { serializeString } from "../../../shared/serializeString.js"; import { UserInfo } from "../UserInfoMessage.js"; import { channelRecordSize, channels } from "./encryptedCommand.js"; @@ -20,60 +18,65 @@ user1._userName = "User 1"; */ export async function handleGetMiniUserList({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_GET_MINI_USER_LIST"); - log.debug(`Received command: ${message._doSerialize().toString("hex")}`); + log.debug("Handling NPS_GET_MINI_USER_LIST"); + log.debug(`Received command: ${message._doSerialize().toString("hex")}`); - const outgoingGameMessage = new GameMessage(553); + const outgoingGameMessage = new GameMessage(553); - const resultSize = channelRecordSize * channels.length - 12; + const resultSize = channelRecordSize * channels.length - 12; - const packetContent = Buffer.alloc(resultSize); + const packetContent = Buffer.alloc(resultSize); - let offset = 0; - try { - // Add the response code - packetContent.writeUInt32BE(17, offset); - offset += 4; // offset is 8 + let offset = 0; + try { + // Add the response code + packetContent.writeUInt32BE(17, offset); + offset += 4; // offset is 8 - packetContent.writeUInt32BE(1, offset); - offset += 4; // offset is 12 + packetContent.writeUInt32BE(1, offset); + offset += 4; // offset is 12 - // Write the count of users - packetContent.writeUInt32BE(1, offset); - offset += 4; // offset is 16 + // Write the count of users + packetContent.writeUInt32BE(1, offset); + offset += 4; // offset is 16 - // write the persona id - packetContent.writeUInt32BE(user1._userId, offset); - offset += 4; // offset is 20 + // write the persona id + packetContent.writeUInt32BE(user1._userId, offset); + offset += 4; // offset is 20 - // write the persona name - serializeString(user1._userName, packetContent, offset); + // write the persona name + serializeString(user1._userName, packetContent, offset); - outgoingGameMessage.setRecordData(packetContent); + outgoingGameMessage.setRecordData(packetContent); - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._doDeserialize(outgoingGameMessage.serialize()); + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._doDeserialize(outgoingGameMessage.serialize()); - log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); + log.debug( + `Sending response: ${packetResult.serialize().toString("hex")}`, + ); - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown(error, "Error handling NPS_MINI_USER_LIST"); - } + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error handling NPS_MINI_USER_LIST", + ); + } } diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index 1a73f3656..4163a6ca4 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -1,11 +1,9 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "../../../shared/log.js"; -import { - GameMessage, - LegacyMessage, - serializeString, -} from "../../../shared/messageFactory.js"; +import { GameMessage } from "../../../shared/GameMessage.js"; +import { LegacyMessage } from "../../../shared/LegacyMessage.js"; +import { serializeString } from "../../../shared/serializeString.js"; import { channelRecordSize, channels } from "./encryptedCommand.js"; // const users = [user1]; @@ -16,58 +14,60 @@ import { channelRecordSize, channels } from "./encryptedCommand.js"; * @param {import("pino").Logger} [args.log=getServerLogger({ module: "Lobby" })] */ export async function handleSendMiniRiffList({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }) { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_SEND_MINI_RIFF_LIST"); - log.debug(`Received command: ${message._doSerialize().toString("hex")}`); + log.debug("Handling NPS_SEND_MINI_RIFF_LIST"); + log.debug(`Received command: ${message._doSerialize().toString("hex")}`); - const outgoingGameMessage = new GameMessage(1028); + const outgoingGameMessage = new GameMessage(1028); - const resultSize = channelRecordSize * channels.length - 12; + const resultSize = channelRecordSize * channels.length - 12; - const packetContent = Buffer.alloc(resultSize); + const packetContent = Buffer.alloc(resultSize); - let offset = 0; - try { - packetContent.writeUInt32BE(channels.length, offset); - offset += 4; // offset is 8 + let offset = 0; + try { + packetContent.writeUInt32BE(channels.length, offset); + offset += 4; // offset is 8 - // loop through the channels - for (const channel of channels) { - offset = serializeString(channel.name, packetContent, offset); + // loop through the channels + for (const channel of channels) { + offset = serializeString(channel.name, packetContent, offset); - packetContent.writeUInt32BE(channel.id, offset); - offset += 4; - packetContent.writeUInt16BE(channel.population, offset); - offset += 2; - } + packetContent.writeUInt32BE(channel.id, offset); + offset += 4; + packetContent.writeUInt16BE(channel.population, offset); + offset += 2; + } - outgoingGameMessage.setRecordData(packetContent); + outgoingGameMessage.setRecordData(packetContent); - // Build the packet - const packetResult = new LegacyMessage(); - packetResult._doDeserialize(outgoingGameMessage.serialize()); + // Build the packet + const packetResult = new LegacyMessage(); + packetResult._doDeserialize(outgoingGameMessage.serialize()); - log.debug(`Sending response: ${packetResult.serialize().toString("hex")}`); + log.debug( + `Sending response: ${packetResult.serialize().toString("hex")}`, + ); - return { - connectionId, - message: packetResult, - }; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error handling NPS_SEND_MINI_RIFF_LIST", - ); - } + return { + connectionId, + message: packetResult, + }; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error handling NPS_SEND_MINI_RIFF_LIST", + ); + } } diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index 95e634c6a..7426b7418 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -1,30 +1,30 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { getServerLogger } from "../../../shared/log.js"; -import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; export async function handleTrackingPing({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug("Handling NPS_TRACKING_PING"); - log.debug(`Received command: ${message.toString()}`); + log.debug("Handling NPS_TRACKING_PING"); + log.debug(`Received command: ${message.toString()}`); - log.debug("Skipping response"); + log.debug("Skipping response"); - return { - connectionId, - messages: [], - }; + return { + connectionId, + messages: [], + }; } diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index e691296d2..bb6ff783d 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -4,17 +4,17 @@ import { getServerLogger } from "../../../shared/log.js"; import { LoginInfoMessage } from "../LoginInfoMessage.js"; import { - createCommandEncryptionPair, - createDataEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, } from "../../../gateway/src/encryption.js"; import { - McosEncryption, - addEncryption, - fetchStateFromDatabase, - getEncryption, + McosEncryption, + addEncryption, + fetchStateFromDatabase, + getEncryption, } from "../../../shared/State.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; import { UserInfoMessage } from "../UserInfoMessage.js"; /** @@ -25,12 +25,12 @@ import { UserInfoMessage } from "../UserInfoMessage.js"; * @return {string} */ export function toHex(data: Buffer): string { - /** @type {string[]} */ - const bytes: string[] = []; - data.forEach((b: number) => { - bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); - }); - return bytes.join(""); + /** @type {string[]} */ + const bytes: string[] = []; + data.forEach((b: number) => { + bytes.push(b.toString(16).toUpperCase().padStart(2, "0")); + }); + return bytes.join(""); } /** @@ -44,93 +44,95 @@ export function toHex(data: Buffer): string { * }>} */ export async function _npsRequestGameConnectServer({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: import("../../../interfaces/index.js").ServiceArgs): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - // This is a NPS_LoginInfo packet - // As a legacy packet, it used the old NPSMessage format - // of a 4 byte header, followed by a 4 byte length, followed - // by the data payload. - - const inboundMessage = new LoginInfoMessage(); - inboundMessage.deserialize(message.data); - - log.debug(`LoginInfoMessage: ${inboundMessage.toString()}`); - - const personas = await getPersonasByPersonaId({ - id: inboundMessage._userId, - }); - if (typeof personas[0] === "undefined") { - const err = new ServerError("No personas found."); - throw err; - } - - const { customerId } = personas[0]; - - const state = fetchStateFromDatabase(); - - const existingEncryption = getEncryption(state, connectionId); - - if (!existingEncryption) { - // Set the encryption keys on the lobby connection - const databaseManager = getDatabaseServer({ log }); - const keys = await databaseManager - .fetchSessionKeyByCustomerId(customerId) - .catch((/** @type {unknown} */ error: unknown) => { - throw new ServerError( - `Unable to fetch session key for customerId ${customerId.toString()}: ${String( - error, - )}`, - ); - }); - if (keys === undefined) { - throw new ServerError("Error fetching session keys!"); - } - - // We have the session keys, set them on the connection - try { - const newCommandEncryptionPair = createCommandEncryptionPair( - keys.sessionKey, - ); - - const newDataEncryptionPair = createDataEncryptionPair(keys.sessionKey); - - const newEncryption = new McosEncryption({ - connectionId, - commandEncryptionPair: newCommandEncryptionPair, - dataEncryptionPair: newDataEncryptionPair, - }); - - addEncryption(state, newEncryption).save(); - } catch (error) { - throw new ServerError(`Error creating encryption: ${error}`); - } - } - - // We have a session, we are good to go! - // Send the response packet - - const responsePacket = new UserInfoMessage(); - responsePacket.fromLoginInfoMessage(inboundMessage); - - responsePacket._header.id = 0x120; - - // log the packet - log.debug( - `!!! outbound lobby login response packet: ${responsePacket.toString()}`, - ); - - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket.serialize()); - - return { - connectionId, - messages: [outboundMessage], - }; + // This is a NPS_LoginInfo packet + // As a legacy packet, it used the old NPSMessage format + // of a 4 byte header, followed by a 4 byte length, followed + // by the data payload. + + const inboundMessage = new LoginInfoMessage(); + inboundMessage.deserialize(message.data); + + log.debug(`LoginInfoMessage: ${inboundMessage.toString()}`); + + const personas = await getPersonasByPersonaId({ + id: inboundMessage._userId, + }); + if (typeof personas[0] === "undefined") { + const err = new ServerError("No personas found."); + throw err; + } + + const { customerId } = personas[0]; + + const state = fetchStateFromDatabase(); + + const existingEncryption = getEncryption(state, connectionId); + + if (!existingEncryption) { + // Set the encryption keys on the lobby connection + const databaseManager = getDatabaseServer({ log }); + const keys = await databaseManager + .fetchSessionKeyByCustomerId(customerId) + .catch((/** @type {unknown} */ error: unknown) => { + throw new ServerError( + `Unable to fetch session key for customerId ${customerId.toString()}: ${String( + error, + )}`, + ); + }); + if (keys === undefined) { + throw new ServerError("Error fetching session keys!"); + } + + // We have the session keys, set them on the connection + try { + const newCommandEncryptionPair = createCommandEncryptionPair( + keys.sessionKey, + ); + + const newDataEncryptionPair = createDataEncryptionPair( + keys.sessionKey, + ); + + const newEncryption = new McosEncryption({ + connectionId, + commandEncryptionPair: newCommandEncryptionPair, + dataEncryptionPair: newDataEncryptionPair, + }); + + addEncryption(state, newEncryption).save(); + } catch (error) { + throw new ServerError(`Error creating encryption: ${error}`); + } + } + + // We have a session, we are good to go! + // Send the response packet + + const responsePacket = new UserInfoMessage(); + responsePacket.fromLoginInfoMessage(inboundMessage); + + responsePacket._header.id = 0x120; + + // log the packet + log.debug( + `!!! outbound lobby login response packet: ${responsePacket.toString()}`, + ); + + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket.serialize()); + + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index d5cf07d24..ba75b5f1b 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -17,11 +17,9 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; -import { - LegacyMessage, - NPSMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { NPSMessage } from "../../shared/NPSMessage.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { handleEncryptedNPSCommand } from "./handlers/encryptedCommand.js"; import { handleTrackingPing } from "./handlers/handleTrackingPing.js"; import { _npsRequestGameConnectServer } from "./handlers/requestConnectGameServer.js"; @@ -42,32 +40,32 @@ import { _npsRequestGameConnectServer } from "./handlers/requestConnectGameServe * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 256, // 0x100 - name: "User login", - handler: _npsRequestGameConnectServer, - }, - { - opCode: 4353, // 0x1101 - name: "Encrypted command", - handler: handleEncryptedNPSCommand, - }, - { - opCode: 535, // 0x0217 - name: "Tracking ping", - handler: handleTrackingPing, - }, + { + opCode: 256, // 0x100 + name: "User login", + handler: _npsRequestGameConnectServer, + }, + { + opCode: 4353, // 0x1101 + name: "Encrypted command", + handler: handleEncryptedNPSCommand, + }, + { + opCode: 535, // 0x0217 + name: "Tracking ping", + handler: handleTrackingPing, + }, ]; /** @@ -82,70 +80,70 @@ export const messageHandlers: { * @throws {Error} Unknown code was received */ export async function receiveLobbyData({ - connectionId, - message, - log = getServerLogger({ - module: "Lobby", - }), + connectionId, + message, + log = getServerLogger({ + module: "Lobby", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; + log.level = getServerConfiguration({}).logLevel ?? "info"; - /** @type {LegacyMessage | NPSMessage} */ - let inboundMessage: LegacyMessage | NPSMessage; + /** @type {LegacyMessage | NPSMessage} */ + let inboundMessage: LegacyMessage | NPSMessage; - // Check data length - const dataLength = message.data.length; + // Check data length + const dataLength = message.data.length; - if (dataLength < 4) { - throw new ServerError( - `Data length ${dataLength} is too short to deserialize`, - ); - } + if (dataLength < 4) { + throw new ServerError( + `Data length ${dataLength} is too short to deserialize`, + ); + } - if (dataLength > 12) { - inboundMessage = new NPSMessage(); - } else { - inboundMessage = new LegacyMessage(); - } + if (dataLength > 12) { + inboundMessage = new NPSMessage(); + } else { + inboundMessage = new LegacyMessage(); + } - inboundMessage._doDeserialize(message.data); + inboundMessage._doDeserialize(message.data); - const { data } = message; - log.debug( - `Received Lobby packet', + const { data } = message; + log.debug( + `Received Lobby packet', ${JSON.stringify({ - data: data.toString("hex"), - })}`, - ); + data: data.toString("hex"), + })}`, + ); - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } - try { - const result = await supportedHandler.handler({ - connectionId, - message, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving receiveLobbyData"); - return result; - } catch (error) { - throw new ServerError(`Error handling lobby data: ${String(error)}`); - } + try { + const result = await supportedHandler.handler({ + connectionId, + message, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving receiveLobbyData"); + return result; + } catch (error) { + throw new ServerError(`Error handling lobby data: ${String(error)}`); + } } diff --git a/packages/login/src/NPSUserStatus.ts b/packages/login/src/NPSUserStatus.ts index 2634ca949..2253e8ab2 100644 --- a/packages/login/src/NPSUserStatus.ts +++ b/packages/login/src/NPSUserStatus.ts @@ -4,7 +4,7 @@ import { readFileSync } from "node:fs"; import { Logger } from "pino"; import { Configuration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { LegacyMessage } from "../../shared/messageFactory.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** * @typedef {import("../../shared/Configuration.js").Configuration} Configuration @@ -32,105 +32,109 @@ import { LegacyMessage } from "../../shared/messageFactory.js"; */ export class NPSUserStatus extends LegacyMessage { - _config: Configuration; - log: Logger; - sessionKey: string; - opCode: number; - contextId: string; - buffer: Buffer; - /** - * - * @param {Buffer} packet - * @param {Configuration} config - * @param {import("pino").Logger} log - */ - constructor( - packet: Buffer, - config: Configuration, - log: import("pino").Logger, - ) { - super(); - this._config = config; - this.log = log; - log.debug("Constructing NPSUserStatus"); - this._header._doDeserialize(packet); - this.sessionKey = ""; + _config: Configuration; + log: Logger; + sessionKey: string; + opCode: number; + contextId: string; + buffer: Buffer; + /** + * + * @param {Buffer} packet + * @param {Configuration} config + * @param {import("pino").Logger} log + */ + constructor( + packet: Buffer, + config: Configuration, + log: import("pino").Logger, + ) { + super(); + this._config = config; + this.log = log; + log.debug("Constructing NPSUserStatus"); + this._header._doDeserialize(packet); + this.sessionKey = ""; - // Save the NPS opCode - this.opCode = packet.readInt16BE(0); + // Save the NPS opCode + this.opCode = packet.readInt16BE(0); - // Save the contextId - this.contextId = packet.subarray(14, 48).toString(); + // Save the contextId + this.contextId = packet.subarray(14, 48).toString(); - // Save the raw packet - this.buffer = packet; - } + // Save the raw packet + this.buffer = packet; + } - /** - * ExtractSessionKeyFromPacket - * - * Take 128 bytes - * They are the utf-8 of the hex bytes that are the key - * - * @param {Buffer} rawPacket - * @return {void} - */ - extractSessionKeyFromPacket(rawPacket: Buffer): void { - this.log.debug("Extracting key"); + /** + * ExtractSessionKeyFromPacket + * + * Take 128 bytes + * They are the utf-8 of the hex bytes that are the key + * + * @param {Buffer} rawPacket + * @return {void} + */ + extractSessionKeyFromPacket(rawPacket: Buffer): void { + this.log.debug("Extracting key"); - // Extract the session key which is 128 acsii characters (256 bytes) - const sessionKeyAsAscii = rawPacket.subarray(52, 308).toString("utf8"); - this.log.trace(`Session key: ${sessionKeyAsAscii}`); + // Extract the session key which is 128 acsii characters (256 bytes) + const sessionKeyAsAscii = rawPacket.subarray(52, 308).toString("utf8"); + this.log.trace(`Session key: ${sessionKeyAsAscii}`); - // length of the session key should be 128 bytes - const sessionkeyString = Buffer.from(sessionKeyAsAscii, "hex"); - // Decrypt the sessionkey - try { - if (!this._config.privateKeyFile) { - throw new ServerError("No private key file specified"); - } - const privatekeyContents = readFileSync(this._config.privateKeyFile); + // length of the session key should be 128 bytes + const sessionkeyString = Buffer.from(sessionKeyAsAscii, "hex"); + // Decrypt the sessionkey + try { + if (!this._config.privateKeyFile) { + throw new ServerError("No private key file specified"); + } + const privatekeyContents = readFileSync( + this._config.privateKeyFile, + ); - const decrypted = privateDecrypt( - { - key: privatekeyContents, - }, - sessionkeyString, - ); // length of decrypted should be 128 bytes - this.sessionKey = decrypted.subarray(2, -4).toString("hex"); // length of session key should be 12 bytes - } catch (error) { - this.log.trace(`Session key: ${sessionkeyString.toString("utf8")}`); // 128 bytes - this.log.trace(`decrypted: ${this.sessionKey}`); // 12 bytes - this.log.error(`Error decrypting session key: ${String(error)}`); - throw new ServerError(`Unable to extract session key: ${String(error)}`); - } - } + const decrypted = privateDecrypt( + { + key: privatekeyContents, + }, + sessionkeyString, + ); // length of decrypted should be 128 bytes + this.sessionKey = decrypted.subarray(2, -4).toString("hex"); // length of session key should be 12 bytes + } catch (error) { + this.log.trace(`Session key: ${sessionkeyString.toString("utf8")}`); // 128 bytes + this.log.trace(`decrypted: ${this.sessionKey}`); // 12 bytes + this.log.error(`Error decrypting session key: ${String(error)}`); + throw new ServerError( + `Unable to extract session key: ${String(error)}`, + ); + } + } - toJSON() { - this.log.debug("Returning as JSON"); - return { - msgNo: this._header.id, - msgLength: this._header.length, - content: this.data.toString("hex"), - contextId: this.contextId, - sessionKey: this.sessionKey, - rawBuffer: this.buffer.toString("hex"), - }; - } + toJSON() { + this.log.debug("Returning as JSON"); + return { + msgNo: this._header.id, + msgLength: this._header.length, + content: this.data.toString("hex"), + contextId: this.contextId, + sessionKey: this.sessionKey, + rawBuffer: this.buffer.toString("hex"), + }; + } - /** - * @return {string} - */ - dumpPacket(): string { - this.log.debug("Returning as string"); - let message = this._header.toString(); - message = message.concat( - `NPSUserStatus, + /** + * @return {string} + */ + dumpPacket(): string { + this.log.debug("Returning as string"); + let message = this._header.toString(); + message = message.concat( + `NPSUserStatus, ${JSON.stringify({ - contextId: this.contextId, - sessionkey: this.sessionKey, - })}`, - ); - return message; - } + contextId: this.contextId, + sessionkey: this.sessionKey, + })}`, + ); + return message; + } } diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index d5f727f74..f38861d38 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -18,108 +18,110 @@ import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { DatabaseManager } from "../../interfaces/index.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; -import { NPSMessage } from "../../shared/messageFactory.js"; +import { NPSMessage } from "../../shared/NPSMessage.js"; import { handleLoginData } from "./internal.js"; /** * Please use {@link LoginServer.getInstance()} */ export class LoginServer { - databaseManager: DatabaseManager; - _log: any; - static _instance: LoginServer | undefined; - /** - * Please use {@see LoginServer.getInstance} instead - * @param {object} options - * @param {import("../../interfaces/index.js").DatabaseManager} options.database - * @param {import("pino").Logger} [options.log=getServerLogger({ module: "LoginServer" })] - * @memberof LoginServer - */ - constructor({ - database = getDatabaseServer(), - log = getServerLogger({ - module: "LoginServer", - }), - }: { - database: import("../../interfaces/index.js").DatabaseManager; - log?: import("pino").Logger; - }) { - this.databaseManager = database; - this._log = log; - LoginServer._instance = this; - } + databaseManager: DatabaseManager; + _log: any; + static _instance: LoginServer | undefined; + /** + * Please use {@see LoginServer.getInstance} instead + * @param {object} options + * @param {import("../../interfaces/index.js").DatabaseManager} options.database + * @param {import("pino").Logger} [options.log=getServerLogger({ module: "LoginServer" })] + * @memberof LoginServer + */ + constructor({ + database = getDatabaseServer(), + log = getServerLogger({ + module: "LoginServer", + }), + }: { + database: import("../../interfaces/index.js").DatabaseManager; + log?: import("pino").Logger; + }) { + this.databaseManager = database; + this._log = log; + LoginServer._instance = this; + } - /** - * Get the single instance of the login server - * - * @static - * @param {import("../../interfaces/index.js").DatabaseManager} database - * @param {import("pino").Logger} log - * @return {LoginServer} - */ - static getInstance( - database: import("../../interfaces/index.js").DatabaseManager, - log: import("pino").Logger, - ): LoginServer { - if (typeof LoginServer._instance === "undefined") { - LoginServer._instance = new LoginServer({ - database, - log, - }); - } - return LoginServer._instance; - } + /** + * Get the single instance of the login server + * + * @static + * @param {import("../../interfaces/index.js").DatabaseManager} database + * @param {import("pino").Logger} log + * @return {LoginServer} + */ + static getInstance( + database: import("../../interfaces/index.js").DatabaseManager, + log: import("pino").Logger, + ): LoginServer { + if (typeof LoginServer._instance === "undefined") { + LoginServer._instance = new LoginServer({ + database, + log, + }); + } + return LoginServer._instance; + } - /** - * - * @param {string} contextId - * @return {import("../../interfaces/index.js").UserRecordMini} - */ - _npsGetCustomerIdByContextId( - contextId: string, - ): import("../../interfaces/index.js").UserRecordMini { - this._log.debug(">>> _npsGetCustomerIdByContextId"); - /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ - const users: import("../../interfaces/index.js").UserRecordMini[] = [ - { - contextId: "5213dee3a6bcdb133373b2d4f3b9962758", - customerId: 0x0012808b, - userId: 0x00000002, - }, - { - contextId: "d316cd2dd6bf870893dfbaaf17f965884e", - customerId: 0x0054b46c, - userId: 0x00000001, - }, - ]; - if (contextId.toString() === "") { - const err = new ServerError(`Unknown contextId: ${contextId.toString()}`); - throw err; - } + /** + * + * @param {string} contextId + * @return {import("../../interfaces/index.js").UserRecordMini} + */ + _npsGetCustomerIdByContextId( + contextId: string, + ): import("../../interfaces/index.js").UserRecordMini { + this._log.debug(">>> _npsGetCustomerIdByContextId"); + /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ + const users: import("../../interfaces/index.js").UserRecordMini[] = [ + { + contextId: "5213dee3a6bcdb133373b2d4f3b9962758", + customerId: 0x0012808b, + userId: 0x00000002, + }, + { + contextId: "d316cd2dd6bf870893dfbaaf17f965884e", + customerId: 0x0054b46c, + userId: 0x00000001, + }, + ]; + if (contextId.toString() === "") { + const err = new ServerError( + `Unknown contextId: ${contextId.toString()}`, + ); + throw err; + } - const userRecord = users.filter((user) => user.contextId === contextId); - if (typeof userRecord[0] === "undefined" || userRecord.length !== 1) { - this._log.debug( - `preparing to leave _npsGetCustomerIdByContextId after not finding record', + const userRecord = users.filter((user) => user.contextId === contextId); + if (typeof userRecord[0] === "undefined" || userRecord.length !== 1) { + this._log.debug( + `preparing to leave _npsGetCustomerIdByContextId after not finding record', ${JSON.stringify({ - contextId, - })}`, - ); - const err = new ServerError( - `Unable to locate user record matching contextId ${contextId}`, - ); - throw err; - } + contextId, + })}`, + ); + const err = new ServerError( + `Unable to locate user record matching contextId ${contextId}`, + ); + throw err; + } - this._log.debug( - `preparing to leave _npsGetCustomerIdByContextId after finding record', + this._log.debug( + `preparing to leave _npsGetCustomerIdByContextId after finding record', ${JSON.stringify({ - contextId, - userRecord, - })}`, - ); - return userRecord[0]; - } + contextId, + userRecord, + })}`, + ); + return userRecord[0]; + } } /** @type {LoginServer | undefined} */ @@ -137,30 +139,30 @@ LoginServer._instance = undefined; * @return {Promise} */ export async function receiveLoginData({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: { - connectionId: string; - message: NPSMessage; - log?: import("pino").Logger; + connectionId: string; + message: NPSMessage; + log?: import("pino").Logger; }): Promise { - try { - log.debug("Entering login module"); - const response = await handleLoginData({ - connectionId, - message, - log, - }); - log.debug(`There are ${response.messages.length} messages`); - log.debug("Exiting login module"); - return response; - } catch (error) { - const err = new ServerError( - `There was an error in the login service: ${String(error)}`, - ); - throw err; - } + try { + log.debug("Entering login module"); + const response = await handleLoginData({ + connectionId, + message, + log, + }); + log.debug(`There are ${response.messages.length} messages`); + log.debug("Exiting login module"); + return response; + } catch (error) { + const err = new ServerError( + `There was an error in the login service: ${String(error)}`, + ); + throw err; + } } diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index 2fb62af55..1a905a221 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -18,22 +18,23 @@ import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; -import { NPSMessage, SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { NPSMessage } from "../../shared/NPSMessage.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; import { NPSUserStatus } from "./NPSUserStatus.js"; /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ - { - contextId: "5213dee3a6bcdb133373b2d4f3b9962758", - customerId: 0x0012808b, - userId: 0x00000002, - }, - { - contextId: "d316cd2dd6bf870893dfbaaf17f965884e", - customerId: 0x0054b46c, - userId: 0x00000001, - }, + { + contextId: "5213dee3a6bcdb133373b2d4f3b9962758", + customerId: 0x0012808b, + userId: 0x00000002, + }, + { + contextId: "d316cd2dd6bf870893dfbaaf17f965884e", + customerId: 0x0054b46c, + userId: 0x00000001, + }, ]; /** @@ -49,111 +50,113 @@ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ * }>} */ async function login({ - connectionId, - message, - log = getServerLogger({ - module: "LoginServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "LoginServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - const data = message.serialize(); + const data = message.serialize(); - log.debug(`Received login packet: ${connectionId}`); + log.debug(`Received login packet: ${connectionId}`); - log.debug("Requesting NPSUserStatus packet"); - const userStatus = new NPSUserStatus(data, getServerConfiguration({}), log); - log.debug("NPSUserStatus packet creation success"); + log.debug("Requesting NPSUserStatus packet"); + const userStatus = new NPSUserStatus(data, getServerConfiguration({}), log); + log.debug("NPSUserStatus packet creation success"); - log.debug("Requesting Key extraction"); - userStatus.extractSessionKeyFromPacket(data); - log.debug("Key extraction success"); + log.debug("Requesting Key extraction"); + userStatus.extractSessionKeyFromPacket(data); + log.debug("Key extraction success"); - const { contextId, sessionKey } = userStatus; + const { contextId, sessionKey } = userStatus; - log.debug( - `UserStatus object from _userLogin, + log.debug( + `UserStatus object from _userLogin, ${JSON.stringify({ - userStatus: userStatus.toJSON(), - })}`, - ); - userStatus.dumpPacket(); - - // Load the customer record by contextId - // TODO: #1175 Move customer records from being hard-coded to database records - const userRecord = userRecords.find((r) => { - return r.contextId === contextId; - }); - - if (typeof userRecord === "undefined") { - // We were not able to locate the user's record - const err = new ServerError( - `Unable to locate a user record for the context id: ${contextId}`, - ); - throw err; - } - - // Save sessionkey in database under customerId - log.debug("Preparing to update session key in db"); - await getDatabaseServer() - .updateSessionKey( - userRecord.customerId, - sessionKey ?? "", - contextId, - connectionId, - ) - .catch((error) => { - const err = new ServerError( - `Unable to update session key in the database: ${String(error)}`, - ); - throw err; - }); - - log.debug("Session key updated"); - - const outboundMessage = new NetworkMessage(0x601); - - const dataBuffer = Buffer.alloc(26); - let offset = 0; - dataBuffer.writeInt32BE(userRecord.customerId, offset); - offset += 4; - dataBuffer.writeInt32BE(userRecord.userId, offset); - offset += 4; - dataBuffer.writeInt8(0, offset); // isCacheHit - offset += 1; - dataBuffer.writeInt8(0, offset); // ban - offset += 1; - dataBuffer.writeInt8(0, offset); // gag - offset += 1; - dataBuffer.write(sessionKey ?? "", offset, 12, "ascii"); - - const packetContent = dataBuffer; - - // Set the packet content in the outbound message - outboundMessage.data = packetContent; - - log.debug("Returning login response"); - log.debug(`Outbound message: ${outboundMessage.asHex()}`); - - const outboundMessage2 = new SerializedBuffer(); - outboundMessage2._doDeserialize(outboundMessage.serialize()); - - log.debug( - `Outbound message 2: ${outboundMessage2.serialize().toString("hex")}`, - ); - - // Update the data buffer - const response = { - connectionId, - messages: [outboundMessage2, outboundMessage2], - }; - log.debug("Leaving login"); - return response; + userStatus: userStatus.toJSON(), + })}`, + ); + userStatus.dumpPacket(); + + // Load the customer record by contextId + // TODO: #1175 Move customer records from being hard-coded to database records + const userRecord = userRecords.find((r) => { + return r.contextId === contextId; + }); + + if (typeof userRecord === "undefined") { + // We were not able to locate the user's record + const err = new ServerError( + `Unable to locate a user record for the context id: ${contextId}`, + ); + throw err; + } + + // Save sessionkey in database under customerId + log.debug("Preparing to update session key in db"); + await getDatabaseServer() + .updateSessionKey( + userRecord.customerId, + sessionKey ?? "", + contextId, + connectionId, + ) + .catch((error) => { + const err = new ServerError( + `Unable to update session key in the database: ${String( + error, + )}`, + ); + throw err; + }); + + log.debug("Session key updated"); + + const outboundMessage = new NetworkMessage(0x601); + + const dataBuffer = Buffer.alloc(26); + let offset = 0; + dataBuffer.writeInt32BE(userRecord.customerId, offset); + offset += 4; + dataBuffer.writeInt32BE(userRecord.userId, offset); + offset += 4; + dataBuffer.writeInt8(0, offset); // isCacheHit + offset += 1; + dataBuffer.writeInt8(0, offset); // ban + offset += 1; + dataBuffer.writeInt8(0, offset); // gag + offset += 1; + dataBuffer.write(sessionKey ?? "", offset, 12, "ascii"); + + const packetContent = dataBuffer; + + // Set the packet content in the outbound message + outboundMessage.data = packetContent; + + log.debug("Returning login response"); + log.debug(`Outbound message: ${outboundMessage.asHex()}`); + + const outboundMessage2 = new SerializedBuffer(); + outboundMessage2._doDeserialize(outboundMessage.serialize()); + + log.debug( + `Outbound message 2: ${outboundMessage2.serialize().toString("hex")}`, + ); + + // Update the data buffer + const response = { + connectionId, + messages: [outboundMessage2, outboundMessage2], + }; + log.debug("Leaving login"); + return response; } /** @@ -172,22 +175,22 @@ async function login({ * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: SerializedBuffer; - log: import("pino").Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: SerializedBuffer; + log: import("pino").Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 1281, // 0x0501 - name: "UserLogin", - handler: login, - }, + { + opCode: 1281, // 0x0501 + name: "UserLogin", + handler: login, + }, ]; /** @@ -204,47 +207,47 @@ export const messageHandlers: { * }>} */ export async function handleLoginData({ - connectionId, - message, - log = getServerLogger({ - module: "handleLoginData", - }), + connectionId, + message, + log = getServerLogger({ + module: "handleLoginData", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - log.debug(`Received Login Server packet: ${connectionId}`); - - // The packet needs to be an NPSMessage - const inboundMessage = new NPSMessage(); - inboundMessage._doDeserialize(message.serialize()); - - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); - - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } - - try { - const result = await supportedHandler.handler({ - connectionId, - message, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving handleLoginData"); - return result; - } catch (error) { - throw new ServerError(`Error handling login data: ${String(error)}`); - } + log.level = getServerConfiguration({}).logLevel ?? "info"; + log.debug(`Received Login Server packet: ${connectionId}`); + + // The packet needs to be an NPSMessage + const inboundMessage = new NPSMessage(); + inboundMessage._doDeserialize(message.serialize()); + + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); + + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } + + try { + const result = await supportedHandler.handler({ + connectionId, + message, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving handleLoginData"); + return result; + } catch (error) { + throw new ServerError(`Error handling login data: ${String(error)}`); + } } diff --git a/packages/persona/src/BuddyInfoMessage.ts b/packages/persona/src/BuddyInfoMessage.ts index c8d03184f..84f8022c3 100644 --- a/packages/persona/src/BuddyInfoMessage.ts +++ b/packages/persona/src/BuddyInfoMessage.ts @@ -1,4 +1,4 @@ -import { serializeStringRaw } from "../../shared/messageFactory.js"; +import { serializeStringRaw } from "../../shared/serializeStringRaw.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; import { RawMessage } from "../../shared/src/RawMessage.js"; @@ -15,120 +15,120 @@ import { RawMessage } from "../../shared/src/RawMessage.js"; */ export class BuddyInfoMessage extends RawMessage { - _buddyCount: number; // 2 bytes - _buddyList: BuddyList[] = []; - _longOne = 0x00000000; // 4 bytes - _longTwo = 0x00000000; // 4 bytes - constructor() { - super(0x614); - this._buddyCount = 0; - } + _buddyCount: number; // 2 bytes + _buddyList: BuddyList[] = []; + _longOne = 0x00000000; // 4 bytes + _longTwo = 0x00000000; // 4 bytes + constructor() { + super(0x614); + this._buddyCount = 0; + } - override get length(): number { - return super.length + 2 + this._buddyCount * 115; - } + override get length(): number { + return super.length + 2 + this._buddyCount * 115; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - super.serialize().copy(buffer, offset); - offset += super.length; - buffer.writeUInt16BE(this._buddyCount, offset); - offset += 2; - for (const buddy of this._buddyList) { - buddy.serialize().copy(buffer, offset); - offset += buddy.length; - } - return buffer; - } + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + super.serialize().copy(buffer, offset); + offset += super.length; + buffer.writeUInt16BE(this._buddyCount, offset); + offset += 2; + for (const buddy of this._buddyList) { + buddy.serialize().copy(buffer, offset); + offset += buddy.length; + } + return buffer; + } - add(buddy: BuddyList): void { - this._buddyList.push(buddy); - this._buddyCount++; - } + add(buddy: BuddyList): void { + this._buddyList.push(buddy); + this._buddyCount++; + } } export class BuddyCount extends NetworkMessage { - _buddyCount: number; // 2 bytes - constructor() { - super(0x614); - this._buddyCount = 0; - } + _buddyCount: number; // 2 bytes + constructor() { + super(0x614); + this._buddyCount = 0; + } - override get length(): number { - return super.length + 2; - } + override get length(): number { + return super.length + 2; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - buffer.writeUInt16BE(this.messageId, offset); - offset += 2; - buffer.writeUInt16BE(this.length, offset); - offset += 2; - buffer.writeUInt16BE(this.version, offset); - offset += 2; - buffer.writeUInt16BE(this.reserved, offset); - offset += 2; - buffer.writeUInt32BE(this.length, offset); - offset += 4; - buffer.writeUInt16BE(this._buddyCount, offset); - return buffer; - } + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + buffer.writeUInt16BE(this.messageId, offset); + offset += 2; + buffer.writeUInt16BE(this.length, offset); + offset += 2; + buffer.writeUInt16BE(this.version, offset); + offset += 2; + buffer.writeUInt16BE(this.reserved, offset); + offset += 2; + buffer.writeUInt32BE(this.length, offset); + offset += 4; + buffer.writeUInt16BE(this._buddyCount, offset); + return buffer; + } - set buddyCount(count: number) { - this._buddyCount = count; - } + set buddyCount(count: number) { + this._buddyCount = count; + } } export class BuddyList extends RawMessage { - // These are BuddyMap fields - // These are BuddyInfo fields - buddyName = ""; // 33 bytes - 32 + null terminator - gameName = ""; // 65 bytes - 64 + null terminator - isBuddy = false; // 1 byte - isOnline = false; // 1 byte - dnd = false; // 1 byte - dnb = false; // 1 byte - noEntry = false; // 1 byte - muteWhispers = false; // 1 byte - muteChat = false; // 1 byte + // These are BuddyMap fields + // These are BuddyInfo fields + buddyName = ""; // 33 bytes - 32 + null terminator + gameName = ""; // 65 bytes - 64 + null terminator + isBuddy = false; // 1 byte + isOnline = false; // 1 byte + dnd = false; // 1 byte + dnb = false; // 1 byte + noEntry = false; // 1 byte + muteWhispers = false; // 1 byte + muteChat = false; // 1 byte - constructor() { - super(0x608); - } + constructor() { + super(0x608); + } - override get length(): number { - return 115; - } + override get length(): number { + return 115; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.length); - let offset = 0; - super.serialize().copy(buffer, offset); - offset += super.length; - buffer.writeUInt16BE(this.messageId, offset); - offset += 2; - offset = serializeStringRaw(this.buddyName, buffer, offset, 33); - offset = serializeStringRaw(this.gameName, buffer, offset, 65); - buffer.writeUInt8(this.isBuddy ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.isOnline ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.dnd ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.dnb ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.noEntry ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.muteWhispers ? 1 : 0, offset); - offset += 1; - buffer.writeUInt8(this.muteChat ? 1 : 0, offset); + override serialize(): Buffer { + const buffer = Buffer.alloc(this.length); + let offset = 0; + super.serialize().copy(buffer, offset); + offset += super.length; + buffer.writeUInt16BE(this.messageId, offset); + offset += 2; + offset = serializeStringRaw(this.buddyName, buffer, offset, 33); + offset = serializeStringRaw(this.gameName, buffer, offset, 65); + buffer.writeUInt8(this.isBuddy ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.isOnline ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.dnd ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.dnb ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.noEntry ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.muteWhispers ? 1 : 0, offset); + offset += 1; + buffer.writeUInt8(this.muteChat ? 1 : 0, offset); - return buffer; - } + return buffer; + } - override toString(): string { - return this.serialize().toString("hex"); - } + override toString(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/persona/src/PersonaMapsMessage.ts b/packages/persona/src/PersonaMapsMessage.ts index f35893b0b..d68df53c4 100644 --- a/packages/persona/src/PersonaMapsMessage.ts +++ b/packages/persona/src/PersonaMapsMessage.ts @@ -1,343 +1,345 @@ import { serializeString } from "../../core/src/serializationHelpers.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { NPSHeader, NPSMessage } from "../../shared/messageFactory.js"; +import { NPSMessage } from "../../shared/NPSMessage.js"; +import { NPSHeader } from "../../shared/NPSHeader.js"; /** * * This is type UserGameData */ export class PersonaRecord { - customerId: number; - personaName: string; - serverDataId: number; - createDate: number; - lastLogin: number; - numberOfGames: number; - personaId: number; - isOnline: number; - purchaseTimestamp: number; - gameSerialNumber: string; - timeOnline: number; - timeInGame: number; - extraData: Buffer; - personaData: Buffer; - pictureData: Buffer; - dnd: number; - startedPlayingTimestamp: number; - hashedKey: string; - personaLevel: number; - shardId: number; - constructor() { - this.customerId = 0; - this.personaName = ""; - this.serverDataId = 0; - this.createDate = 0; - this.lastLogin = 0; - this.numberOfGames = 0; - this.personaId = 0; - this.isOnline = 0; - this.purchaseTimestamp = 0; - this.gameSerialNumber = ""; - this.timeOnline = 0; - this.timeInGame = 0; - this.extraData = Buffer.alloc(512); - this.personaData = Buffer.alloc(256); - this.pictureData = Buffer.alloc(1); - this.dnd = 0; - this.startedPlayingTimestamp = 0; - this.hashedKey = ""; - this.personaLevel = 0; - this.shardId = 0; - } + customerId: number; + personaName: string; + serverDataId: number; + createDate: number; + lastLogin: number; + numberOfGames: number; + personaId: number; + isOnline: number; + purchaseTimestamp: number; + gameSerialNumber: string; + timeOnline: number; + timeInGame: number; + extraData: Buffer; + personaData: Buffer; + pictureData: Buffer; + dnd: number; + startedPlayingTimestamp: number; + hashedKey: string; + personaLevel: number; + shardId: number; + constructor() { + this.customerId = 0; + this.personaName = ""; + this.serverDataId = 0; + this.createDate = 0; + this.lastLogin = 0; + this.numberOfGames = 0; + this.personaId = 0; + this.isOnline = 0; + this.purchaseTimestamp = 0; + this.gameSerialNumber = ""; + this.timeOnline = 0; + this.timeInGame = 0; + this.extraData = Buffer.alloc(512); + this.personaData = Buffer.alloc(256); + this.pictureData = Buffer.alloc(1); + this.dnd = 0; + this.startedPlayingTimestamp = 0; + this.hashedKey = ""; + this.personaLevel = 0; + this.shardId = 0; + } - /** - * - * @param {Buffer} buffer - * @returns {PersonaRecord} - */ - deserialize(buffer: Buffer): PersonaRecord { - let offset = 0; - this.customerId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.personaName = buffer.toString("utf8", offset, offset + 33); // 33 - offset += 33; - this.serverDataId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.createDate = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.lastLogin = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.numberOfGames = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.personaId = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.isOnline = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.purchaseTimestamp = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.gameSerialNumber = buffer - .subarray(offset, offset + 33) - .toString("utf8"); // 33 - offset += 33; - this.timeOnline = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.timeInGame = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.extraData = buffer.subarray(offset, offset + 512); // 512 - offset += 512; - this.personaData = buffer.subarray(offset, offset + 256); // 256 - offset += 256; - this.pictureData = buffer.subarray(offset, offset + 1); // 1 - offset += 1; - this.dnd = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.startedPlayingTimestamp = buffer.readUInt32BE(offset); // 4 - offset += 4; - this.hashedKey = buffer.subarray(offset, offset + 400).toString("utf8"); // 400 - offset += 400; - this.personaLevel = buffer.readUInt16BE(offset); // 2 - offset += 2; - this.shardId = buffer.readUInt32BE(offset); // 2 - // Offset 1285 - return this; - } + /** + * + * @param {Buffer} buffer + * @returns {PersonaRecord} + */ + deserialize(buffer: Buffer): PersonaRecord { + let offset = 0; + this.customerId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.personaName = buffer.toString("utf8", offset, offset + 33); // 33 + offset += 33; + this.serverDataId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.createDate = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.lastLogin = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.numberOfGames = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.personaId = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.isOnline = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.purchaseTimestamp = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.gameSerialNumber = buffer + .subarray(offset, offset + 33) + .toString("utf8"); // 33 + offset += 33; + this.timeOnline = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.timeInGame = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.extraData = buffer.subarray(offset, offset + 512); // 512 + offset += 512; + this.personaData = buffer.subarray(offset, offset + 256); // 256 + offset += 256; + this.pictureData = buffer.subarray(offset, offset + 1); // 1 + offset += 1; + this.dnd = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.startedPlayingTimestamp = buffer.readUInt32BE(offset); // 4 + offset += 4; + this.hashedKey = buffer.subarray(offset, offset + 400).toString("utf8"); // 400 + offset += 400; + this.personaLevel = buffer.readUInt16BE(offset); // 2 + offset += 2; + this.shardId = buffer.readUInt32BE(offset); // 2 + // Offset 1285 + return this; + } - /** - * - * @returns {Buffer} - */ - serialize(): Buffer { - const buffer = Buffer.alloc(PersonaRecord.size()); - try { - let offset = 0; - buffer.writeUInt32BE(this.customerId, offset); // 4 - Unknown if this is correct - offset += 4; // offset = 4 - buffer.writeUInt16BE(3341, offset); // 2 - unknown if this is correct - offset += 2; // offset = 6 - buffer.writeUInt32BE(this.personaId, offset); // 4 - Known to be correct - offset += 4; // offset = 10 - buffer.writeUInt32BE(this.shardId, offset); // 4 - Known to be correct - offset += 4; // offset = 14 - // We don't know what goes here yet - offset += 4; // offset = 18 - serializeString(this.personaName).copy(buffer, offset); // 34 - Known to be correct - // offset = 52 + /** + * + * @returns {Buffer} + */ + serialize(): Buffer { + const buffer = Buffer.alloc(PersonaRecord.size()); + try { + let offset = 0; + buffer.writeUInt32BE(this.customerId, offset); // 4 - Unknown if this is correct + offset += 4; // offset = 4 + buffer.writeUInt16BE(3341, offset); // 2 - unknown if this is correct + offset += 2; // offset = 6 + buffer.writeUInt32BE(this.personaId, offset); // 4 - Known to be correct + offset += 4; // offset = 10 + buffer.writeUInt32BE(this.shardId, offset); // 4 - Known to be correct + offset += 4; // offset = 14 + // We don't know what goes here yet + offset += 4; // offset = 18 + serializeString(this.personaName).copy(buffer, offset); // 34 - Known to be correct + // offset = 52 - // buffer.writeUInt32BE(this.serverDataId, offset); // 4 - // offset += 4; // offset = 56 - // buffer.writeUInt32BE(this.createDate, offset); // 4 - // offset += 4; // offset = 60 - // buffer.writeUInt32BE(this.lastLogin, offset); // 4 - // offset += 4; // offset = 64 - // buffer.writeUInt32BE(this.numberOfGames, offset); // 4 (Max personas)) - // offset += 4; // offset = 68 - // buffer.writeUInt16BE(this.isOnline, offset); // 2 - // offset += 2; // offset = 70 - // buffer.writeUInt32BE(this.purchaseTimestamp, offset); // 4 - // offset += 4; // offset = 74 - // buffer.write(this.gameSerialNumber, offset, 33, "utf8"); // 33 - // offset += 33; // offset = 107 - // buffer.writeUInt32BE(this.timeOnline, offset); // 4 - // offset += 4; // offset = 111 - // buffer.writeUInt32BE(this.timeInGame, offset); // 4 - // offset += 4; // offset = 115 - // this.extraData.copy(buffer, offset, 512); // 512 - // offset += 512; // offset = 627 - // this.personaData.copy(buffer, offset, 256); // 256 - // offset += 256; // offset = 883 - // this.pictureData.copy(buffer, offset, 1); // 1 - // offset += 1; // offset = 884 - // buffer.writeUInt16BE(this.dnd, offset); // 2 - // offset += 2; // offset = 886 - // buffer.writeUInt32BE(this.startedPlayingTimestamp, offset); // 4 - // offset += 4; // offset = 890 - // buffer.write(this.hashedKey, offset, 400, "utf8"); // 400 - // offset += 400; // offset = 1290 - // buffer.writeUInt16BE(this.personaLevel, offset); // 2 - // offset += 2; // offset = 1292 - } catch (error) { - throw new ServerError( - `Error serializing PersonaRecord buffer: ${String(error)}`, - ); - } - return buffer; - } + // buffer.writeUInt32BE(this.serverDataId, offset); // 4 + // offset += 4; // offset = 56 + // buffer.writeUInt32BE(this.createDate, offset); // 4 + // offset += 4; // offset = 60 + // buffer.writeUInt32BE(this.lastLogin, offset); // 4 + // offset += 4; // offset = 64 + // buffer.writeUInt32BE(this.numberOfGames, offset); // 4 (Max personas)) + // offset += 4; // offset = 68 + // buffer.writeUInt16BE(this.isOnline, offset); // 2 + // offset += 2; // offset = 70 + // buffer.writeUInt32BE(this.purchaseTimestamp, offset); // 4 + // offset += 4; // offset = 74 + // buffer.write(this.gameSerialNumber, offset, 33, "utf8"); // 33 + // offset += 33; // offset = 107 + // buffer.writeUInt32BE(this.timeOnline, offset); // 4 + // offset += 4; // offset = 111 + // buffer.writeUInt32BE(this.timeInGame, offset); // 4 + // offset += 4; // offset = 115 + // this.extraData.copy(buffer, offset, 512); // 512 + // offset += 512; // offset = 627 + // this.personaData.copy(buffer, offset, 256); // 256 + // offset += 256; // offset = 883 + // this.pictureData.copy(buffer, offset, 1); // 1 + // offset += 1; // offset = 884 + // buffer.writeUInt16BE(this.dnd, offset); // 2 + // offset += 2; // offset = 886 + // buffer.writeUInt32BE(this.startedPlayingTimestamp, offset); // 4 + // offset += 4; // offset = 890 + // buffer.write(this.hashedKey, offset, 400, "utf8"); // 400 + // offset += 400; // offset = 1290 + // buffer.writeUInt16BE(this.personaLevel, offset); // 2 + // offset += 2; // offset = 1292 + } catch (error) { + throw new ServerError( + `Error serializing PersonaRecord buffer: ${String(error)}`, + ); + } + return buffer; + } - static size() { - return 52; - } + static size() { + return 52; + } - toJSON() { - return { - customerId: this.customerId, - personaId: this.personaId, - personaName: this.personaName, - shardId: this.shardId, - serverDataId: this.serverDataId, - // createDate: this.createDate, - // lastLogin: this.lastLogin, - // numberOfGames: this.numberOfGames, - // isOnline: this.isOnline, - // purchaseTimestamp: this.purchaseTimestamp, - // gameSerialNumber: this.gameSerialNumber, - // timeOnline: this.timeOnline, - // timeInGame: this.timeInGame, - // extraData: this.extraData, - // personaData: this.personaData, - // pictureData: this.pictureData, - // dnd: this.dnd, - // startedPlayingTimestamp: this.startedPlayingTimestamp, - // hashedKey: this.hashedKey, - // personaLevel: this.personaLevel, - }; - } + toJSON() { + return { + customerId: this.customerId, + personaId: this.personaId, + personaName: this.personaName, + shardId: this.shardId, + serverDataId: this.serverDataId, + // createDate: this.createDate, + // lastLogin: this.lastLogin, + // numberOfGames: this.numberOfGames, + // isOnline: this.isOnline, + // purchaseTimestamp: this.purchaseTimestamp, + // gameSerialNumber: this.gameSerialNumber, + // timeOnline: this.timeOnline, + // timeInGame: this.timeInGame, + // extraData: this.extraData, + // personaData: this.personaData, + // pictureData: this.pictureData, + // dnd: this.dnd, + // startedPlayingTimestamp: this.startedPlayingTimestamp, + // hashedKey: this.hashedKey, + // personaLevel: this.personaLevel, + }; + } - asJSON() { - return this.toJSON(); - } + asJSON() { + return this.toJSON(); + } - toString() { - return `PersonaRecord: ${JSON.stringify(this.toJSON())}`; - } + toString() { + return `PersonaRecord: ${JSON.stringify(this.toJSON())}`; + } } export class PersonaList { - _personaRecords: PersonaRecord[]; - constructor() { - /** @type {PersonaRecord[]} */ - this._personaRecords = []; - } + _personaRecords: PersonaRecord[]; + constructor() { + /** @type {PersonaRecord[]} */ + this._personaRecords = []; + } - /** - * - * @param {Buffer} buffer - * @returns {PersonaList} - */ - deserialize(buffer: Buffer): PersonaList { - let offset = 0; - const personaRecordCount = buffer.readUInt16BE(offset); - offset += 2; - for (let i = 0; i < personaRecordCount; i++) { - const personaRecord = new PersonaRecord(); - personaRecord.deserialize(buffer.subarray(offset)); - offset += PersonaRecord.size(); - this._personaRecords.push(personaRecord); - } - return this; - } + /** + * + * @param {Buffer} buffer + * @returns {PersonaList} + */ + deserialize(buffer: Buffer): PersonaList { + let offset = 0; + const personaRecordCount = buffer.readUInt16BE(offset); + offset += 2; + for (let i = 0; i < personaRecordCount; i++) { + const personaRecord = new PersonaRecord(); + personaRecord.deserialize(buffer.subarray(offset)); + offset += PersonaRecord.size(); + this._personaRecords.push(personaRecord); + } + return this; + } - /** - * - * @returns {Buffer} - */ - serialize(): Buffer { - const NEEDED_SIZE = PersonaRecord.size() * this._personaRecords.length; - const buffer = Buffer.alloc(NEEDED_SIZE); - try { - let offset = 0; - if (!this._personaRecords) { - throw new ServerError("PersonaRecords is undefined"); - } - for (const personaRecord of this._personaRecords) { - personaRecord.serialize().copy(buffer, offset); - offset += PersonaRecord.size(); - } - } catch (error) { - throw new ServerError( - `Error serializing PersonaList buffer: ${String(error)}`, - ); - } - return buffer; - } + /** + * + * @returns {Buffer} + */ + serialize(): Buffer { + const NEEDED_SIZE = PersonaRecord.size() * this._personaRecords.length; + const buffer = Buffer.alloc(NEEDED_SIZE); + try { + let offset = 0; + if (!this._personaRecords) { + throw new ServerError("PersonaRecords is undefined"); + } + for (const personaRecord of this._personaRecords) { + personaRecord.serialize().copy(buffer, offset); + offset += PersonaRecord.size(); + } + } catch (error) { + throw new ServerError( + `Error serializing PersonaList buffer: ${String(error)}`, + ); + } + return buffer; + } - /** - * @param {PersonaRecord} personaRecord - */ - addPersonaRecord(personaRecord: PersonaRecord) { - this._personaRecords.push(personaRecord); - } + /** + * @param {PersonaRecord} personaRecord + */ + addPersonaRecord(personaRecord: PersonaRecord) { + this._personaRecords.push(personaRecord); + } - personaCount() { - return this._personaRecords.length; - } + personaCount() { + return this._personaRecords.length; + } - size() { - return PersonaRecord.size() * this._personaRecords.length; - } + size() { + return PersonaRecord.size() * this._personaRecords.length; + } - asJSON() { - return { - personaRecords: this._personaRecords, - }; - } + asJSON() { + return { + personaRecords: this._personaRecords, + }; + } - toString() { - return `PersonaList: ${JSON.stringify(this._personaRecords)}`; - } + toString() { + return `PersonaList: ${JSON.stringify(this._personaRecords)}`; + } } export class PersonaMapsMessage extends NPSMessage { - _personaRecords: PersonaList | undefined; - raw: Buffer | undefined; - constructor() { - super(); - /** @type {PersonaList | undefined} */ - this._personaRecords = undefined; - } + _personaRecords: PersonaList | undefined; + raw: Buffer | undefined; + constructor() { + super(); + /** @type {PersonaList | undefined} */ + this._personaRecords = undefined; + } - /** - * @param {Buffer} buffer - * @returns {PersonaMapsMessage} - */ - deserialize(buffer: Buffer): PersonaMapsMessage { - try { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(NPSHeader.size())); - this.raw = buffer; - return this; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error deserializing PersonaMapsMessage", - ); - } - } + /** + * @param {Buffer} buffer + * @returns {PersonaMapsMessage} + */ + deserialize(buffer: Buffer): PersonaMapsMessage { + try { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(NPSHeader.size())); + this.raw = buffer; + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error deserializing PersonaMapsMessage", + ); + } + } - /** - * @returns {Buffer} - */ - override serialize(): Buffer { - try { - if (!this._personaRecords) { - throw new ServerError("PersonaRecords is undefined"); - } - this._header.length = NPSHeader.size() + 2 + this._personaRecords.size(); - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); + /** + * @returns {Buffer} + */ + override serialize(): Buffer { + try { + if (!this._personaRecords) { + throw new ServerError("PersonaRecords is undefined"); + } + this._header.length = + NPSHeader.size() + 2 + this._personaRecords.size(); + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); - // Write the persona count. This is known to be correct at offset 12 - buffer.writeUInt16BE(this._personaRecords.personaCount(), 12); - // This is a serialized PersonaList - this.data.copy(buffer, NPSHeader.size() + 2); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing PersonaMapsMessage", - ); - } - } + // Write the persona count. This is known to be correct at offset 12 + buffer.writeUInt16BE(this._personaRecords.personaCount(), 12); + // This is a serialized PersonaList + this.data.copy(buffer, NPSHeader.size() + 2); + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing PersonaMapsMessage", + ); + } + } - asJSON() { - return { - header: this._header, - personaRecords: this._personaRecords, - }; - } + asJSON() { + return { + header: this._header, + personaRecords: this._personaRecords, + }; + } - override toString() { - return `PersonaMapsMessage: ${JSON.stringify({ - header: this._header, - personaRecords: this._personaRecords, - })}`; - } + override toString() { + return `PersonaMapsMessage: ${JSON.stringify({ + header: this._header, + personaRecords: this._personaRecords, + })}`; + } } diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index c9c2c5131..559ffee86 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -1,8 +1,6 @@ import { getServerLogger } from "../../shared/log.js"; -import { - LegacyMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** * Handle game logout @@ -17,43 +15,43 @@ import { */ export async function _gameLogout({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsLogoutGameUser..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsLogoutGameUser', + log.debug("_npsLogoutGameUser..."); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: requestPacket.toString(), - })}`, - ); + NPSMsg: requestPacket.toString(), + })}`, + ); - // Build the packet - const responsePacket = new LegacyMessage(); - responsePacket._header.id = 519; - log.debug( - `NPSMsg response object from _npsLogoutGameUser', + // Build the packet + const responsePacket = new LegacyMessage(); + responsePacket._header.id = 519; + log.debug( + `NPSMsg response object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: responsePacket.toString(), - })}`, - ); + NPSMsg: responsePacket.toString(), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket._doSerialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket._doSerialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index d605ca89e..2ebdf9eba 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -1,115 +1,113 @@ import { getServerLogger } from "../../shared/log.js"; -import { - LegacyMessage, - NPSMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { NPSMessage } from "../../shared/NPSMessage.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { BuddyCount, BuddyInfoMessage, BuddyList } from "./BuddyInfoMessage.js"; export async function _getFirstBuddy({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - // This message is a versioned nps message - const incomingMessage = new NPSMessage(); - incomingMessage._doDeserialize(message._doSerialize()); + // This message is a versioned nps message + const incomingMessage = new NPSMessage(); + incomingMessage._doDeserialize(message._doSerialize()); - log.debug( - `in _getFirstBuddy, incomingMessage: ${incomingMessage - .serialize() - .toString("hex")}`, - ); + log.debug( + `in _getFirstBuddy, incomingMessage: ${incomingMessage + .serialize() + .toString("hex")}`, + ); - // extract the personaId - const personaId = incomingMessage.data.readUInt32BE(0); + // extract the personaId + const personaId = incomingMessage.data.readUInt32BE(0); - log.debug(`in _getFirstBuddy, personaId: ${personaId}`); + log.debug(`in _getFirstBuddy, personaId: ${personaId}`); - // TODO: Here we need to look up the buddies for the personaId + // TODO: Here we need to look up the buddies for the personaId - // First, send the BuddyCount message - const buddyCountMessage = new BuddyCount(); - buddyCountMessage.buddyCount = 0; + // First, send the BuddyCount message + const buddyCountMessage = new BuddyCount(); + buddyCountMessage.buddyCount = 0; - const outboundMessage1 = new SerializedBuffer(); - outboundMessage1._doDeserialize(buddyCountMessage.serialize()); + const outboundMessage1 = new SerializedBuffer(); + outboundMessage1._doDeserialize(buddyCountMessage.serialize()); - const buddyInfoMessage = new BuddyInfoMessage(); + const buddyInfoMessage = new BuddyInfoMessage(); - for (const buddy of buddies) { - const buddyInfo = new BuddyList(); - buddyInfo.buddyName = buddy.buddyName; - buddyInfo.gameName = buddy.gameName; - buddyInfo.isBuddy = buddy.isBuddy; - buddyInfo.isOnline = buddy.isOnline; - buddyInfo.dnd = buddy.dnd; - buddyInfo.dnb = buddy.dnb; - buddyInfo.noEntry = buddy.noEntry; - buddyInfo.muteWhispers = buddy.muteWhispers; - buddyInfo.muteChat = buddy.muteChat; + for (const buddy of buddies) { + const buddyInfo = new BuddyList(); + buddyInfo.buddyName = buddy.buddyName; + buddyInfo.gameName = buddy.gameName; + buddyInfo.isBuddy = buddy.isBuddy; + buddyInfo.isOnline = buddy.isOnline; + buddyInfo.dnd = buddy.dnd; + buddyInfo.dnb = buddy.dnb; + buddyInfo.noEntry = buddy.noEntry; + buddyInfo.muteWhispers = buddy.muteWhispers; + buddyInfo.muteChat = buddy.muteChat; - buddyInfoMessage.add(buddyInfo); - } + buddyInfoMessage.add(buddyInfo); + } - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(buddyInfoMessage.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(buddyInfoMessage.serialize()); - log.debug( - `in _getFirstBuddy, outboundMessage: ${outboundMessage1.toString()}`, - ); + log.debug( + `in _getFirstBuddy, outboundMessage: ${outboundMessage1.toString()}`, + ); - return { - connectionId, - messages: [outboundMessage1], - }; + return { + connectionId, + messages: [outboundMessage1], + }; } interface BuddyInfoRecord { - buddyId: number; - buddyName: string; - gameName: string; - isBuddy: boolean; - isOnline: boolean; - dnd: boolean; - dnb: boolean; - noEntry: boolean; - muteWhispers: boolean; - muteChat: boolean; + buddyId: number; + buddyName: string; + gameName: string; + isBuddy: boolean; + isOnline: boolean; + dnd: boolean; + dnb: boolean; + noEntry: boolean; + muteWhispers: boolean; + muteChat: boolean; } export const buddies: BuddyInfoRecord[] = [ - { - buddyId: 2, - buddyName: "Einstein", - gameName: "Good Woof", - isBuddy: true, - isOnline: true, - dnd: false, - dnb: false, - noEntry: false, - muteWhispers: false, - muteChat: false, - }, - { - buddyId: 3, - buddyName: "Marty", - gameName: "That kid", - isBuddy: true, - isOnline: true, - dnd: false, - dnb: false, - noEntry: false, - muteWhispers: false, - muteChat: false, - }, + { + buddyId: 2, + buddyName: "Einstein", + gameName: "Good Woof", + isBuddy: true, + isOnline: true, + dnd: false, + dnb: false, + noEntry: false, + muteWhispers: false, + muteChat: false, + }, + { + buddyId: 3, + buddyName: "Marty", + gameName: "That kid", + isBuddy: true, + isOnline: true, + dnd: false, + dnb: false, + noEntry: false, + muteWhispers: false, + muteChat: false, + }, ]; diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index f77ee1edc..b90cd2509 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -1,8 +1,6 @@ import { getServerLogger } from "../../shared/log.js"; -import { - LegacyMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** * Selects a game persona and marks it as in use @@ -17,47 +15,47 @@ import { */ export async function _selectGamePersona({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsSelectGamePersona..."); - const requestPacket = message; - log.debug( - `LegacyMsg request object from _npsSelectGamePersona ${requestPacket - ._doSerialize() - .toString("hex")}`, - ); + log.debug("_npsSelectGamePersona..."); + const requestPacket = message; + log.debug( + `LegacyMsg request object from _npsSelectGamePersona ${requestPacket + ._doSerialize() + .toString("hex")}`, + ); - // Create the packet content - const packetContent = Buffer.alloc(251); + // Create the packet content + const packetContent = Buffer.alloc(251); - // Build the packet - // Response Code - // 207 = success - const responsePacket = new LegacyMessage(); - responsePacket._header.id = 519; - responsePacket.setBuffer(packetContent); - log.debug( - `LegacyMsg response object from _npsSelectGamePersona ${responsePacket - ._doSerialize() - .toString("hex")} `, - ); + // Build the packet + // Response Code + // 207 = success + const responsePacket = new LegacyMessage(); + responsePacket._header.id = 519; + responsePacket.setBuffer(packetContent); + log.debug( + `LegacyMsg response object from _npsSelectGamePersona ${responsePacket + ._doSerialize() + .toString("hex")} `, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage.setBuffer(responsePacket._doSerialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage.setBuffer(responsePacket._doSerialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 00fb31b57..77522bf3b 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -1,8 +1,6 @@ import { getServerLogger } from "../../../shared/log.js"; -import { - LegacyMessage, - SerializedBuffer, -} from "../../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { RawMessage } from "../../../shared/src/RawMessage.js"; /** @@ -10,42 +8,42 @@ import { RawMessage } from "../../../shared/src/RawMessage.js"; */ export async function validatePersonaName({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsLogoutGameUser..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsLogoutGameUser', + log.debug("_npsLogoutGameUser..."); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: requestPacket.toString(), - })}`, - ); + NPSMsg: requestPacket.toString(), + })}`, + ); - // Build the packet - const responsePacket = new RawMessage(522); // 0x020a - NPS_DUP_USER - log.debug( - `NPSMsg response object from _npsLogoutGameUser', + // Build the packet + const responsePacket = new RawMessage(522); // 0x020a - NPS_DUP_USER + log.debug( + `NPSMsg response object from _npsLogoutGameUser', ${JSON.stringify({ - NPSMsg: responsePacket.toString(), - })}`, - ); + NPSMsg: responsePacket.toString(), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(responsePacket.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(responsePacket.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index 65196efad..3e0ef8ad1 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -19,14 +19,12 @@ import { getServerLogger } from "../../shared/log.js"; import { Logger } from "pino"; import { getServerConfiguration } from "../../shared/Configuration.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { - LegacyMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; -import { - PersonaList, - PersonaMapsMessage, - PersonaRecord, + PersonaList, + PersonaMapsMessage, + PersonaRecord, } from "./PersonaMapsMessage.js"; import { _gameLogout } from "./_gameLogout.js"; import { _getFirstBuddy } from "./_getFirstBuddy.js"; @@ -51,51 +49,51 @@ const NAME_BUFFER_SIZE = 30; * }>}[]} */ export const messageHandlers: { - opCode: number; - name: string; - handler: (args: { - connectionId: string; - message: LegacyMessage; - log: Logger; - }) => Promise<{ - connectionId: string; - messages: SerializedBuffer[]; - }>; + opCode: number; + name: string; + handler: (args: { + connectionId: string; + message: LegacyMessage; + log: Logger; + }) => Promise<{ + connectionId: string; + messages: SerializedBuffer[]; + }>; }[] = [ - { - opCode: 1283, // 0x503 - name: "Game login", - handler: _selectGamePersona, - }, - { - opCode: 1295, // 0x50F - name: "Game logout", - handler: _gameLogout, - }, - { - opCode: 1330, // 0x532 - name: "Get persona maps", - handler: getPersonaMaps, - }, - { - opCode: 1331, // 0x533 - name: "Validate persona name", - handler: validatePersonaName, - }, - { - opCode: 1291, // 0x50B - name: "Get first buddy", - handler: _getFirstBuddy, - }, + { + opCode: 1283, // 0x503 + name: "Game login", + handler: _selectGamePersona, + }, + { + opCode: 1295, // 0x50F + name: "Game logout", + handler: _gameLogout, + }, + { + opCode: 1330, // 0x532 + name: "Get persona maps", + handler: getPersonaMaps, + }, + { + opCode: 1331, // 0x533 + name: "Validate persona name", + handler: validatePersonaName, + }, + { + opCode: 1291, // 0x50B + name: "Get first buddy", + handler: _getFirstBuddy, + }, ]; /** * Return string as buffer */ export function generateNameBuffer(name: string, size: number): Buffer { - const nameBuffer = Buffer.alloc(size); - Buffer.from(name, "utf8").copy(nameBuffer); - return nameBuffer; + const nameBuffer = Buffer.alloc(size); + Buffer.from(name, "utf8").copy(nameBuffer); + return nameBuffer; } /** @@ -104,24 +102,24 @@ export function generateNameBuffer(name: string, size: number): Buffer { * @type {import("../../interfaces/index.js").PersonaRecord[]} */ export const personaRecords: import("../../interfaces/index.js").PersonaRecord[] = - [ - { - customerId: 2868969472, - id: Buffer.from([0x00, 0x00, 0x00, 0x01]), - maxPersonas: Buffer.from([0x01]), - name: generateNameBuffer("Doc Joe", NAME_BUFFER_SIZE), - personaCount: Buffer.from([0x00, 0x01]), - shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), - }, - { - customerId: 5551212, // 0x54 0xB4 0x6C - id: Buffer.from([0x00, 0x84, 0x5f, 0xed]), - maxPersonas: Buffer.from([0x02]), - name: generateNameBuffer("Dr Brown", NAME_BUFFER_SIZE), - personaCount: Buffer.from([0x00, 0x01]), - shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), - }, - ]; + [ + { + customerId: 2868969472, + id: Buffer.from([0x00, 0x00, 0x00, 0x01]), + maxPersonas: Buffer.from([0x01]), + name: generateNameBuffer("Doc Joe", NAME_BUFFER_SIZE), + personaCount: Buffer.from([0x00, 0x01]), + shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), + }, + { + customerId: 5551212, // 0x54 0xB4 0x6C + id: Buffer.from([0x00, 0x84, 0x5f, 0xed]), + maxPersonas: Buffer.from([0x02]), + name: generateNameBuffer("Dr Brown", NAME_BUFFER_SIZE), + personaCount: Buffer.from([0x00, 0x01]), + shardId: Buffer.from([0x00, 0x00, 0x00, 0x2c]), + }, + ]; /** * @@ -129,12 +127,12 @@ export const personaRecords: import("../../interfaces/index.js").PersonaRecord[] // * @return {Promise} */ async function getPersonasByCustomerId( - customerId: number, + customerId: number, ): Promise { - const results = personaRecords.filter( - (persona) => persona.customerId === customerId, - ); - return results; + const results = personaRecords.filter( + (persona) => persona.customerId === customerId, + ); + return results; } /** @@ -146,14 +144,14 @@ async function getPersonasByCustomerId( * @return {Promise} */ async function getPersonaMapsByCustomerId( - customerId: number, + customerId: number, ): Promise { - switch (customerId) { - case 5551212: - return getPersonasByCustomerId(customerId); - default: - return []; - } + switch (customerId) { + case 5551212: + return getPersonasByCustomerId(customerId); + default: + return []; + } } /** @@ -168,93 +166,95 @@ async function getPersonaMapsByCustomerId( * }>} */ async function getPersonaMaps({ - connectionId, - message, - log = getServerLogger({ module: "PersonaServer" }), + connectionId, + message, + log = getServerLogger({ module: "PersonaServer" }), }: { - connectionId: string; - message: LegacyMessage; - log?: import("pino").Logger; + connectionId: string; + message: LegacyMessage; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.debug("_npsGetPersonaMaps..."); + log.debug("_npsGetPersonaMaps..."); - const requestPacket = message; - log.debug( - `NPSMsg request object from _npsGetPersonaMaps ${requestPacket - ._doSerialize() - .toString("hex")} `, - ); + const requestPacket = message; + log.debug( + `NPSMsg request object from _npsGetPersonaMaps ${requestPacket + ._doSerialize() + .toString("hex")} `, + ); - const customerId = requestPacket.data.readUInt32BE(8); + const customerId = requestPacket.data.readUInt32BE(8); - const personas = await getPersonaMapsByCustomerId(customerId); - log.debug(`${personas.length} personas found for ${customerId}`); + const personas = await getPersonaMapsByCustomerId(customerId); + log.debug(`${personas.length} personas found for ${customerId}`); - const personaMapsMessage = new PersonaMapsMessage(); + const personaMapsMessage = new PersonaMapsMessage(); - // this is a GLDP_PersonaList::GLDP_PersonaList + // this is a GLDP_PersonaList::GLDP_PersonaList - try { - /** @type {PersonaList} */ - let personaList: PersonaList = new PersonaList(); + try { + /** @type {PersonaList} */ + let personaList: PersonaList = new PersonaList(); - if (personas.length > 1) { - log.warn(`More than one persona found for customer Id: ${customerId}`); - } + if (personas.length > 1) { + log.warn( + `More than one persona found for customer Id: ${customerId}`, + ); + } - personas.forEach((persona) => { - const personaRecord = new PersonaRecord(); + personas.forEach((persona) => { + const personaRecord = new PersonaRecord(); - personaRecord.customerId = persona.customerId; - personaRecord.personaId = persona.id.readUInt32BE(0); - personaRecord.personaName = persona.name.toString("utf8"); - personaRecord.shardId = persona.shardId.readUInt32BE(0); - personaRecord.numberOfGames = personas.length; + personaRecord.customerId = persona.customerId; + personaRecord.personaId = persona.id.readUInt32BE(0); + personaRecord.personaName = persona.name.toString("utf8"); + personaRecord.shardId = persona.shardId.readUInt32BE(0); + personaRecord.numberOfGames = personas.length; - personaList.addPersonaRecord(personaRecord); + personaList.addPersonaRecord(personaRecord); - log.debug( - `Persona record: ${JSON.stringify({ - personaRecord: personaRecord.toJSON(), - })}`, - ); - }); + log.debug( + `Persona record: ${JSON.stringify({ + personaRecord: personaRecord.toJSON(), + })}`, + ); + }); - personaMapsMessage._header.id = 0x607; - personaMapsMessage._personaRecords = personaList; - personaMapsMessage.setBuffer(personaList.serialize()); - log.debug( - `PersonaMapsMessage object from _npsGetPersonaMaps', + personaMapsMessage._header.id = 0x607; + personaMapsMessage._personaRecords = personaList; + personaMapsMessage.setBuffer(personaList.serialize()); + log.debug( + `PersonaMapsMessage object from _npsGetPersonaMaps', ${JSON.stringify({ - personaMapsMessage: personaMapsMessage - .serialize() - .toString("hex"), - })}`, - ); + personaMapsMessage: personaMapsMessage + .serialize() + .toString("hex"), + })}`, + ); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(personaMapsMessage.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(personaMapsMessage.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; - } catch (error) { - if (error instanceof Error) { - const err = new ServerError( - `Error serializing personaMapsMsg: ${error.message}`, - ); - throw err; - } + return { + connectionId, + messages: [outboundMessage], + }; + } catch (error) { + if (error instanceof Error) { + const err = new ServerError( + `Error serializing personaMapsMsg: ${error.message}`, + ); + throw err; + } - const err = new ServerError( - "Error serializing personaMapsMsg, error unknonw", - ); - throw err; - } + const err = new ServerError( + "Error serializing personaMapsMsg, error unknonw", + ); + throw err; + } } /** @@ -271,56 +271,56 @@ async function getPersonaMaps({ * @throws {Error} Unknown code was received */ export async function receivePersonaData({ - connectionId, - message, - log = getServerLogger({ - module: "PersonaServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "PersonaServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - const { data } = message; - log.debug( - `Received Persona packet', + log.level = getServerConfiguration({}).logLevel ?? "info"; + const { data } = message; + log.debug( + `Received Persona packet', ${JSON.stringify({ - data: data.toString("hex"), - })}`, - ); + data: data.toString("hex"), + })}`, + ); - // The packet needs to be an NPSMessage - const inboundMessage = new LegacyMessage(); - inboundMessage._doDeserialize(message.data); + // The packet needs to be an NPSMessage + const inboundMessage = new LegacyMessage(); + inboundMessage._doDeserialize(message.data); - const supportedHandler = messageHandlers.find((h) => { - return h.opCode === inboundMessage._header.id; - }); + const supportedHandler = messageHandlers.find((h) => { + return h.opCode === inboundMessage._header.id; + }); - if (typeof supportedHandler === "undefined") { - // We do not yet support this message code - throw new ServerError( - `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, - ); - } + if (typeof supportedHandler === "undefined") { + // We do not yet support this message code + throw new ServerError( + `UNSUPPORTED_MESSAGECODE: ${inboundMessage._header.id}`, + ); + } - try { - const result = await supportedHandler.handler({ - connectionId, - message: inboundMessage, - log, - }); - log.debug(`Returning with ${result.messages.length} messages`); - log.debug("Leaving receivePersonaDatadleData"); - return result; - } catch (error) { - throw ServerError.fromUnknown( - error, - `Error handling persona data: ${String(error)}`, - ); - } + try { + const result = await supportedHandler.handler({ + connectionId, + message: inboundMessage, + log, + }); + log.debug(`Returning with ${result.messages.length} messages`); + log.debug("Leaving receivePersonaDatadleData"); + return result; + } catch (error) { + throw ServerError.fromUnknown( + error, + `Error handling persona data: ${String(error)}`, + ); + } } diff --git a/packages/shared/GameMessage.ts b/packages/shared/GameMessage.ts new file mode 100644 index 000000000..a76eca96b --- /dev/null +++ b/packages/shared/GameMessage.ts @@ -0,0 +1,67 @@ +import { GameMessageHeader } from "./GameMessageHeader.js"; +import { SerializedBuffer } from "./SerializedBuffer.js"; + +export class GameMessage extends SerializedBuffer { + _header: GameMessageHeader; + _recordData: Buffer; + constructor(gameMessageId: number) { + super(); + this._header = new GameMessageHeader(gameMessageId); + this._recordData = Buffer.alloc(0); + } + + setRecordData(buffer: Buffer) { + this._recordData = Buffer.alloc(buffer.length); + buffer.copy(this._recordData); + } + + /** @deprecated - Use setRecordData instead */ + override setBuffer(buffer: Buffer) { + this._recordData = Buffer.alloc(buffer.length); + buffer.copy(this._recordData); + } + + /** @deprecated - Use deserialize instead */ + override _doDeserialize(buffer: Buffer): SerializedBuffer { + this._header._doDeserialize(buffer); + this._recordData = Buffer.alloc(this._header._gameMessageLength - 4); + buffer.copy(this._recordData, 0, 8); + return this; + } + + deserialize(buffer: Buffer) { + this._header._doDeserialize(buffer); + this._recordData = Buffer.alloc(this._header.length - 4); + buffer.copy(this._recordData, 0, 8); + return this; + } + + /** @deprecated - Use serialize instead */ + override _doSerialize(): void { + this._header._gameMessageLength = 4 + this._recordData.length; + this._header.length = this._header._gameMessageLength + 4; + const buffer = Buffer.alloc(this._header.length); + let offset = 0; // offset is 0 + this._header.serialize().copy(buffer); + offset += this._header.size(); // offset is 8 + + this._recordData.copy(buffer, offset); + this.setBuffer(buffer); + } + + override serialize() { + this._header._gameMessageLength = 4 + this._recordData.length; + this._header.length = this._header._gameMessageLength + 4; + const buffer = Buffer.alloc(this._header.length); + let offset = 0; // offset is 0 + this._header.serialize().copy(buffer); + offset += this._header.size(); // offset is 8 + + this._recordData.copy(buffer, offset); + return buffer; + } + + override toString() { + return `GameMessage: ${this.serialize().toString("hex")})}`; + } +} diff --git a/packages/shared/GameMessageHeader.ts b/packages/shared/GameMessageHeader.ts new file mode 100644 index 000000000..db75d7a39 --- /dev/null +++ b/packages/shared/GameMessageHeader.ts @@ -0,0 +1,56 @@ +import { ServerError } from "./errors/ServerError.js"; +import { legacyHeader } from "./legacyHeader.js"; + +/** + * A game message header is a 8 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * - 2 bytes - gameMessageId + * - 2 bytes - gameMessageLength + */ + +export class GameMessageHeader extends legacyHeader { + _gameMessageId: number; // 2 bytes + _gameMessageLength: number; // 2 bytes + + constructor(gameMessageId: number) { + super(); + this._size = 8; + this.id = 0x1101; // 2 bytes + this._gameMessageId = gameMessageId; // 2 bytes + this._gameMessageLength = 0; // 2 bytes + } + + size() { + return 8; + } + + deserialize(buffer: Buffer) { + if (buffer.length < 8) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + this._gameMessageId = buffer.readInt16BE(4); + this._gameMessageLength = buffer.readInt16BE(6); + } catch (error) { + throw new ServerError( + `Error deserializing buffer: ${String(error)}`, + ); + } + return this; + } + + serialize() { + const buffer = Buffer.alloc(8); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + buffer.writeInt16BE(this._gameMessageId, 4); + buffer.writeInt16BE(this._gameMessageLength, 6); + return buffer; + } +} diff --git a/packages/shared/LegacyMessage.ts b/packages/shared/LegacyMessage.ts new file mode 100644 index 000000000..3ec17e521 --- /dev/null +++ b/packages/shared/LegacyMessage.ts @@ -0,0 +1,63 @@ +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; +import { legacyHeader } from "./legacyHeader.js"; + +/** + * A legacy message is an older nps message type. It has a 4 byte header. @see {@link legacyHeader} + * + * @mixin {SerializableMixin} + */ + +export class LegacyMessage extends SerializableMixin(AbstractSerializable) { + _header: legacyHeader; + constructor() { + super(); + this._header = new legacyHeader(); + } + + /** + * @param {Buffer} buffer + * @returns {LegacyMessage} + */ + override _doDeserialize(buffer: Buffer): LegacyMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } + + deserialize(buffer: Buffer) { + return this._doDeserialize(buffer); + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + super.data.copy(buffer, this._header._size); + return buffer; + } + + serialize() { + return this._doSerialize(); + } + + /** + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + 4; + } + + asJSON() { + return { + header: this._header, + data: super.data.toString("hex"), + }; + } + + override toString() { + return `LegacyMessage: ${JSON.stringify({ + header: this._header.toString(), + data: super.data.toString("hex"), + })}`; + } +} diff --git a/packages/shared/ListMessage.ts b/packages/shared/ListMessage.ts new file mode 100644 index 000000000..958ea6a5a --- /dev/null +++ b/packages/shared/ListMessage.ts @@ -0,0 +1,62 @@ +import { SerializedBuffer } from "./SerializedBuffer.js"; + +/** + * A list message is a message that contains a list of items of a specific type. + * + * @mixin {SerializableMixin} + */ + +export class ListMessage extends SerializedBuffer { + _msgNo: number; + _listCount: number; + _shouldExpectMoreMessages: boolean; + _list: SerializedBuffer[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._listCount = 0; // 2 bytes + this._shouldExpectMoreMessages = false; // 1 byte + + /** @type {SerializedBuffer[]} */ + this._list = []; // this.itemsType bytes each + } + + /** + * @param {SerializedBuffer} item + */ + add(item: SerializedBuffer) { + this._list.push(item); + this._listCount++; + } + + override serialize() { + let neededSize; + if (this._list.length === 0) { + neededSize = 5; + } else { + neededSize = 5 + this._list.length * this._list[0].size(); + } + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16BE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeInt8(this._listCount, offset); + offset += 1; // offset is 3 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 4 + for (const item of this._list) { + item.serialize().copy(buffer, offset); + offset += item.size(); + } + // offset is now 4 + this._list.length * this._list[0].size() + return buffer; + } + + override size() { + return 5 + this._list.length * this._list[0].size(); + } + + override toString() { + return `ListMessage: msgNo=${this._msgNo} listCount=${this._listCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} list=${this._list}`; + } +} diff --git a/packages/shared/MessageBuffer.ts b/packages/shared/MessageBuffer.ts new file mode 100644 index 000000000..3a0271552 --- /dev/null +++ b/packages/shared/MessageBuffer.ts @@ -0,0 +1,128 @@ +import { ServerError } from "./errors/ServerError.js"; +import { MessageHeader } from "./MessageHeader.js"; +import { SerializedBuffer } from "./SerializedBuffer.js"; + +export class MessageBuffer extends SerializedBuffer { + _header: MessageHeader; + _buffer: Buffer; + constructor() { + super(); + this._header = new MessageHeader(); + this._buffer = Buffer.alloc(4); + } + + /** + * @param {number} id - The ID of the message + * @param {Buffer} buffer - The buffer to deserialize + * @returns {MessageBuffer} + */ + static createGameMessage(id: number, buffer: Buffer): MessageBuffer { + const message = new MessageBuffer(); + message._header._messageId = id; + message.buffer = buffer; + return message; + } + + get messageId() { + return this._header.messageId; + } + + get messageLength() { + return this._header.messageLength; + } + + override get data() { + return this._buffer; + } + + override set data(buffer) { + this.buffer = buffer; + } + + /** + * @param {Buffer} buffer + */ + set buffer(buffer: Buffer) { + // const log = getServerLogger({ module: "MessageBuffer" }); + // log.level = getServerConfiguration({}).logLevel ?? "info"; + this._buffer = Buffer.alloc(buffer.length); + this._buffer = buffer; + this._header._messageLength = 4 + buffer.length; + // log.debug(`Message length: ${this._header._messageLength}`); + // log.debug(`Buffer length: ${this._buffer.length}`); + // Pad the buffer to a multiple of 8 bytes + // let extraBytes = 0; + // const x = (this._buffer.length + 4) % 8; + // extraBytes = 8 - x; + // log.debug(`Extra bytes: ${extraBytes}`); + // if (extraBytes !== 0) { + // this._buffer = Buffer.concat([ + // this._buffer, + // Buffer.alloc(extraBytes), + // ]); + // log.debug(`Buffer length: ${this._buffer.length}`); + this._header._messageLength = this._buffer.length + 4; + // log.debug(`Message length: ${this._header._messageLength}`); + // } + } + + /** @param {Buffer} buffer */ + override setBuffer(buffer: Buffer) { + return (this.buffer = buffer); + } + + get buffer() { + return this._buffer; + } + + serializeSizeOf() { + return 4 + this._buffer.length; + } + + /** + * @param {Buffer} buffer + * @returns {MessageBuffer} + */ + deserialize(buffer: Buffer): MessageBuffer { + this._header.deserialize(buffer.subarray(0, 8)); + if (buffer.length < 4 + this._header.messageLength) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + this.buffer = buffer.subarray(4); + return this; + } + + override serialize() { + const buffer = Buffer.alloc(4 + this._buffer.length); + if (this.buffer.length < 0) { + throw new ServerError( + `Buffer length ${this.buffer.length} is too short to serialize`, + ); + } + if (this.messageId <= 0) { + throw new ServerError( + `Message ID ${this.messageId} is invalid to serialize`, + ); + } + this._header.serialize().copy(buffer); + this._buffer.copy(buffer, 4); + return buffer; + } + + override toString() { + return `MessageBuffer: ${JSON.stringify({ + header: this._header.toString(), + bufferLength: this._buffer.length, + buffer: this._buffer.toString("hex"), + })}`; + } + + asJSON() { + return { + header: this._header, + buffer: this._buffer.toString("hex"), + }; + } +} diff --git a/packages/shared/MessageHeader.ts b/packages/shared/MessageHeader.ts new file mode 100644 index 000000000..f605be619 --- /dev/null +++ b/packages/shared/MessageHeader.ts @@ -0,0 +1,73 @@ +import { SerializedBuffer } from "./SerializedBuffer.js"; + +export class MessageHeader extends SerializedBuffer { + _size: number; + _messageId: number; + _messageLength: number; + constructor() { + super(); + this._size = 4; + this._messageId = 0; // 4 bytes + this._messageLength = 0; // 4 bytes + } + + get messageId() { + return this._messageId; + } + + get messageLength() { + return this._messageLength; + } + + serializeSizeOf() { + return this._size; + } + + override size() { + return this._size; + } + + get id() { + return this._messageId; + } + + get length() { + return this._messageLength; + } + + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + deserialize(buffer: Buffer): MessageHeader { + this._messageId = buffer.readInt16BE(0); + this._messageLength = buffer.readInt16BE(2); + return this; + } + + override serialize() { + const buffer = Buffer.alloc(4); + buffer.writeInt16BE(this._messageId, 0); + buffer.writeInt16BE(this._messageLength, 2); + return buffer; + } + + /** + * @param {Buffer} buffer + * @returns {MessageHeader} + */ + override _doDeserialize(buffer: Buffer): MessageHeader { + return this.deserialize(buffer); + } + + override _doSerialize() { + return this.serialize(); + } + + override toString() { + return `MessageHeader: ${JSON.stringify({ + messageId: this._messageId, + messageLength: this._messageLength, + })}`; + } +} diff --git a/packages/shared/MessageNode.ts b/packages/shared/MessageNode.ts index 5d24e34f5..be72ffa2c 100644 --- a/packages/shared/MessageNode.ts +++ b/packages/shared/MessageNode.ts @@ -1,100 +1,100 @@ import { ServerError } from "./errors/ServerError.js"; -import { SerializedBuffer } from "./messageFactory.js"; +import { SerializedBuffer } from "./SerializedBuffer.js"; export class MessageNode { - header: { - length: number; // 2 bytes - mcoSig: string; - }; - seq: number; - flags: number; - data: Buffer; - msgNo: number; - constructor() { - this.header = { - length: 0, // 2 bytes - mcoSig: "", // 4 bytes - }; - this.seq = 999; // 2 bytes - this.flags = 0; // 1 byte - this.data = Buffer.alloc(0); - this.msgNo = 999; // 2 bytes - } + header: { + length: number; // 2 bytes + mcoSig: string; + }; + seq: number; + flags: number; + data: Buffer; + msgNo: number; + constructor() { + this.header = { + length: 0, // 2 bytes + mcoSig: "", // 4 bytes + }; + this.seq = 999; // 2 bytes + this.flags = 0; // 1 byte + this.data = Buffer.alloc(0); + this.msgNo = 999; // 2 bytes + } - /** - * @static - * @param {module:shared/RawMessage} rawMessage - * @return {MessageNode} - */ - static fromRawMessage(rawMessage: SerializedBuffer): MessageNode { - const messageNode = new MessageNode(); - messageNode.deserialize(rawMessage.serialize()); + /** + * @static + * @param {module:shared/RawMessage} rawMessage + * @return {MessageNode} + */ + static fromRawMessage(rawMessage: SerializedBuffer): MessageNode { + const messageNode = new MessageNode(); + messageNode.deserialize(rawMessage.serialize()); - if (messageNode.data.length > 2) { - messageNode.msgNo = messageNode.data.readInt16LE(0); - } + if (messageNode.data.length > 2) { + messageNode.msgNo = messageNode.data.readInt16LE(0); + } - return messageNode; - } + return messageNode; + } - get size() { - return this.data.length + 9; - } + get size() { + return this.data.length + 9; + } - /** - * - * @param {Buffer} packet - */ - deserialize(packet: Buffer) { - const length = packet.readInt16LE(0); - if (length !== packet.length) { - throw new ServerError( - `[MessageNode] Length of packet ${length.toString()} does not match length of buffer ${packet.length.toString()}`, - ); - } - this.header.length = length; - let offset = 2; - this.header.mcoSig = packet.subarray(offset, offset + 4).toString(); - offset += 4; - this.seq = packet.readInt16LE(offset); - offset += 2; - this.flags = packet.readInt8(offset); - offset += 1; // offset = 9 - this.data = packet.subarray(offset, offset + length - 9); - if (this.data.length > 2) { - this.msgNo = this.data.readInt16LE(0); - } - } + /** + * + * @param {Buffer} packet + */ + deserialize(packet: Buffer) { + const length = packet.readInt16LE(0); + if (length !== packet.length) { + throw new ServerError( + `[MessageNode] Length of packet ${length.toString()} does not match length of buffer ${packet.length.toString()}`, + ); + } + this.header.length = length; + let offset = 2; + this.header.mcoSig = packet.subarray(offset, offset + 4).toString(); + offset += 4; + this.seq = packet.readInt16LE(offset); + offset += 2; + this.flags = packet.readInt8(offset); + offset += 1; // offset = 9 + this.data = packet.subarray(offset, offset + length - 9); + if (this.data.length > 2) { + this.msgNo = this.data.readInt16LE(0); + } + } - /** - * - * @return {Buffer} - */ - serialize(): Buffer { - const packet = Buffer.alloc(this.header.length); - let offset = 0; - packet.writeInt16LE(this.header.length, offset); - offset += 2; - packet.write(this.header.mcoSig, offset, 4); - offset += 4; - packet.writeInt16LE(this.seq, offset); - offset += 2; - packet.writeInt8(this.flags, offset); - offset += 1; - if (typeof this.data === "undefined") { - throw new ServerError("MessageNode data is undefined"); - } - this.data.copy(packet, offset); - return packet; - } + /** + * + * @return {Buffer} + */ + serialize(): Buffer { + const packet = Buffer.alloc(this.header.length); + let offset = 0; + packet.writeInt16LE(this.header.length, offset); + offset += 2; + packet.write(this.header.mcoSig, offset, 4); + offset += 4; + packet.writeInt16LE(this.seq, offset); + offset += 2; + packet.writeInt8(this.flags, offset); + offset += 1; + if (typeof this.data === "undefined") { + throw new ServerError("MessageNode data is undefined"); + } + this.data.copy(packet, offset); + return packet; + } - toString() { - return `MessageNode: ${JSON.stringify({ - header: this.header, - seq: this.seq, - flags: this.flags, - data: this.data.toString("hex"), - msgNo: this.msgNo, - })}`; - } + toString() { + return `MessageNode: ${JSON.stringify({ + header: this.header, + seq: this.seq, + flags: this.flags, + data: this.data.toString("hex"), + msgNo: this.msgNo, + })}`; + } } diff --git a/packages/shared/NPSHeader.ts b/packages/shared/NPSHeader.ts new file mode 100644 index 000000000..df821d7fe --- /dev/null +++ b/packages/shared/NPSHeader.ts @@ -0,0 +1,83 @@ +import { ServerError } from "./errors/ServerError.js"; +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; + +/** + * A nps header is a 12 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * - 2 bytes - version + * - 2 bytes - reserved + * - 4 bytes - checksum + * + * @mixin {SerializableMixin} + */ + +export class NPSHeader extends SerializableMixin(AbstractSerializable) { + _size: number; + id: number; // 2 bytes + length: number; // 2 bytes + version: number; // 2 bytes + reserved: number; // 2 bytes + checksum: number; // 4 bytes + constructor() { + super(); + this._size = 12; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + this.version = 257; // 2 bytes (0x0101) + this.reserved = 0; // 2 bytes + this.checksum = 0; // 4 bytes + } + + /** + * @param {Buffer} buffer + * @returns {NPSHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + override _doDeserialize(buffer: Buffer): NPSHeader { + if (buffer.length < this._size) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + } catch (error) { + throw new ServerError( + `Error deserializing buffer: ${String(error)}`, + ); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + buffer.writeInt16BE(this.version, 4); + buffer.writeInt16BE(this.reserved, 6); + buffer.writeInt32BE(this.checksum, 8); + return buffer; + } + + static size() { + return 12; + } + + static override get Size() { + return 12; + } + + override toString() { + return `NPSHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + version: this.version, + reserved: this.reserved, + checksum: this.checksum, + })}`; + } +} diff --git a/packages/shared/NPSMessage.ts b/packages/shared/NPSMessage.ts new file mode 100644 index 000000000..ae59ce702 --- /dev/null +++ b/packages/shared/NPSMessage.ts @@ -0,0 +1,44 @@ +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; +import { NPSHeader } from "./NPSHeader.js"; + +/** + * A NPS message is a message that matches version 1.1 of the nps protocol. It has a 12 byte header. @see {@link NPSHeader} + * + * @mixin {SerializableMixin} + */ + +export class NPSMessage extends SerializableMixin(AbstractSerializable) { + _header: NPSHeader; + constructor() { + super(); + this._header = new NPSHeader(); + } + + /** + * @param {Buffer} buffer + * @returns {NPSMessage} + */ + override _doDeserialize(buffer: Buffer): NPSMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + return this; + } + + serialize() { + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } + + size() { + return this._header.length + this.data.length; + } + + override toString() { + return `NPSMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString("hex"), + })}`; + } +} diff --git a/packages/shared/OldServerMessage.ts b/packages/shared/OldServerMessage.ts new file mode 100644 index 000000000..79d58b3f2 --- /dev/null +++ b/packages/shared/OldServerMessage.ts @@ -0,0 +1,61 @@ +import { SerializedBuffer } from "./SerializedBuffer.js"; +import { serverHeader } from "./serverHeader.js"; + +/** + * A server message is a message that is passed between the server and the client. It has an 11 byte header. @see {@link serverHeader} + * + * @mixin {SerializableMixin} + */ + +export class OldServerMessage extends SerializedBuffer { + _header: serverHeader; + _msgNo: number; + constructor() { + super(); + this._header = new serverHeader(); + this._msgNo = 0; // 2 bytes + } + + override size(): number { + return this._header.length + this.data.length; + } + + /** + * @param {Buffer} buffer + * @returns {OldServerMessage} + */ + override _doDeserialize(buffer: Buffer): OldServerMessage { + this._header._doDeserialize(buffer); + this.setBuffer(buffer.subarray(this._header._size)); + if (this.data.length > 2) { + this._msgNo = this.data.readInt16LE(0); + } + return this; + } + + override serialize() { + const buffer = Buffer.alloc(this._header.length + 2); + this._header._doSerialize().copy(buffer); + this.data.copy(buffer, this._header._size); + return buffer; + } + + /** + * @param {Buffer} buffer + */ + override setBuffer(buffer: Buffer) { + super.setBuffer(buffer); + this._header.length = buffer.length + this._header._size - 2; + } + + updateMsgNo() { + this._msgNo = this.data.readInt16LE(0); + } + + override toString() { + return `ServerMessage: ${JSON.stringify({ + header: this._header.toString(), + data: this.data.toString("hex"), + })}`; + } +} diff --git a/packages/shared/SerializedBuffer.ts b/packages/shared/SerializedBuffer.ts new file mode 100644 index 000000000..1ab54e012 --- /dev/null +++ b/packages/shared/SerializedBuffer.ts @@ -0,0 +1,35 @@ +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; + +/** + * A raw message is a message that is not parsed into a specific type. + * It has no header, and is just a serialized buffer. + * + * @mixin {SerializableMixin} + */ + +export class SerializedBuffer extends SerializableMixin(AbstractSerializable) { + constructor() { + super(); + } + + /** + * @param {Buffer} buffer + * @returns {SerializedBuffer} + */ + override _doDeserialize(buffer: Buffer): SerializedBuffer { + this.setBuffer(buffer); + return this; + } + + serialize() { + return this.data; + } + + override toString() { + return `SerializedBuffer: ${this.serialize().toString("hex")}`; + } + + size() { + return this.data.length; + } +} diff --git a/packages/shared/ServerMessage.test.ts b/packages/shared/ServerMessage.test.ts index fa4924182..6f976f33c 100644 --- a/packages/shared/ServerMessage.test.ts +++ b/packages/shared/ServerMessage.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { OldServerMessage } from "./messageFactory.js"; +import { OldServerMessage } from "./OldServerMessage.js"; describe("ServerMessage", () => { describe(".byteLength", () => { diff --git a/packages/shared/State.ts b/packages/shared/State.ts index d28615b51..71ddbfacc 100644 --- a/packages/shared/State.ts +++ b/packages/shared/State.ts @@ -9,7 +9,7 @@ import { Cipher, Decipher } from "crypto"; import { Socket } from "node:net"; import { Logger } from "pino"; -import { SerializedBuffer } from "./messageFactory.js"; +import { SerializedBuffer } from "./SerializedBuffer.js"; /** * @external RawMessage @@ -44,105 +44,105 @@ import { SerializedBuffer } from "./messageFactory.js"; * A pair of encryption ciphers. */ export class McosEncryptionPair { - _cipher: Cipher; - _decipher: Decipher; - /** - * Create a new encryption pair. - * - * This function creates a new encryption pair. It is used to encrypt and - * decrypt data sent to and from the client. - * - * @param {module:crypto.Cipher} cipher The cipher to use for encryption. - * @param {module:crypto.Decipher} decipher The decipher to use for decryption. - */ - constructor(cipher: Cipher, decipher: Decipher) { - this._cipher = cipher; - this._decipher = decipher; - } - - /** - * @param {Buffer} data The data to encrypt. - * @returns {Buffer} The encrypted data. - */ - encrypt(data: Buffer): Buffer { - return this._cipher.update(data); - } - - /** - * @param {Buffer} data The data to decrypt. - * @returns {Buffer} The decrypted data. - */ - decrypt(data: Buffer): Buffer { - return this._decipher.update(data); - } + _cipher: Cipher; + _decipher: Decipher; + /** + * Create a new encryption pair. + * + * This function creates a new encryption pair. It is used to encrypt and + * decrypt data sent to and from the client. + * + * @param {module:crypto.Cipher} cipher The cipher to use for encryption. + * @param {module:crypto.Decipher} decipher The decipher to use for decryption. + */ + constructor(cipher: Cipher, decipher: Decipher) { + this._cipher = cipher; + this._decipher = decipher; + } + + /** + * @param {Buffer} data The data to encrypt. + * @returns {Buffer} The encrypted data. + */ + encrypt(data: Buffer): Buffer { + return this._cipher.update(data); + } + + /** + * @param {Buffer} data The data to decrypt. + * @returns {Buffer} The decrypted data. + */ + decrypt(data: Buffer): Buffer { + return this._decipher.update(data); + } } /** * The encryption settings for a session. */ export class McosEncryption { - connectionId: string; - _commandEncryptionPair: McosEncryptionPair; - _dataEncryptionPair: McosEncryptionPair; - /** - * Create a new encryption object. - * - * @param {object} args - * @param {string} args.connectionId The connection id of the session that - * this encryption is for. - * @param {McosEncryptionPair} args.commandEncryptionPair The encryption - * pair for - * command packets. - * @param {McosEncryptionPair} args.dataEncryptionPair The encryption pair - * for data packets. - */ - constructor({ - connectionId, - commandEncryptionPair, - dataEncryptionPair, - }: { - connectionId: string; - commandEncryptionPair: McosEncryptionPair; - dataEncryptionPair: McosEncryptionPair; - }) { - this.connectionId = connectionId; - this._commandEncryptionPair = commandEncryptionPair; - this._dataEncryptionPair = dataEncryptionPair; - } - - get commandEncryption() { - return this._commandEncryptionPair; - } - - get dataEncryption() { - return this._dataEncryptionPair; - } + connectionId: string; + _commandEncryptionPair: McosEncryptionPair; + _dataEncryptionPair: McosEncryptionPair; + /** + * Create a new encryption object. + * + * @param {object} args + * @param {string} args.connectionId The connection id of the session that + * this encryption is for. + * @param {McosEncryptionPair} args.commandEncryptionPair The encryption + * pair for + * command packets. + * @param {McosEncryptionPair} args.dataEncryptionPair The encryption pair + * for data packets. + */ + constructor({ + connectionId, + commandEncryptionPair, + dataEncryptionPair, + }: { + connectionId: string; + commandEncryptionPair: McosEncryptionPair; + dataEncryptionPair: McosEncryptionPair; + }) { + this.connectionId = connectionId; + this._commandEncryptionPair = commandEncryptionPair; + this._dataEncryptionPair = dataEncryptionPair; + } + + get commandEncryption() { + return this._commandEncryptionPair; + } + + get dataEncryption() { + return this._dataEncryptionPair; + } } /** * A client session. */ export class McosSession { - connectionId: string; - gameId: number; - /** - * Create a new session. - * - * @param {object} args - * @param {string} args.connectionId A unique identifier for this session. - * @param {number} args.username The username of the user who owns this - * session. - */ - constructor({ - connectionId, - gameId, - }: { - connectionId: string; - gameId: number; - }) { - this.connectionId = connectionId; - this.gameId = gameId; - } + connectionId: string; + gameId: number; + /** + * Create a new session. + * + * @param {object} args + * @param {string} args.connectionId A unique identifier for this session. + * @param {number} args.username The username of the user who owns this + * session. + */ + constructor({ + connectionId, + gameId, + }: { + connectionId: string; + gameId: number; + }) { + this.connectionId = connectionId; + this.gameId = gameId; + } } /** @@ -157,8 +157,8 @@ export class McosSession { * @interface */ interface WrappedSocket { - socket: Socket; - connectionId: string; + socket: Socket; + connectionId: string; } /** @@ -169,29 +169,29 @@ interface WrappedSocket { * @returns {WrappedSocket} The wrapped socket. */ export function wrapSocket( - socket: Socket, - connectionId: string, + socket: Socket, + connectionId: string, ): WrappedSocket { - return { - socket, - connectionId, - }; + return { + socket, + connectionId, + }; } interface OnDataHandlerArgs { - args: { - connectionId: string; - message: SerializedBuffer; - log?: Logger; - }; + args: { + connectionId: string; + message: SerializedBuffer; + log?: Logger; + }; } /** * @requires module:packages/shared/RawMessage */ export interface ServiceResponse { - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; } export type OnDataHandler = Function; @@ -217,13 +217,13 @@ export type OnDataHandler = Function; * @interface */ export interface State { - filePaths: Record; - sockets: Record; - encryptions: Record; - sessions: Record; - queuedConnections: Record; - onDataHandlers: Record; - save: (state?: State) => void; + filePaths: Record; + sockets: Record; + encryptions: Record; + sessions: Record; + queuedConnections: Record; + onDataHandlers: Record; + save: (state?: State) => void; } /** @@ -243,28 +243,28 @@ export interface State { * @returns The initial state. */ export function createInitialState({ - saveFunction = saveStateToDatabase, + saveFunction = saveStateToDatabase, }: { - saveFunction?: (state: State) => void; + saveFunction?: (state: State) => void; }): State { - return { - filePaths: {}, - sockets: {}, - encryptions: {}, - sessions: {}, - queuedConnections: {}, - onDataHandlers: {}, - save: function (state?: State) { - if (typeof state === "undefined") { - state = this as State; - } - if (typeof saveFunction === "undefined") { - saveStateToDatabase(state); - return; - } - saveFunction(state); - }, - }; + return { + filePaths: {}, + sockets: {}, + encryptions: {}, + sessions: {}, + queuedConnections: {}, + onDataHandlers: {}, + save: function (state?: State) { + if (typeof state === "undefined") { + state = this as State; + } + if (typeof saveFunction === "undefined") { + saveStateToDatabase(state); + return; + } + saveFunction(state); + }, + }; } /** @@ -283,17 +283,17 @@ export function createInitialState({ * @returns {State} The state with the data handler added. */ export function addOnDataHandler( - state: State, - port: number, - handler: OnDataHandler, + state: State, + port: number, + handler: OnDataHandler, ): State { - const onDataHandlers = state.onDataHandlers; - onDataHandlers[port.toString()] = handler; - const newState = { - ...state, - onDataHandlers, - }; - return newState; + const onDataHandlers = state.onDataHandlers; + onDataHandlers[port.toString()] = handler; + const newState = { + ...state, + onDataHandlers, + }; + return newState; } /** @@ -313,10 +313,10 @@ export function addOnDataHandler( * handler exists */ export function getOnDataHandler( - state: State, - port: number, + state: State, + port: number, ): OnDataHandler | undefined { - return state.onDataHandlers[port.toString()]; + return state.onDataHandlers[port.toString()]; } /** @@ -332,12 +332,12 @@ export function getOnDataHandler( * @returns {State} The state with the socket added. */ export function addSocket(state: State, socket: WrappedSocket): State { - const sockets = state.sockets; - sockets[socket.connectionId] = socket; - return { - ...state, - sockets, - }; + const sockets = state.sockets; + sockets[socket.connectionId] = socket; + return { + ...state, + sockets, + }; } /** @@ -350,10 +350,10 @@ export function addSocket(state: State, socket: WrappedSocket): State { * @returns {WrappedSocket | undefined} The socket with the given connection id, or undefined if no socket */ export function getSocket( - state: State, - connectionId: string, + state: State, + connectionId: string, ): WrappedSocket | undefined { - return state.sockets[connectionId]; + return state.sockets[connectionId]; } /** @@ -365,7 +365,7 @@ export function getSocket( * @returns {Record} An array of all the sockets in the state. */ export function getSockets(state: State): Record { - return state.sockets; + return state.sockets; } /** @@ -381,12 +381,12 @@ export function getSockets(state: State): Record { * @returns {State} The state with the socket removed. */ export function removeSocket(state: State, connectionId: string): State { - const sockets = state.sockets; - delete sockets[connectionId]; - return { - ...state, - sockets, - }; + const sockets = state.sockets; + delete sockets[connectionId]; + return { + ...state, + sockets, + }; } /** @@ -402,15 +402,15 @@ export function removeSocket(state: State, connectionId: string): State { * @returns {State} The state with the queued connection added. */ export function addQueuedConnection( - state: State, - socket: WrappedSocket, + state: State, + socket: WrappedSocket, ): State { - const queuedConnections = state.queuedConnections; - queuedConnections[socket.connectionId] = socket; - return { - ...state, - queuedConnections, - }; + const queuedConnections = state.queuedConnections; + queuedConnections[socket.connectionId] = socket; + return { + ...state, + queuedConnections, + }; } /** @@ -422,7 +422,7 @@ export function addQueuedConnection( * @returns {string[]} An array of all the queued connections in the state. */ export function getQueuedConnections(state: State): string[] { - return Object.keys(state.queuedConnections); + return Object.keys(state.queuedConnections); } /** @@ -438,15 +438,15 @@ export function getQueuedConnections(state: State): string[] { * @returns {State} The state with the queued connection removed. */ export function removeQueuedConnection( - state: State, - connectionId: string, + state: State, + connectionId: string, ): State { - const queuedConnections = state.queuedConnections; - delete queuedConnections[connectionId]; - return { - ...state, - queuedConnections, - }; + const queuedConnections = state.queuedConnections; + delete queuedConnections[connectionId]; + return { + ...state, + queuedConnections, + }; } /** @@ -462,12 +462,12 @@ export function removeQueuedConnection( * @returns {State} - The state with the encryption added. */ export function addEncryption(state: State, encryption: McosEncryption): State { - const encryptions = state.encryptions; - encryptions[encryption.connectionId] = encryption; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + encryptions[encryption.connectionId] = encryption; + return { + ...state, + encryptions, + }; } /** @@ -480,10 +480,10 @@ export function addEncryption(state: State, encryption: McosEncryption): State { * @returns {McosEncryption | undefined} The encryption with the given connection id, or undefined if no encryption */ export function getEncryption( - state: State, - connectionId: string, + state: State, + connectionId: string, ): McosEncryption | undefined { - return state.encryptions[connectionId]; + return state.encryptions[connectionId]; } /** @@ -499,15 +499,15 @@ export function getEncryption( * @returns {State} The state with the encryption updated. */ export function updateEncryption( - state: State, - encryption: McosEncryption, + state: State, + encryption: McosEncryption, ): State { - const encryptions = state.encryptions; - encryptions[encryption.connectionId] = encryption; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + encryptions[encryption.connectionId] = encryption; + return { + ...state, + encryptions, + }; } /** @@ -523,12 +523,12 @@ export function updateEncryption( * @returns {State} The state with the encryption removed. */ export function removeEncryption(state: State, connectionId: string): State { - const encryptions = state.encryptions; - delete encryptions[connectionId]; - return { - ...state, - encryptions, - }; + const encryptions = state.encryptions; + delete encryptions[connectionId]; + return { + ...state, + encryptions, + }; } /** @@ -544,12 +544,12 @@ export function removeEncryption(state: State, connectionId: string): State { * @returns {State} The state with the session added. */ export function addSession(state: State, session: McosSession): State { - const sessions = state.sessions; - sessions[session.connectionId] = session; - return { - ...state, - sessions, - }; + const sessions = state.sessions; + sessions[session.connectionId] = session; + return { + ...state, + sessions, + }; } /** @@ -566,19 +566,19 @@ export function addSession(state: State, session: McosSession): State { * @returns {State} The state with the session removed. */ export function removeSession(state: State, connectionId: string): State { - const sessions = state.sessions; - delete sessions[connectionId]; - return { - ...state, - sessions, - }; + const sessions = state.sessions; + delete sessions[connectionId]; + return { + ...state, + sessions, + }; } export function findSessionByConnectionId( - state: State, - connectionId: string, + state: State, + connectionId: string, ): McosSession | undefined { - return state.sessions[connectionId]; + return state.sessions[connectionId]; } /** @@ -589,7 +589,7 @@ export function findSessionByConnectionId( * @returns {State} The state from the database. */ export function fetchStateFromDatabase(): State { - return globalStateDatabase; + return globalStateDatabase; } /** @@ -600,7 +600,7 @@ export function fetchStateFromDatabase(): State { * @param {State} state The state to save to the database. */ function saveStateToDatabase(state: State) { - globalStateDatabase = state; + globalStateDatabase = state; } let globalStateDatabase = createInitialState({}); diff --git a/packages/shared/TimeStamp.ts b/packages/shared/TimeStamp.ts index 1664cc835..c74a6b974 100644 --- a/packages/shared/TimeStamp.ts +++ b/packages/shared/TimeStamp.ts @@ -1,76 +1,76 @@ -import { SerializedBuffer } from "./messageFactory.js"; +import { SerializedBuffer } from "./SerializedBuffer.js"; export class Timestamp extends SerializedBuffer { - _year: number; - _month: number; - _day: number; - _hour: number; - _minute: number; - _second: number; - _fraction: number; - constructor() { - super(); - this._year = 0; // 2 bytes - this._month = 0; // 2 bytes - this._day = 0; // 2 bytes - this._hour = 0; // 2 bytes - this._minute = 0; // 2 bytes - this._second = 0; // 2 bytes - this._fraction = 0; // 2 bytes - // total: 14 bytes - } + _year: number; + _month: number; + _day: number; + _hour: number; + _minute: number; + _second: number; + _fraction: number; + constructor() { + super(); + this._year = 0; // 2 bytes + this._month = 0; // 2 bytes + this._day = 0; // 2 bytes + this._hour = 0; // 2 bytes + this._minute = 0; // 2 bytes + this._second = 0; // 2 bytes + this._fraction = 0; // 2 bytes + // total: 14 bytes + } - override size() { - return 14; - } + override size() { + return 14; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt16LE(this._year, offset); - offset += 2; - buffer.writeUInt16LE(this._month, offset); - offset += 2; - buffer.writeUInt16LE(this._day, offset); - offset += 2; - buffer.writeUInt16LE(this._hour, offset); - offset += 2; - buffer.writeUInt16LE(this._minute, offset); - offset += 2; - buffer.writeUInt16LE(this._second, offset); - offset += 2; - buffer.writeUInt8(this._fraction, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt16LE(this._year, offset); + offset += 2; + buffer.writeUInt16LE(this._month, offset); + offset += 2; + buffer.writeUInt16LE(this._day, offset); + offset += 2; + buffer.writeUInt16LE(this._hour, offset); + offset += 2; + buffer.writeUInt16LE(this._minute, offset); + offset += 2; + buffer.writeUInt16LE(this._second, offset); + offset += 2; + buffer.writeUInt8(this._fraction, offset); - return buffer; - } + return buffer; + } - override toString() { - return `TimeStamp: year=${this._year} month=${this._month} day=${this._day} hour=${this._hour} minute=${this._minute} second=${this._second} fraction=${this._fraction}`; - } + override toString() { + return `TimeStamp: year=${this._year} month=${this._month} day=${this._day} hour=${this._hour} minute=${this._minute} second=${this._second} fraction=${this._fraction}`; + } - as64BitNumber() { - const year = this._year * 100000000000000; - const month = this._month * 1000000000000; - const day = this._day * 10000000000; - const hour = this._hour * 100000000; - const minute = this._minute * 1000000; - const second = this._second * 10000; - const fraction = this._fraction; + as64BitNumber() { + const year = this._year * 100000000000000; + const month = this._month * 1000000000000; + const day = this._day * 10000000000; + const hour = this._hour * 100000000; + const minute = this._minute * 1000000; + const second = this._second * 10000; + const fraction = this._fraction; - return year + month + day + hour + minute + second + fraction; - } + return year + month + day + hour + minute + second + fraction; + } - static now() { - const now = new Date(); - const timestamp = new Timestamp(); - timestamp._year = now.getFullYear(); - timestamp._month = now.getMonth() + 1; - timestamp._day = now.getDate(); - timestamp._hour = now.getHours(); - timestamp._minute = now.getMinutes(); - timestamp._second = now.getSeconds(); - timestamp._fraction = now.getMilliseconds(); + static now() { + const now = new Date(); + const timestamp = new Timestamp(); + timestamp._year = now.getFullYear(); + timestamp._month = now.getMonth() + 1; + timestamp._day = now.getDate(); + timestamp._hour = now.getHours(); + timestamp._minute = now.getMinutes(); + timestamp._second = now.getSeconds(); + timestamp._fraction = now.getMilliseconds(); - return timestamp; - } + return timestamp; + } } diff --git a/packages/shared/deserializeString.ts b/packages/shared/deserializeString.ts new file mode 100644 index 000000000..b6d64f008 --- /dev/null +++ b/packages/shared/deserializeString.ts @@ -0,0 +1,21 @@ +import { ServerError } from "./errors/ServerError.js"; + +/** + * @param {Buffer} buffer + * @returns {string} + */ + +export function deserializeString(buffer: Buffer): string { + try { + const stringLength = buffer.readInt32BE(0); + const stringBuffer = buffer.subarray(4, 4 + (stringLength - 1)); + + const string = stringBuffer.toString("utf8").trim(); + return string; + } catch (error) { + throw ServerError.fromUnknown( + error, + `Error deserializing string from buffer ${buffer.toString("hex")}`, + ); + } +} diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 67173364c..77e248773 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -1,6 +1,6 @@ export { SubThread } from "./SubThread.js"; export { NetworkMessage } from "./src/NetworkMessage.js"; -export { ServerLogger, getServerLogger } from "./src/log.js"; +export { ServerLogger, getServerLogger } from "./log.js"; export { Configuration, getServerConfiguration } from "./Configuration.js"; export { RawMessage } from "./src/RawMessage.js"; @@ -23,9 +23,4 @@ export interface ConnectionRecord { contextId: string; } -export { - McosEncryptionPair, - createCommandEncryptionPair, - createDataEncryptionPair, - verifyLegacyCipherSupport, -} from "./src/encryption.js"; + diff --git a/packages/shared/legacyHeader.ts b/packages/shared/legacyHeader.ts new file mode 100644 index 000000000..7d9f7bfe2 --- /dev/null +++ b/packages/shared/legacyHeader.ts @@ -0,0 +1,61 @@ +import { ServerError } from "./errors/ServerError.js"; +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; + +/** + * A legacy header is a 4 byte header with the following fields: + * - 2 bytes - id + * - 2 bytes - length + * + * + */ + +export class legacyHeader extends SerializableMixin(AbstractSerializable) { + _size: number; + id: number; + length: any; + constructor() { + super(); + this._size = 4; + this.id = 0; // 2 bytes + this.length = this._size; // 2 bytes + } + + /** + * @param {Buffer} buffer + */ + override _doDeserialize(buffer: Buffer) { + if (buffer.length < 4) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.id = buffer.readInt16BE(0); + this.length = buffer.readInt16BE(2); + } catch (error) { + throw new ServerError( + `Error deserializing buffer: ${String(error)}`, + ); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16BE(this.id, 0); + buffer.writeInt16BE(this.length, 2); + return buffer; + } + + override toString() { + return `LegacyHeader: ${JSON.stringify({ + id: this.id, + length: this.length, + })}`; + } + + static override get Size() { + return 4; + } +} diff --git a/packages/shared/messageFactory.ts b/packages/shared/messageFactory.ts index a57baba78..26497e674 100644 --- a/packages/shared/messageFactory.ts +++ b/packages/shared/messageFactory.ts @@ -15,49 +15,49 @@ import { ServerError } from "./errors/ServerError.js"; * @property {Buffer} data * @property {number} Size */ -class AbstractSerializable { - internalBuffer: Buffer; - constructor() { - if (this.constructor === AbstractSerializable) { - throw new TypeError( - "Abstract class 'AbstractSerializable' cannot be instantiated directly.", - ); - } - /** @private */ - this.internalBuffer = Buffer.alloc(0); - } - - _doSerialize() { - throw new ServerError("Method '_doSerialize()' must be implemented."); - } - - /** - * @param {Buffer} _buffer - * @returns {AbstractSerializable} - */ - // eslint-disable-next-line no-unused-vars - _doDeserialize(_buffer: Buffer): AbstractSerializable { - throw new ServerError("Method '_doDeserialize()' must be implemented."); - } - - get data() { - return this.internalBuffer; - } - - /** - * @param {Buffer} buffer - */ - setBuffer(buffer: Buffer) { - this.internalBuffer = Buffer.alloc(buffer.length); - this.internalBuffer = buffer; - } - - /** - * @returns {number} - */ - static get Size(): number { - throw new ServerError("Method 'Size' must be implemented."); - } +export class AbstractSerializable { + internalBuffer: Buffer; + constructor() { + if (this.constructor === AbstractSerializable) { + throw new TypeError( + "Abstract class 'AbstractSerializable' cannot be instantiated directly.", + ); + } + /** @private */ + this.internalBuffer = Buffer.alloc(0); + } + + _doSerialize() { + throw new ServerError("Method '_doSerialize()' must be implemented."); + } + + /** + * @param {Buffer} _buffer + * @returns {AbstractSerializable} + */ + // eslint-disable-next-line no-unused-vars + _doDeserialize(_buffer: Buffer): AbstractSerializable { + throw new ServerError("Method '_doDeserialize()' must be implemented."); + } + + get data() { + return this.internalBuffer; + } + + /** + * @param {Buffer} buffer + */ + setBuffer(buffer: Buffer) { + this.internalBuffer = Buffer.alloc(buffer.length); + this.internalBuffer = buffer; + } + + /** + * @returns {number} + */ + static get Size(): number { + throw new ServerError("Method 'Size' must be implemented."); + } } /** @@ -65,851 +65,23 @@ class AbstractSerializable { * @param {typeof AbstractSerializable} Base * @returns {typeof AbstractSerializable} */ -const SerializableMixin = ( - Base: typeof AbstractSerializable, +export const SerializableMixin = ( + Base: typeof AbstractSerializable, ): typeof AbstractSerializable => - class extends Base { - constructor() { - super(); - } - - serialize() { - return this._doSerialize(); - } - - /** - * @param {Buffer} buffer - * @returns {AbstractSerializable} - */ - deserialize(buffer: Buffer): AbstractSerializable { - return this._doDeserialize(buffer); - } - }; - -/** - * @param {Buffer} buffer - * @returns {string} - */ -export function deserializeString(buffer: Buffer): string { - try { - const stringLength = buffer.readInt32BE(0); - const stringBuffer = buffer.subarray(4, 4 + (stringLength - 1)); - - const string = stringBuffer.toString("utf8").trim(); - return string; - } catch (error) { - throw ServerError.fromUnknown( - error, - `Error deserializing string from buffer ${buffer.toString("hex")}`, - ); - } -} - -/** - * Serializes a string with length prefix - * @param {string} string - * @param {Buffer} targetBuffer - * @param {number} offset - * @returns {number} - */ -export function serializeString( - string: string, - targetBuffer: Buffer, - offset: number, -): number { - const buffer = Buffer.alloc(4 + string.length + 1); - buffer.writeInt32BE(string.length + 1, 0); - const stringToWrite = string + "\0"; - buffer.write(stringToWrite, 4, stringToWrite.length, "utf8"); - buffer.copy(targetBuffer, offset); - offset += buffer.length; - return offset; -} - -/** - * Serializes a raw string without length prefix - * @param {string} string - * @param {Buffer} targetBuffer - * @param {number} offset - * @param {number} length - * @returns {number} - */ -export function serializeStringRaw( - string: string, - targetBuffer: Buffer, - offset: number, - length: number, -): number { - const stringToWrite = string; - targetBuffer.write(stringToWrite, offset, string.length, "utf8"); - offset += stringToWrite.length; - return offset; -} - -/** - * A legacy header is a 4 byte header with the following fields: - * - 2 bytes - id - * - 2 bytes - length - * - * - */ -class legacyHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; - length: any; - constructor() { - super(); - this._size = 4; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - } - - /** - * @param {Buffer} buffer - */ - override _doDeserialize(buffer: Buffer) { - if (buffer.length < 4) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - } catch (error) { - throw new ServerError(`Error deserializing buffer: ${String(error)}`); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - return buffer; - } - - override toString() { - return `LegacyHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - })}`; - } - - static override get Size() { - return 4; - } -} - -/** - * A game message header is a 8 byte header with the following fields: - * - 2 bytes - id - * - 2 bytes - length - * - 2 bytes - gameMessageId - * - 2 bytes - gameMessageLength - */ -export class GameMessageHeader extends legacyHeader { - _gameMessageId: number; // 2 bytes - _gameMessageLength: number; // 2 bytes - - constructor(gameMessageId: number) { - super(); - this._size = 8; - this.id = 0x1101; // 2 bytes - this._gameMessageId = gameMessageId; // 2 bytes - this._gameMessageLength = 0; // 2 bytes - } - - size() { - return 8; - } - - deserialize(buffer: Buffer) { - if (buffer.length < 8) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - this._gameMessageId = buffer.readInt16BE(4); - this._gameMessageLength = buffer.readInt16BE(6); - } catch (error) { - throw new ServerError(`Error deserializing buffer: ${String(error)}`); - } - return this; - } - - serialize() { - const buffer = Buffer.alloc(8); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - buffer.writeInt16BE(this._gameMessageId, 4); - buffer.writeInt16BE(this._gameMessageLength, 6); - return buffer; - } -} - -/** - * A nps header is a 12 byte header with the following fields: - * - 2 bytes - id - * - 2 bytes - length - * - 2 bytes - version - * - 2 bytes - reserved - * - 4 bytes - checksum - * - * @mixin {SerializableMixin} - */ -export class NPSHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - id: number; // 2 bytes - length: number; // 2 bytes - version: number; // 2 bytes - reserved: number; // 2 bytes - checksum: number; // 4 bytes - constructor() { - super(); - this._size = 12; - this.id = 0; // 2 bytes - this.length = this._size; // 2 bytes - this.version = 257; // 2 bytes (0x0101) - this.reserved = 0; // 2 bytes - this.checksum = 0; // 4 bytes - } - - /** - * @param {Buffer} buffer - * @returns {NPSHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): NPSHeader { - if (buffer.length < this._size) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.id = buffer.readInt16BE(0); - this.length = buffer.readInt16BE(2); - } catch (error) { - throw new ServerError(`Error deserializing buffer: ${String(error)}`); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16BE(this.id, 0); - buffer.writeInt16BE(this.length, 2); - buffer.writeInt16BE(this.version, 4); - buffer.writeInt16BE(this.reserved, 6); - buffer.writeInt32BE(this.checksum, 8); - return buffer; - } - - static size() { - return 12; - } - - static override get Size() { - return 12; - } - - override toString() { - return `NPSHeader: ${JSON.stringify({ - id: this.id, - length: this.length, - version: this.version, - reserved: this.reserved, - checksum: this.checksum, - })}`; - } -} - -/** - * A server header is an 11 byte header with the following fields: - * - 2 bytes - length - * - 4 bytes - mcoSig - * - 4 bytes - sequence - * - 1 byte - flags - */ -export class serverHeader extends SerializableMixin(AbstractSerializable) { - _size: number; - length: any; - mcoSig: string; - sequence: number; - flags: number; - constructor() { - super(); - this._size = 11; - this.length = this._size; // 2 bytes - this.mcoSig = "TOMC"; // 4 bytes - this.sequence = 0; // 4 bytes - this.flags = 0; // 1 byte - } - - size() { - return this._size; - } - - /** - * @param {Buffer} buffer - * @returns {serverHeader} - * @throws {Error} If the buffer is too short - * @throws {Error} If the buffer is malformed - */ - override _doDeserialize(buffer: Buffer): serverHeader { - if (buffer.length < this._size) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - - try { - this.length = buffer.readInt16LE(0); - this.mcoSig = buffer.toString("utf8", 2, 6); - this.sequence = buffer.readInt32LE(6); - this.flags = buffer.readInt8(10); - } catch (error) { - throw new ServerError(`Error deserializing buffer: ${String(error)}`); - } - return this; - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._size); - buffer.writeInt16LE(this.length, 0); - buffer.write(this.mcoSig, 2, 6, "utf8"); - buffer.writeInt32LE(this.sequence, 6); - buffer.writeInt8(this.flags, 10); - return buffer; - } - - override toString() { - return `ServerHeader: ${JSON.stringify({ - length: this.length, - mcoSig: this.mcoSig, - sequence: this.sequence, - flags: this.flags, - })}`; - } -} - -/** - * A legacy message is an older nps message type. It has a 4 byte header. @see {@link legacyHeader} - * - * @mixin {SerializableMixin} - */ -export class LegacyMessage extends SerializableMixin(AbstractSerializable) { - _header: legacyHeader; - constructor() { - super(); - this._header = new legacyHeader(); - } - - /** - * @param {Buffer} buffer - * @returns {LegacyMessage} - */ - override _doDeserialize(buffer: Buffer): LegacyMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } - - deserialize(buffer: Buffer) { - return this._doDeserialize(buffer); - } - - override _doSerialize() { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - super.data.copy(buffer, this._header._size); - return buffer; - } - - serialize() { - return this._doSerialize(); - } - - /** - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + 4; - } - - asJSON() { - return { - header: this._header, - data: super.data.toString("hex"), - }; - } - - override toString() { - return `LegacyMessage: ${JSON.stringify({ - header: this._header.toString(), - data: super.data.toString("hex"), - })}`; - } -} - -/** - * A NPS message is a message that matches version 1.1 of the nps protocol. It has a 12 byte header. @see {@link NPSHeader} - * - * @mixin {SerializableMixin} - */ -export class NPSMessage extends SerializableMixin(AbstractSerializable) { - _header: NPSHeader; - constructor() { - super(); - this._header = new NPSHeader(); - } - - /** - * @param {Buffer} buffer - * @returns {NPSMessage} - */ - override _doDeserialize(buffer: Buffer): NPSMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - return this; - } - - serialize() { - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } - - size() { - return this._header.length + this.data.length; - } - - override toString() { - return `NPSMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } -} - -/** - * A raw message is a message that is not parsed into a specific type. - * It has no header, and is just a serialized buffer. - * - * @mixin {SerializableMixin} - */ -export class SerializedBuffer extends SerializableMixin(AbstractSerializable) { - constructor() { - super(); - } - - /** - * @param {Buffer} buffer - * @returns {SerializedBuffer} - */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { - this.setBuffer(buffer); - return this; - } - - serialize() { - return this.data; - } - - override toString() { - return `SerializedBuffer: ${this.serialize().toString("hex")}`; - } - - size() { - return this.data.length; - } -} - -export class GameMessage extends SerializedBuffer { - _header: GameMessageHeader; - _recordData: Buffer; - constructor(gameMessageId: number) { - super(); - this._header = new GameMessageHeader(gameMessageId); - this._recordData = Buffer.alloc(0); - } - - setRecordData(buffer: Buffer) { - this._recordData = Buffer.alloc(buffer.length); - buffer.copy(this._recordData); - } - - /** @deprecated - Use setRecordData instead */ - override setBuffer(buffer: Buffer) { - this._recordData = Buffer.alloc(buffer.length); - buffer.copy(this._recordData); - } - - /** @deprecated - Use deserialize instead */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { - this._header._doDeserialize(buffer); - this._recordData = Buffer.alloc(this._header._gameMessageLength - 4); - buffer.copy(this._recordData, 0, 8); - return this; - } - - deserialize(buffer: Buffer) { - this._header._doDeserialize(buffer); - this._recordData = Buffer.alloc(this._header.length - 4); - buffer.copy(this._recordData, 0, 8); - return this; - } - - /** @deprecated - Use serialize instead */ - override _doSerialize(): void { - this._header._gameMessageLength = 4 + this._recordData.length; - this._header.length = this._header._gameMessageLength + 4; - const buffer = Buffer.alloc(this._header.length); - let offset = 0; // offset is 0 - this._header.serialize().copy(buffer); - offset += this._header.size(); // offset is 8 - - this._recordData.copy(buffer, offset); - this.setBuffer(buffer); - } - - override serialize() { - this._header._gameMessageLength = 4 + this._recordData.length; - this._header.length = this._header._gameMessageLength + 4; - const buffer = Buffer.alloc(this._header.length); - let offset = 0; // offset is 0 - this._header.serialize().copy(buffer); - offset += this._header.size(); // offset is 8 - - this._recordData.copy(buffer, offset); - return buffer; - } - - override toString() { - return `GameMessage: ${this.serialize().toString("hex")})}`; - } -} - -/** - * A list message is a message that contains a list of items of a specific type. - * - * @mixin {SerializableMixin} - */ -export class ListMessage extends SerializedBuffer { - _msgNo: number; - _listCount: number; - _shouldExpectMoreMessages: boolean; - _list: SerializedBuffer[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._listCount = 0; // 2 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {SerializedBuffer[]} */ - this._list = []; // this.itemsType bytes each - } - - /** - * @param {SerializedBuffer} item - */ - add(item: SerializedBuffer) { - this._list.push(item); - this._listCount++; - } - - override serialize() { - let neededSize; - if (this._list.length === 0) { - neededSize = 5; - } else { - neededSize = 5 + this._list.length * this._list[0].size(); - } - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16BE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeInt8(this._listCount, offset); - offset += 1; // offset is 3 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 4 - for (const item of this._list) { - item.serialize().copy(buffer, offset); - offset += item.size(); - } - // offset is now 4 + this._list.length * this._list[0].size() - return buffer; - } - - override size() { - return 5 + this._list.length * this._list[0].size(); - } - - override toString() { - return `ListMessage: msgNo=${this._msgNo} listCount=${this._listCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} list=${this._list}`; - } -} - -export class MessageHeader extends SerializedBuffer { - _size: number; - _messageId: number; - _messageLength: number; - constructor() { - super(); - this._size = 4; - this._messageId = 0; // 4 bytes - this._messageLength = 0; // 4 bytes - } - - get messageId() { - return this._messageId; - } - - get messageLength() { - return this._messageLength; - } - - serializeSizeOf() { - return this._size; - } - - override size() { - return this._size; - } - - get id() { - return this._messageId; - } - - get length() { - return this._messageLength; - } - - /** - * @param {Buffer} buffer - * @returns {MessageHeader} - */ - deserialize(buffer: Buffer): MessageHeader { - this._messageId = buffer.readInt16BE(0); - this._messageLength = buffer.readInt16BE(2); - return this; - } - - override serialize() { - const buffer = Buffer.alloc(4); - buffer.writeInt16BE(this._messageId, 0); - buffer.writeInt16BE(this._messageLength, 2); - return buffer; - } - - /** - * @param {Buffer} buffer - * @returns {MessageHeader} - */ - override _doDeserialize(buffer: Buffer): MessageHeader { - return this.deserialize(buffer); - } - - override _doSerialize() { - return this.serialize(); - } - - override toString() { - return `MessageHeader: ${JSON.stringify({ - messageId: this._messageId, - messageLength: this._messageLength, - })}`; - } -} - -export class MessageBuffer extends SerializedBuffer { - _header: MessageHeader; - _buffer: Buffer; - constructor() { - super(); - this._header = new MessageHeader(); - this._buffer = Buffer.alloc(4); - } - - /** - * @param {number} id - The ID of the message - * @param {Buffer} buffer - The buffer to deserialize - * @returns {MessageBuffer} - */ - static createGameMessage(id: number, buffer: Buffer): MessageBuffer { - const message = new MessageBuffer(); - message._header._messageId = id; - message.buffer = buffer; - return message; - } - - get messageId() { - return this._header.messageId; - } - - get messageLength() { - return this._header.messageLength; - } - - override get data() { - return this._buffer; - } - - override set data(buffer) { - this.buffer = buffer; - } - - /** - * @param {Buffer} buffer - */ - set buffer(buffer: Buffer) { - // const log = getServerLogger({ module: "MessageBuffer" }); - // log.level = getServerConfiguration({}).logLevel ?? "info"; - - this._buffer = Buffer.alloc(buffer.length); - this._buffer = buffer; - this._header._messageLength = 4 + buffer.length; - // log.debug(`Message length: ${this._header._messageLength}`); - // log.debug(`Buffer length: ${this._buffer.length}`); - // Pad the buffer to a multiple of 8 bytes - // let extraBytes = 0; - // const x = (this._buffer.length + 4) % 8; - // extraBytes = 8 - x; - // log.debug(`Extra bytes: ${extraBytes}`); - // if (extraBytes !== 0) { - // this._buffer = Buffer.concat([ - // this._buffer, - // Buffer.alloc(extraBytes), - // ]); - // log.debug(`Buffer length: ${this._buffer.length}`); - this._header._messageLength = this._buffer.length + 4; - // log.debug(`Message length: ${this._header._messageLength}`); - // } - } - - /** @param {Buffer} buffer */ - override setBuffer(buffer: Buffer) { - return (this.buffer = buffer); - } - - get buffer() { - return this._buffer; - } - - serializeSizeOf() { - return 4 + this._buffer.length; - } - - /** - * @param {Buffer} buffer - * @returns {MessageBuffer} - */ - deserialize(buffer: Buffer): MessageBuffer { - this._header.deserialize(buffer.subarray(0, 8)); - if (buffer.length < 4 + this._header.messageLength) { - throw new ServerError( - `Buffer length ${buffer.length} is too short to deserialize`, - ); - } - this.buffer = buffer.subarray(4); - return this; - } - - override serialize() { - const buffer = Buffer.alloc(4 + this._buffer.length); - if (this.buffer.length < 0) { - throw new ServerError( - `Buffer length ${this.buffer.length} is too short to serialize`, - ); - } - if (this.messageId <= 0) { - throw new ServerError( - `Message ID ${this.messageId} is invalid to serialize`, - ); - } - this._header.serialize().copy(buffer); - this._buffer.copy(buffer, 4); - return buffer; - } - - override toString() { - return `MessageBuffer: ${JSON.stringify({ - header: this._header.toString(), - bufferLength: this._buffer.length, - buffer: this._buffer.toString("hex"), - })}`; - } - - asJSON() { - return { - header: this._header, - buffer: this._buffer.toString("hex"), - }; - } -} - -/** - * A server message is a message that is passed between the server and the client. It has an 11 byte header. @see {@link serverHeader} - * - * @mixin {SerializableMixin} - */ -export class OldServerMessage extends SerializedBuffer { - _header: serverHeader; - _msgNo: number; - constructor() { - super(); - this._header = new serverHeader(); - this._msgNo = 0; // 2 bytes - } - - override size(): number { - return this._header.length + this.data.length; - } - - /** - * @param {Buffer} buffer - * @returns {OldServerMessage} - */ - override _doDeserialize(buffer: Buffer): OldServerMessage { - this._header._doDeserialize(buffer); - this.setBuffer(buffer.subarray(this._header._size)); - if (this.data.length > 2) { - this._msgNo = this.data.readInt16LE(0); - } - return this; - } - - override serialize() { - const buffer = Buffer.alloc(this._header.length + 2); - this._header._doSerialize().copy(buffer); - this.data.copy(buffer, this._header._size); - return buffer; - } - - /** - * @param {Buffer} buffer - */ - override setBuffer(buffer: Buffer) { - super.setBuffer(buffer); - this._header.length = buffer.length + this._header._size - 2; - } - - updateMsgNo() { - this._msgNo = this.data.readInt16LE(0); - } - - override toString() { - return `ServerMessage: ${JSON.stringify({ - header: this._header.toString(), - data: this.data.toString("hex"), - })}`; - } -} + class extends Base { + constructor() { + super(); + } + + serialize() { + return this._doSerialize(); + } + + /** + * @param {Buffer} buffer + * @returns {AbstractSerializable} + */ + deserialize(buffer: Buffer): AbstractSerializable { + return this._doDeserialize(buffer); + } + }; diff --git a/packages/shared/serializeString.ts b/packages/shared/serializeString.ts new file mode 100644 index 000000000..b0788a0fb --- /dev/null +++ b/packages/shared/serializeString.ts @@ -0,0 +1,21 @@ +/** + * Serializes a string with length prefix + * @param {string} string + * @param {Buffer} targetBuffer + * @param {number} offset + * @returns {number} + */ + +export function serializeString( + string: string, + targetBuffer: Buffer, + offset: number, +): number { + const buffer = Buffer.alloc(4 + string.length + 1); + buffer.writeInt32BE(string.length + 1, 0); + const stringToWrite = string + "\0"; + buffer.write(stringToWrite, 4, stringToWrite.length, "utf8"); + buffer.copy(targetBuffer, offset); + offset += buffer.length; + return offset; +} diff --git a/packages/shared/serializeStringRaw.ts b/packages/shared/serializeStringRaw.ts new file mode 100644 index 000000000..7558992a9 --- /dev/null +++ b/packages/shared/serializeStringRaw.ts @@ -0,0 +1,20 @@ +/** + * Serializes a raw string without length prefix + * @param {string} string + * @param {Buffer} targetBuffer + * @param {number} offset + * @param {number} length + * @returns {number} + */ + +export function serializeStringRaw( + string: string, + targetBuffer: Buffer, + offset: number, + length: number, +): number { + const stringToWrite = string; + targetBuffer.write(stringToWrite, offset, string.length, "utf8"); + offset += stringToWrite.length; + return offset; +} diff --git a/packages/shared/serverHeader.ts b/packages/shared/serverHeader.ts new file mode 100644 index 000000000..c3c92440c --- /dev/null +++ b/packages/shared/serverHeader.ts @@ -0,0 +1,74 @@ +import { ServerError } from "./errors/ServerError.js"; +import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; + +/** + * A server header is an 11 byte header with the following fields: + * - 2 bytes - length + * - 4 bytes - mcoSig + * - 4 bytes - sequence + * - 1 byte - flags + */ + +export class serverHeader extends SerializableMixin(AbstractSerializable) { + _size: number; + length: any; + mcoSig: string; + sequence: number; + flags: number; + constructor() { + super(); + this._size = 11; + this.length = this._size; // 2 bytes + this.mcoSig = "TOMC"; // 4 bytes + this.sequence = 0; // 4 bytes + this.flags = 0; // 1 byte + } + + size() { + return this._size; + } + + /** + * @param {Buffer} buffer + * @returns {serverHeader} + * @throws {Error} If the buffer is too short + * @throws {Error} If the buffer is malformed + */ + override _doDeserialize(buffer: Buffer): serverHeader { + if (buffer.length < this._size) { + throw new ServerError( + `Buffer length ${buffer.length} is too short to deserialize`, + ); + } + + try { + this.length = buffer.readInt16LE(0); + this.mcoSig = buffer.toString("utf8", 2, 6); + this.sequence = buffer.readInt32LE(6); + this.flags = buffer.readInt8(10); + } catch (error) { + throw new ServerError( + `Error deserializing buffer: ${String(error)}`, + ); + } + return this; + } + + override _doSerialize() { + const buffer = Buffer.alloc(this._size); + buffer.writeInt16LE(this.length, 0); + buffer.write(this.mcoSig, 2, 6, "utf8"); + buffer.writeInt32LE(this.sequence, 6); + buffer.writeInt8(this.flags, 10); + return buffer; + } + + override toString() { + return `ServerHeader: ${JSON.stringify({ + length: this.length, + mcoSig: this.mcoSig, + sequence: this.sequence, + flags: this.flags, + })}`; + } +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 000000000..4b0695a95 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + } +} diff --git a/packages/transactions/src/ArcadeCarMessage.ts b/packages/transactions/src/ArcadeCarMessage.ts index 7c9ee8f45..1d61c4163 100644 --- a/packages/transactions/src/ArcadeCarMessage.ts +++ b/packages/transactions/src/ArcadeCarMessage.ts @@ -14,86 +14,86 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ export class ArcadeCarMessage extends SerializedBuffer { - _msgNo: number; - _carCount: number; - _shouldExpectMoreMessages: boolean; - _carList: ArcadeCarInfo[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._carCount = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {ArcadeCarInfo[]} */ - this._carList = []; // 8 bytes each - } + _msgNo: number; + _carCount: number; + _shouldExpectMoreMessages: boolean; + _carList: ArcadeCarInfo[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._carCount = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {ArcadeCarInfo[]} */ + this._carList = []; // 8 bytes each + } - override size() { - return 5 + this._carList.length * 8; - } + override size() { + return 5 + this._carList.length * 8; + } - /** - * Add a lobby to the list - * @param {ArcadeCarInfo} lobby - */ - addCar(lobby: ArcadeCarInfo) { - this._carList.push(lobby); - this._carCount++; - } + /** + * Add a lobby to the list + * @param {ArcadeCarInfo} lobby + */ + addCar(lobby: ArcadeCarInfo) { + this._carList.push(lobby); + this._carCount++; + } - override serialize() { - const neededSize = 5 + this._carList.length * 8; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._carCount, offset); - offset += 2; // offset is 4 - buffer.writeInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const car of this._carList) { - car.serialize().copy(buffer, offset); - offset += car.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._carList.length * 8; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._carCount, offset); + offset += 2; // offset is 4 + buffer.writeInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const car of this._carList) { + car.serialize().copy(buffer, offset); + offset += car.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `ArcadeCarMessage: msgNo=${this._msgNo} careCount=${this._carCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} cars=${this._carList.length}`; - } + override toString() { + return `ArcadeCarMessage: msgNo=${this._msgNo} careCount=${this._carCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} cars=${this._carList.length}`; + } } export class ArcadeCarInfo extends SerializedBuffer { - _brandedPartId: number; - _lobbyId: number; - constructor() { - super(); - this._brandedPartId = 0; // 4 bytes - this._lobbyId = 0; // 4 bytes - } + _brandedPartId: number; + _lobbyId: number; + constructor() { + super(); + this._brandedPartId = 0; // 4 bytes + this._lobbyId = 0; // 4 bytes + } - override size() { - return 8; - } + override size() { + return 8; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._lobbyId, offset); - // offset is 8 - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._lobbyId, offset); + // offset is 8 + return buffer; + } - override toString() { - return `ArcadeCarInfo: brandedPartId=${this._brandedPartId} lobbyId=${this._lobbyId}`; - } + override toString() { + return `ArcadeCarInfo: brandedPartId=${this._brandedPartId} lobbyId=${this._lobbyId}`; + } } diff --git a/packages/transactions/src/EntryFeePurseMessage.ts b/packages/transactions/src/EntryFeePurseMessage.ts index 021f59c00..5da60cf94 100644 --- a/packages/transactions/src/EntryFeePurseMessage.ts +++ b/packages/transactions/src/EntryFeePurseMessage.ts @@ -15,109 +15,109 @@ // along with this program. If not, see . import { ServerError } from "../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; /** * A message listing the entry fees and purses for each entry fee * This is the body of a MessageNode */ export class EntryFeePurseMessage extends SerializedBuffer { - _msgNo: number; - _numberOfPurseEntries: number; - _shouldExpectMoreMessages: boolean; - _purseEntries: PurseEntry[]; - constructor() { - super(); - this._msgNo = 408; // 2 bytes - this._numberOfPurseEntries = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {PurseEntry[]} */ - this._purseEntries = []; // 8 bytes each - } + _msgNo: number; + _numberOfPurseEntries: number; + _shouldExpectMoreMessages: boolean; + _purseEntries: PurseEntry[]; + constructor() { + super(); + this._msgNo = 408; // 2 bytes + this._numberOfPurseEntries = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {PurseEntry[]} */ + this._purseEntries = []; // 8 bytes each + } - override size() { - return 5 + this._purseEntries.length * 8; - } + override size() { + return 5 + this._purseEntries.length * 8; + } - /** - * Add a lobby to the list - * @param {PurseEntry} lobby - */ - addEntry(purseEntry: PurseEntry) { - this._purseEntries.push(purseEntry); - this._numberOfPurseEntries++; - } + /** + * Add a lobby to the list + * @param {PurseEntry} lobby + */ + addEntry(purseEntry: PurseEntry) { + this._purseEntries.push(purseEntry); + this._numberOfPurseEntries++; + } - override serialize() { - const neededSize = 5 + this._purseEntries.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._numberOfPurseEntries, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const entry of this._purseEntries) { - entry.serialize().copy(buffer, offset); - offset += entry.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._purseEntries.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._numberOfPurseEntries, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const entry of this._purseEntries) { + entry.serialize().copy(buffer, offset); + offset += entry.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `EntryFeePurseMessage: msgNo=${this._msgNo} numberOfPurseEntries=${this._numberOfPurseEntries} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} purseEntries=${this._purseEntries}`; - } + override toString() { + return `EntryFeePurseMessage: msgNo=${this._msgNo} numberOfPurseEntries=${this._numberOfPurseEntries} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} purseEntries=${this._purseEntries}`; + } } export class PurseEntry extends SerializedBuffer { - _entryFee: number; // 4 bytes - _purse: number; // 4 bytes - constructor() { - super(); - this._entryFee = 0; - this._purse = 0; - } + _entryFee: number; // 4 bytes + _purse: number; // 4 bytes + constructor() { + super(); + this._entryFee = 0; + this._purse = 0; + } - override size() { - return 8; - } + override size() { + return 8; + } - /** - * Deserialize the data - * - * @param {Buffer} data - */ - deserialize(data: Buffer) { - if (data.length !== this.size()) { - throw new ServerError( - `PurseEntry.deserialize() expected ${this.size()} bytes but got ${ - data.length - } bytes`, - ); - } - let offset = 0; - this._entryFee = data.readUInt32LE(offset); - offset += 4; // offset is 4 - this._purse = data.readUInt32LE(offset); - // offset is 8 + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer) { + if (data.length !== this.size()) { + throw new ServerError( + `PurseEntry.deserialize() expected ${this.size()} bytes but got ${ + data.length + } bytes`, + ); + } + let offset = 0; + this._entryFee = data.readUInt32LE(offset); + offset += 4; // offset is 4 + this._purse = data.readUInt32LE(offset); + // offset is 8 - return this; - } + return this; + } - override serialize() { - const buf = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buf.writeUInt32LE(this._entryFee, offset); - offset += 4; // offset is 4 - buf.writeUInt32LE(this._purse, offset); - // offset is 8 + override serialize() { + const buf = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buf.writeUInt32LE(this._entryFee, offset); + offset += 4; // offset is 4 + buf.writeUInt32LE(this._purse, offset); + // offset is 8 - return buf; - } + return buf; + } - override toString() { - return `PurseEntry: entryFee=${this._entryFee} purse=${this._purse}`; - } + override toString() { + return `PurseEntry: entryFee=${this._entryFee} purse=${this._purse}`; + } } diff --git a/packages/transactions/src/GameUrlsMessage.ts b/packages/transactions/src/GameUrlsMessage.ts index 0a0670968..825ac3520 100644 --- a/packages/transactions/src/GameUrlsMessage.ts +++ b/packages/transactions/src/GameUrlsMessage.ts @@ -14,89 +14,87 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { - SerializedBuffer, - serializeString, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { serializeString } from "../../shared/serializeString.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ export class GameUrlsMessage extends SerializedBuffer { - _msgNo: number; - _urlCount: number; - _shouldExpectMoreMessages: boolean; - _urlList: GameUrl[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._urlCount = 0; // 2 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {GameUrl[]} */ - this._urlList = []; // 563 bytes each - } + _msgNo: number; + _urlCount: number; + _shouldExpectMoreMessages: boolean; + _urlList: GameUrl[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._urlCount = 0; // 2 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {GameUrl[]} */ + this._urlList = []; // 563 bytes each + } - override size() { - return 5 + this._urlList.length * 563; - } + override size() { + return 5 + this._urlList.length * 563; + } - /** - * Add a lobby to the list - * @param {GameUrl} lobby - */ - addURL(lobby: GameUrl) { - this._urlList.push(lobby); - this._urlCount++; - } + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addURL(lobby: GameUrl) { + this._urlList.push(lobby); + this._urlCount++; + } - override serialize() { - const neededSize = 4 + this._urlList.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._urlCount, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const url of this._urlList) { - url.serialize().copy(buffer, offset); - offset += url.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 4 + this._urlList.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._urlCount, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const url of this._urlList) { + url.serialize().copy(buffer, offset); + offset += url.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `GameUrlsMessage: msgNo=${this._msgNo} urlCount=${this._urlCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} urlList=${this._urlList}`; - } + override toString() { + return `GameUrlsMessage: msgNo=${this._msgNo} urlCount=${this._urlCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} urlList=${this._urlList}`; + } } export class GameUrl extends SerializedBuffer { - _urlId: number; - urlRef: string; - constructor() { - super(); - this._urlId = 0; // 4 bytes - this.urlRef = ""; // 4 + this.urlRef.length bytes - } + _urlId: number; + urlRef: string; + constructor() { + super(); + this._urlId = 0; // 4 bytes + this.urlRef = ""; // 4 + this.urlRef.length bytes + } - override size() { - return 8 + this.urlRef.length; - } + override size() { + return 8 + this.urlRef.length; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._urlId, offset); - offset += 4; // offset is 4 - serializeString(this.urlRef, buffer, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._urlId, offset); + offset += 4; // offset is 4 + serializeString(this.urlRef, buffer, offset); - return buffer; - } + return buffer; + } - override toString() { - return `GameUrl: urlId=${this._urlId} urlRef=${this.urlRef}`; - } + override toString() { + return `GameUrl: urlId=${this._urlId} urlRef=${this.urlRef}`; + } } diff --git a/packages/transactions/src/GenericReplyMessage.ts b/packages/transactions/src/GenericReplyMessage.ts index 6fea26672..da3b81f0f 100644 --- a/packages/transactions/src/GenericReplyMessage.ts +++ b/packages/transactions/src/GenericReplyMessage.ts @@ -14,163 +14,163 @@ * @property {Buffer} data2 */ -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; export class GenericReply extends SerializedBuffer { - msgNo: number; - msgReply: number; - result: Buffer; - data2: Buffer; - rawBuffer!: Buffer; - constructor() { - super(); - this.msgNo = 0; // 2 bytes (ethier MC_SUCCESS (0x101) or MC_FAILURE(0x102)) - this.msgReply = 0; // 2 bytes (message # being replied to (ex: MC_PURCHASE_STOCK_CAR)) - this.result = Buffer.alloc(4); // 4 bytes (specific to the message sent, often the reason for a failure) - this.setBuffer(Buffer.alloc(4)); // 4 bytes (specific to the message sent (but usually 0)) - this.data2 = Buffer.alloc(4); // 4 bytes (specific to the message sent (but usually 0)) - } + msgNo: number; + msgReply: number; + result: Buffer; + data2: Buffer; + rawBuffer!: Buffer; + constructor() { + super(); + this.msgNo = 0; // 2 bytes (ethier MC_SUCCESS (0x101) or MC_FAILURE(0x102)) + this.msgReply = 0; // 2 bytes (message # being replied to (ex: MC_PURCHASE_STOCK_CAR)) + this.result = Buffer.alloc(4); // 4 bytes (specific to the message sent, often the reason for a failure) + this.setBuffer(Buffer.alloc(4)); // 4 bytes (specific to the message sent (but usually 0)) + this.data2 = Buffer.alloc(4); // 4 bytes (specific to the message sent (but usually 0)) + } - override serialize() { - this.rawBuffer = Buffer.alloc(16); - this.rawBuffer.writeInt16LE(this.msgNo, 0); - this.rawBuffer.writeInt16LE(this.msgReply, 2); - this.result.copy(this.rawBuffer, 4); - this.data.copy(this.rawBuffer, 8); - this.data2.copy(this.rawBuffer, 12); - return this.rawBuffer; - } + override serialize() { + this.rawBuffer = Buffer.alloc(16); + this.rawBuffer.writeInt16LE(this.msgNo, 0); + this.rawBuffer.writeInt16LE(this.msgReply, 2); + this.result.copy(this.rawBuffer, 4); + this.data.copy(this.rawBuffer, 8); + this.data2.copy(this.rawBuffer, 12); + return this.rawBuffer; + } - asJSON() { - return { - msgNo: this.msgNo, - msgReply: this.msgReply, - result: this.result.toString("hex"), - data: this.data.toString("hex"), - data2: this.data2.toString("hex"), - }; - } + asJSON() { + return { + msgNo: this.msgNo, + msgReply: this.msgReply, + result: this.result.toString("hex"), + data: this.data.toString("hex"), + data2: this.data2.toString("hex"), + }; + } - override toString() { - return this.serialize().toString("hex"); - } + override toString() { + return this.serialize().toString("hex"); + } } export class GenericReplyMessage extends SerializedBuffer { - msgNo: number; - toFrom: number; - appId: number; - msgReply: number; - result: Buffer; - data2: Buffer; - rawBuffer: Buffer; - /** - * One of - * - * * MC_SUCCESS = 101 : Used with GenericReply structure to indicate that the request succeeded - * - * * MC_FAILED = 102 : Used with GenericReply structure to indicate that the request failed - * - * * MC_GENERIC_REPLY : Used with GenericReply structure for messages that return data - */ - constructor() { - super(); - this.msgNo = 0; // 2 bytes - this.toFrom = 0; // 2 bytes - this.appId = 0; // 2 bytes - this.msgReply = 0; // 2 bytes - this.result = Buffer.alloc(4); // 4 bytes - this.setBuffer(Buffer.alloc(4)); // 4 bytes - this.data2 = Buffer.alloc(4); // 4 bytes - this.rawBuffer = Buffer.alloc(0); - } + msgNo: number; + toFrom: number; + appId: number; + msgReply: number; + result: Buffer; + data2: Buffer; + rawBuffer: Buffer; + /** + * One of + * + * * MC_SUCCESS = 101 : Used with GenericReply structure to indicate that the request succeeded + * + * * MC_FAILED = 102 : Used with GenericReply structure to indicate that the request failed + * + * * MC_GENERIC_REPLY : Used with GenericReply structure for messages that return data + */ + constructor() { + super(); + this.msgNo = 0; // 2 bytes + this.toFrom = 0; // 2 bytes + this.appId = 0; // 2 bytes + this.msgReply = 0; // 2 bytes + this.result = Buffer.alloc(4); // 4 bytes + this.setBuffer(Buffer.alloc(4)); // 4 bytes + this.data2 = Buffer.alloc(4); // 4 bytes + this.rawBuffer = Buffer.alloc(0); + } - /** - * Setter data - * @param {Buffer} value - */ - setData(value: Buffer) { - this.setBuffer(value); - } + /** + * Setter data + * @param {Buffer} value + */ + setData(value: Buffer) { + this.setBuffer(value); + } - /** - * Setter data2 - * @param {Buffer} value - */ - setData2(value: Buffer) { - this.data2 = value; - } + /** + * Setter data2 + * @param {Buffer} value + */ + setData2(value: Buffer) { + this.data2 = value; + } - /** - * - * @param {Buffer} buffer - * @return {GenericReplyMessage} - */ - static deserialize(buffer: Buffer): GenericReplyMessage { - const node = new GenericReplyMessage(); - node.rawBuffer = buffer; - try { - node.msgNo = buffer.readInt16LE(0); - } catch (error) { - if (error instanceof RangeError) { - // This is likeley not an MCOTS packet, ignore - } else { - const err = new TypeError( - `[GenericReplyMsg] Unable to read msgNo from ${buffer.toString( - "hex", - )}: ${String(error)}`, - ); // skipcq: JS-0378 - throw err; - } - } + /** + * + * @param {Buffer} buffer + * @return {GenericReplyMessage} + */ + static deserialize(buffer: Buffer): GenericReplyMessage { + const node = new GenericReplyMessage(); + node.rawBuffer = buffer; + try { + node.msgNo = buffer.readInt16LE(0); + } catch (error) { + if (error instanceof RangeError) { + // This is likeley not an MCOTS packet, ignore + } else { + const err = new TypeError( + `[GenericReplyMsg] Unable to read msgNo from ${buffer.toString( + "hex", + )}: ${String(error)}`, + ); // skipcq: JS-0378 + throw err; + } + } - node.msgReply = buffer.readInt16LE(2); - node.result = buffer.subarray(4, 8); - node.setBuffer(buffer.subarray(8, 12)); - node.data2 = buffer.subarray(12); - return node; - } + node.msgReply = buffer.readInt16LE(2); + node.result = buffer.subarray(4, 8); + node.setBuffer(buffer.subarray(8, 12)); + node.data2 = buffer.subarray(12); + return node; + } - /** - * @override - * @return {Buffer} - */ - override serialize(): Buffer { - const packet = Buffer.alloc(114); // 16 bytes - let offset = 0; - packet.writeInt16LE(this.msgNo, offset); - offset += 2; - // packet.writeInt16LE(this.msgReply, offset); - // offset += 2; - this.result.copy(packet, offset); - offset += 4; - this.data.copy(packet, offset); - offset += 4; - this.data2.copy(packet, offset); - // offset is now 16 - return packet; - } + /** + * @override + * @return {Buffer} + */ + override serialize(): Buffer { + const packet = Buffer.alloc(114); // 16 bytes + let offset = 0; + packet.writeInt16LE(this.msgNo, offset); + offset += 2; + // packet.writeInt16LE(this.msgReply, offset); + // offset += 2; + this.result.copy(packet, offset); + offset += 4; + this.data.copy(packet, offset); + offset += 4; + this.data2.copy(packet, offset); + // offset is now 16 + return packet; + } - /** - * - * @param {Buffer} buffer - */ - setResult(buffer: Buffer) { - this.result = buffer; - } + /** + * + * @param {Buffer} buffer + */ + setResult(buffer: Buffer) { + this.result = buffer; + } - /** - * DumpPacket - * @return {string} - */ - dumpPacket(): string { - return `GenericReply', + /** + * DumpPacket + * @return {string} + */ + dumpPacket(): string { + return `GenericReply', ${JSON.stringify({ - msgNo: this.msgNo, - msgReply: this.msgReply, - result: this.result.toString("hex"), - data: this.data.toString("hex"), - tdata2: this.data2.toString("hex"), - })}`; - } + msgNo: this.msgNo, + msgReply: this.msgReply, + result: this.result.toString("hex"), + data: this.data.toString("hex"), + tdata2: this.data2.toString("hex"), + })}`; + } } diff --git a/packages/transactions/src/LobbyMessage.ts b/packages/transactions/src/LobbyMessage.ts index 61cb46687..a67360187 100644 --- a/packages/transactions/src/LobbyMessage.ts +++ b/packages/transactions/src/LobbyMessage.ts @@ -15,634 +15,634 @@ // along with this program. If not, see . import { ServerError } from "../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ export class LobbyMessage extends SerializedBuffer { - _msgNo: number; - _lobbyCount: number; - _shouldExpectMoreMessages: boolean; - _lobbyList: LobbyInfo[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._lobbyCount = 0; // 1 bytes - this._shouldExpectMoreMessages = false; // 1 byte - /** @type {LobbyInfo[]} */ - this._lobbyList = []; // 563 bytes each - } + _msgNo: number; + _lobbyCount: number; + _shouldExpectMoreMessages: boolean; + _lobbyList: LobbyInfo[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._lobbyCount = 0; // 1 bytes + this._shouldExpectMoreMessages = false; // 1 byte + /** @type {LobbyInfo[]} */ + this._lobbyList = []; // 563 bytes each + } - override size() { - return 5 + this._lobbyList.length * 563; - } + override size() { + return 5 + this._lobbyList.length * 563; + } - /** - * Add a lobby to the list - * @param {LobbyInfo} lobby - */ - addLobby(lobby: LobbyInfo) { - this._lobbyList.push(lobby); - this._lobbyCount++; - } + /** + * Add a lobby to the list + * @param {LobbyInfo} lobby + */ + addLobby(lobby: LobbyInfo) { + this._lobbyList.push(lobby); + this._lobbyCount++; + } - override serialize() { - const neededSize = 5 + this._lobbyList.length * 563; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt16LE(this._lobbyCount, offset); - offset += 2; // offset is 4 - buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); - offset += 1; // offset is 5 - for (const lobby of this._lobbyList) { - lobby.serialize().copy(buffer, offset); - offset += lobby.size(); - } - // offset is now 4 + this._lobbyList.length * 563 - return buffer; - } + override serialize() { + const neededSize = 5 + this._lobbyList.length * 563; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt16LE(this._lobbyCount, offset); + offset += 2; // offset is 4 + buffer.writeUInt8(this._shouldExpectMoreMessages ? 1 : 0, offset); + offset += 1; // offset is 5 + for (const lobby of this._lobbyList) { + lobby.serialize().copy(buffer, offset); + offset += lobby.size(); + } + // offset is now 4 + this._lobbyList.length * 563 + return buffer; + } - override toString() { - return `LobbyMessage: msgNo=${this._msgNo} lobbyCount=${this._lobbyCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} lobbies=${this._lobbyList.length}`; - } + override toString() { + return `LobbyMessage: msgNo=${this._msgNo} lobbyCount=${this._lobbyCount} shouldExpectMoreMessages=${this._shouldExpectMoreMessages} lobbies=${this._lobbyList.length}`; + } } export class LobbyInfo extends SerializedBuffer { - _lobbyId: number; - _raceTypeId: number; - _terfId: number; - _lobbyName: string; - _turfName: string; - _clientArt: string; - _elementId: number; - _turfLengthId: number; - _startSlice: number; - _endSlice: number; - _dragStageLeft: number; - _dragStageRight: number; - _dragStagingSlice: number; - _gridSpreadFactor: number; - _linear: number; - _minNumberPlayers: number; - _maxNumberPlayers: number; - _defaultNumberPlayers: number; - _numberOfPlayersEnabled: boolean; - _minLaps: number; - _maxLaps: number; - _defaultNumberOfLaps: number; - _numberOfLapsEnabled: boolean; - _minNumberRounds: number; - _maxNumberRounds: number; - _defaultNumberRounds: number; - _numberOfRoundsEnabled: boolean; - _defaultWeather: number; - _weatherEnabled: boolean; - _defaultNight: number; - _nightEnabled: boolean; - _defaultBackwards: boolean; - _backwardsEnabled: boolean; - _defaultTraffic: boolean; - _trafficEnabled: boolean; - _defaultDriverAI: boolean; - _driverAIEnabled: boolean; - _topDog: string; - _turfOwner: string; - _qualifyingTime: number; - _numberOfClubPlayers: number; - _numberofClubLaps: number; - _numberOfClubRounds: number; - _clubNight: number; - _clubWeather: number; - _clubBackwards: number; - _bestLapTime: number; - _lobbyDifficulty: number; - _timetrialPointsToQualify: number; - _timetrialCashToQualify: number; - _timetrialPointsBonusIncrements: number; - _timetrialCashBonusIncrements: number; - _timetrialTimeIncrements: number; - _timetrial1stPlaceVictoryPoints: number; - _timetrial1stPlaceVictoryCash: number; - _timetrial2ndPlaceVictoryPoints: number; - _timetrial2ndPlaceVictoryCash: number; - _timetrial3rdPlaceVictoryPoints: number; - _timetrial3rdPlaceVictoryCash: number; - _minLevel: number; - _minResetSlice: number; - _maxResetSlice: number; - _newbieFlag: number; - _driverHelmetFlag: number; - _clubMaxNumberPlayers: number; - _clubMinNumberPlayers: number; - _clubNumberPlayersDefault: number; - _minNumberOfClubs: number; - _maxNumberOfClubs: number; - _racePointsFactor: number; - _maxBodyClass: number; - _maxPowerClass: number; - _partsPrizeMax: number; - _partsPrizeWon: number; - _clubLogoId: number; - _teamTrialsWeatherFlag: boolean; - _teamTrialsNightFlag: boolean; - _teamTrialsBackwardsFlag: boolean; - _teamTrialsNumberLaps: number; - _teamTrialsBaseTimeUnderPar: number; - _raceCashFactor: number; - constructor() { - super(); - this._lobbyId = 0; // 4 bytes - this._raceTypeId = 0; // 4 bytes - this._terfId = 0; // 4 bytes - this._lobbyName = ""; // 32 bytes - this._turfName = ""; // 256 bytes - this._clientArt = ""; // 11 bytes - this._elementId = 0; // 4 bytes - this._turfLengthId = 0; // 4 bytes - this._startSlice = 0; // 4 bytes - this._endSlice = 0; // 4 bytes - this._dragStageLeft = 0; // 4 bytes - this._dragStageRight = 0; // 4 bytes - this._dragStagingSlice = 0; // 4 bytes - this._gridSpreadFactor = 0; // 4 bytes - this._linear = 0; // 2 bytes - this._minNumberPlayers = 0; // 2 bytes - this._maxNumberPlayers = 0; // 2 bytes - this._defaultNumberPlayers = 0; // 2 bytes - this._numberOfPlayersEnabled = false; // 2 bytes - this._minLaps = 0; // 2 bytes - this._maxLaps = 0; // 2 bytes - this._defaultNumberOfLaps = 0; // 2 bytes - this._numberOfLapsEnabled = false; // 2 bytes - this._minNumberRounds = 0; // 2 bytes - this._maxNumberRounds = 0; // 2 bytes - this._defaultNumberRounds = 0; // 2 bytes - this._numberOfRoundsEnabled = false; // 2 bytes - this._defaultWeather = 0; // 2 bytes - this._weatherEnabled = false; // 2 bytes - this._defaultNight = 0; // 2 bytes - this._nightEnabled = false; // 2 bytes - this._defaultBackwards = false; // 2 bytes - this._backwardsEnabled = false; // 2 bytes - this._defaultTraffic = false; // 2 bytes - this._trafficEnabled = false; // 2 bytes - this._defaultDriverAI = false; // 2 bytes - this._driverAIEnabled = false; // 2 bytes - this._topDog = ""; // 13 bytes - this._turfOwner = ""; // 33 bytes - this._qualifyingTime = 0; // 4 bytes - this._numberOfClubPlayers = 0; // 4 bytes - this._numberofClubLaps = 0; // 4 bytes - this._numberOfClubRounds = 0; // 4 bytes - this._clubNight = 0; // 2 bytes - this._clubWeather = 0; // 2 bytes - this._clubBackwards = 0; // 2 bytes - this._bestLapTime = 0; // 4 bytes - this._lobbyDifficulty = 0; // 4 bytes - this._timetrialPointsToQualify = 0; // 4 bytes - this._timetrialCashToQualify = 0; // 4 bytes - this._timetrialPointsBonusIncrements = 0; // 4 bytes - this._timetrialCashBonusIncrements = 0; // 4 bytes - this._timetrialTimeIncrements = 0; // 4 bytes - this._timetrial1stPlaceVictoryPoints = 0; // 4 bytes - this._timetrial1stPlaceVictoryCash = 0; // 4 bytes - this._timetrial2ndPlaceVictoryPoints = 0; // 4 bytes - this._timetrial2ndPlaceVictoryCash = 0; // 4 bytes - this._timetrial3rdPlaceVictoryPoints = 0; // 4 bytes - this._timetrial3rdPlaceVictoryCash = 0; // 4 bytes - this._minLevel = 0; // 2 bytes - this._minResetSlice = 0; // 4 bytes - this._maxResetSlice = 0; // 4 bytes - this._newbieFlag = 0; // 2 bytes - this._driverHelmetFlag = 0; // 2 bytes - this._clubMaxNumberPlayers = 0; // 2 bytes - this._clubMinNumberPlayers = 0; // 2 bytes - this._clubNumberPlayersDefault = 0; // 2 bytes - this._minNumberOfClubs = 0; // 2 bytes - this._maxNumberOfClubs = 0; // 2 bytes - this._racePointsFactor = 0; // 4 bytes - this._maxBodyClass = 0; // 2 bytes - this._maxPowerClass = 0; // 2 bytes - this._partsPrizeMax = 0; // 2 bytes - this._partsPrizeWon = 0; // 2 bytes - this._clubLogoId = 0; // 4 bytes - this._teamTrialsWeatherFlag = false; // 2 bytes - this._teamTrialsNightFlag = false; // 2 bytes - this._teamTrialsBackwardsFlag = false; // 2 bytes - this._teamTrialsNumberLaps = 0; // 2 bytes - this._teamTrialsBaseTimeUnderPar = 0; // 2 bytes - this._raceCashFactor = 0; // 4 bytes - } + _lobbyId: number; + _raceTypeId: number; + _terfId: number; + _lobbyName: string; + _turfName: string; + _clientArt: string; + _elementId: number; + _turfLengthId: number; + _startSlice: number; + _endSlice: number; + _dragStageLeft: number; + _dragStageRight: number; + _dragStagingSlice: number; + _gridSpreadFactor: number; + _linear: number; + _minNumberPlayers: number; + _maxNumberPlayers: number; + _defaultNumberPlayers: number; + _numberOfPlayersEnabled: boolean; + _minLaps: number; + _maxLaps: number; + _defaultNumberOfLaps: number; + _numberOfLapsEnabled: boolean; + _minNumberRounds: number; + _maxNumberRounds: number; + _defaultNumberRounds: number; + _numberOfRoundsEnabled: boolean; + _defaultWeather: number; + _weatherEnabled: boolean; + _defaultNight: number; + _nightEnabled: boolean; + _defaultBackwards: boolean; + _backwardsEnabled: boolean; + _defaultTraffic: boolean; + _trafficEnabled: boolean; + _defaultDriverAI: boolean; + _driverAIEnabled: boolean; + _topDog: string; + _turfOwner: string; + _qualifyingTime: number; + _numberOfClubPlayers: number; + _numberofClubLaps: number; + _numberOfClubRounds: number; + _clubNight: number; + _clubWeather: number; + _clubBackwards: number; + _bestLapTime: number; + _lobbyDifficulty: number; + _timetrialPointsToQualify: number; + _timetrialCashToQualify: number; + _timetrialPointsBonusIncrements: number; + _timetrialCashBonusIncrements: number; + _timetrialTimeIncrements: number; + _timetrial1stPlaceVictoryPoints: number; + _timetrial1stPlaceVictoryCash: number; + _timetrial2ndPlaceVictoryPoints: number; + _timetrial2ndPlaceVictoryCash: number; + _timetrial3rdPlaceVictoryPoints: number; + _timetrial3rdPlaceVictoryCash: number; + _minLevel: number; + _minResetSlice: number; + _maxResetSlice: number; + _newbieFlag: number; + _driverHelmetFlag: number; + _clubMaxNumberPlayers: number; + _clubMinNumberPlayers: number; + _clubNumberPlayersDefault: number; + _minNumberOfClubs: number; + _maxNumberOfClubs: number; + _racePointsFactor: number; + _maxBodyClass: number; + _maxPowerClass: number; + _partsPrizeMax: number; + _partsPrizeWon: number; + _clubLogoId: number; + _teamTrialsWeatherFlag: boolean; + _teamTrialsNightFlag: boolean; + _teamTrialsBackwardsFlag: boolean; + _teamTrialsNumberLaps: number; + _teamTrialsBaseTimeUnderPar: number; + _raceCashFactor: number; + constructor() { + super(); + this._lobbyId = 0; // 4 bytes + this._raceTypeId = 0; // 4 bytes + this._terfId = 0; // 4 bytes + this._lobbyName = ""; // 32 bytes + this._turfName = ""; // 256 bytes + this._clientArt = ""; // 11 bytes + this._elementId = 0; // 4 bytes + this._turfLengthId = 0; // 4 bytes + this._startSlice = 0; // 4 bytes + this._endSlice = 0; // 4 bytes + this._dragStageLeft = 0; // 4 bytes + this._dragStageRight = 0; // 4 bytes + this._dragStagingSlice = 0; // 4 bytes + this._gridSpreadFactor = 0; // 4 bytes + this._linear = 0; // 2 bytes + this._minNumberPlayers = 0; // 2 bytes + this._maxNumberPlayers = 0; // 2 bytes + this._defaultNumberPlayers = 0; // 2 bytes + this._numberOfPlayersEnabled = false; // 2 bytes + this._minLaps = 0; // 2 bytes + this._maxLaps = 0; // 2 bytes + this._defaultNumberOfLaps = 0; // 2 bytes + this._numberOfLapsEnabled = false; // 2 bytes + this._minNumberRounds = 0; // 2 bytes + this._maxNumberRounds = 0; // 2 bytes + this._defaultNumberRounds = 0; // 2 bytes + this._numberOfRoundsEnabled = false; // 2 bytes + this._defaultWeather = 0; // 2 bytes + this._weatherEnabled = false; // 2 bytes + this._defaultNight = 0; // 2 bytes + this._nightEnabled = false; // 2 bytes + this._defaultBackwards = false; // 2 bytes + this._backwardsEnabled = false; // 2 bytes + this._defaultTraffic = false; // 2 bytes + this._trafficEnabled = false; // 2 bytes + this._defaultDriverAI = false; // 2 bytes + this._driverAIEnabled = false; // 2 bytes + this._topDog = ""; // 13 bytes + this._turfOwner = ""; // 33 bytes + this._qualifyingTime = 0; // 4 bytes + this._numberOfClubPlayers = 0; // 4 bytes + this._numberofClubLaps = 0; // 4 bytes + this._numberOfClubRounds = 0; // 4 bytes + this._clubNight = 0; // 2 bytes + this._clubWeather = 0; // 2 bytes + this._clubBackwards = 0; // 2 bytes + this._bestLapTime = 0; // 4 bytes + this._lobbyDifficulty = 0; // 4 bytes + this._timetrialPointsToQualify = 0; // 4 bytes + this._timetrialCashToQualify = 0; // 4 bytes + this._timetrialPointsBonusIncrements = 0; // 4 bytes + this._timetrialCashBonusIncrements = 0; // 4 bytes + this._timetrialTimeIncrements = 0; // 4 bytes + this._timetrial1stPlaceVictoryPoints = 0; // 4 bytes + this._timetrial1stPlaceVictoryCash = 0; // 4 bytes + this._timetrial2ndPlaceVictoryPoints = 0; // 4 bytes + this._timetrial2ndPlaceVictoryCash = 0; // 4 bytes + this._timetrial3rdPlaceVictoryPoints = 0; // 4 bytes + this._timetrial3rdPlaceVictoryCash = 0; // 4 bytes + this._minLevel = 0; // 2 bytes + this._minResetSlice = 0; // 4 bytes + this._maxResetSlice = 0; // 4 bytes + this._newbieFlag = 0; // 2 bytes + this._driverHelmetFlag = 0; // 2 bytes + this._clubMaxNumberPlayers = 0; // 2 bytes + this._clubMinNumberPlayers = 0; // 2 bytes + this._clubNumberPlayersDefault = 0; // 2 bytes + this._minNumberOfClubs = 0; // 2 bytes + this._maxNumberOfClubs = 0; // 2 bytes + this._racePointsFactor = 0; // 4 bytes + this._maxBodyClass = 0; // 2 bytes + this._maxPowerClass = 0; // 2 bytes + this._partsPrizeMax = 0; // 2 bytes + this._partsPrizeWon = 0; // 2 bytes + this._clubLogoId = 0; // 4 bytes + this._teamTrialsWeatherFlag = false; // 2 bytes + this._teamTrialsNightFlag = false; // 2 bytes + this._teamTrialsBackwardsFlag = false; // 2 bytes + this._teamTrialsNumberLaps = 0; // 2 bytes + this._teamTrialsBaseTimeUnderPar = 0; // 2 bytes + this._raceCashFactor = 0; // 4 bytes + } - /** - * Deserialize a 2 byte boolean - * - * @param {Buffer} data - * @returns {boolean} - */ - deserializeBool(data: Buffer): boolean { - return data.readUInt16LE() === 1; - } + /** + * Deserialize a 2 byte boolean + * + * @param {Buffer} data + * @returns {boolean} + */ + deserializeBool(data: Buffer): boolean { + return data.readUInt16LE() === 1; + } - /** - * Serialize a 2 byte boolean - * - * @param {number} value - * @returns {Buffer} - */ - serializeBool(value: number): Buffer { - const buf = Buffer.alloc(2); - buf.writeUInt16LE(value ? 1 : 0); - return buf; - } + /** + * Serialize a 2 byte boolean + * + * @param {number} value + * @returns {Buffer} + */ + serializeBool(value: number): Buffer { + const buf = Buffer.alloc(2); + buf.writeUInt16LE(value ? 1 : 0); + return buf; + } - override size() { - return 563; - } + override size() { + return 563; + } - /** - * Deserialize the data - * - * @param {Buffer} data - */ - deserialize(data: Buffer) { - if (data.length !== this.size()) { - throw new ServerError( - `LobbyInfo.deserialize() expected ${this.size()} bytes but got ${ - data.length - } bytes`, - ); - } - let offset = 0; - this._lobbyId = data.readUInt32LE(offset); - offset += 4; - this._raceTypeId = data.readUInt32LE(offset); - offset += 4; - this._terfId = data.readUInt32LE(offset); - offset += 4; - this._lobbyName = data.toString("utf8", offset, offset + 32); - offset += 32; - this._turfName = data.toString("utf8", offset, offset + 256); - offset += 256; - this._clientArt = data.toString("utf8", offset, offset + 11); - offset += 11; - this._elementId = data.readUInt32LE(offset); - offset += 4; - this._turfLengthId = data.readUInt32LE(offset); - offset += 4; - this._startSlice = data.readUInt32LE(offset); - offset += 4; - this._endSlice = data.readUInt32LE(offset); - offset += 4; - this._dragStageLeft = data.readUInt32LE(offset); - offset += 4; - this._dragStageRight = data.readUInt32LE(offset); - offset += 4; - this._dragStagingSlice = data.readUInt32LE(offset); - offset += 4; - this._gridSpreadFactor = data.readUInt32LE(offset); - offset += 4; - this._linear = data.readUInt16LE(offset); - offset += 2; - this._minNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._maxNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._numberOfPlayersEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._minLaps = data.readUInt16LE(offset); - offset += 2; - this._maxLaps = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberOfLaps = data.readUInt16LE(offset); - offset += 2; - this._numberOfLapsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._minNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._maxNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._defaultNumberRounds = data.readUInt16LE(offset); - offset += 2; - this._numberOfRoundsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultWeather = data.readUInt16LE(offset); - offset += 2; - this._weatherEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultNight = data.readUInt16LE(offset); - offset += 2; - this._nightEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultBackwards = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._backwardsEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultTraffic = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._trafficEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._defaultDriverAI = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._driverAIEnabled = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._topDog = data.toString("utf8", offset, offset + 13); - offset += 13; - this._turfOwner = data.toString("utf8", offset, offset + 33); - offset += 33; - this._qualifyingTime = data.readUInt32LE(offset); - offset += 4; - this._numberOfClubPlayers = data.readUInt32LE(offset); - offset += 4; - this._numberofClubLaps = data.readUInt32LE(offset); - offset += 4; - this._numberOfClubRounds = data.readUInt32LE(offset); - offset += 4; - this._clubNight = data.readUInt16LE(offset); - offset += 2; - this._clubWeather = data.readUInt16LE(offset); - offset += 2; - this._clubBackwards = data.readUInt16LE(offset); - offset += 2; - this._bestLapTime = data.readUInt32LE(offset); - offset += 4; - this._lobbyDifficulty = data.readUInt32LE(offset); - offset += 4; - this._timetrialPointsToQualify = data.readUInt32LE(offset); - offset += 4; - this._timetrialCashToQualify = data.readUInt32LE(offset); - offset += 4; - this._timetrialPointsBonusIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrialCashBonusIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrialTimeIncrements = data.readUInt32LE(offset); - offset += 4; - this._timetrial1stPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial1stPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._timetrial2ndPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial2ndPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._timetrial3rdPlaceVictoryPoints = data.readUInt32LE(offset); - offset += 4; - this._timetrial3rdPlaceVictoryCash = data.readUInt32LE(offset); - offset += 4; - this._minLevel = data.readUInt16LE(offset); - offset += 2; - this._minResetSlice = data.readUInt32LE(offset); - offset += 4; - this._maxResetSlice = data.readUInt32LE(offset); - offset += 4; - this._newbieFlag = data.readUInt16LE(offset); - offset += 2; - this._driverHelmetFlag = data.readUInt16LE(offset); - offset += 2; - this._clubMaxNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._clubMinNumberPlayers = data.readUInt16LE(offset); - offset += 2; - this._clubNumberPlayersDefault = data.readUInt16LE(offset); - offset += 2; - this._minNumberOfClubs = data.readUInt16LE(offset); - offset += 2; - this._maxNumberOfClubs = data.readUInt16LE(offset); - offset += 2; - this._racePointsFactor = data.readUInt32LE(offset); - offset += 4; - this._maxBodyClass = data.readUInt16LE(offset); - offset += 2; - this._maxPowerClass = data.readUInt16LE(offset); - offset += 2; - this._partsPrizeMax = data.readUInt16LE(offset); - offset += 2; - this._partsPrizeWon = data.readUInt16LE(offset); - offset += 2; - this._clubLogoId = data.readUInt32LE(offset); - offset += 4; - this._teamTrialsWeatherFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsNightFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsBackwardsFlag = this.deserializeBool( - data.subarray(offset, offset + 2), - ); - offset += 2; - this._teamTrialsNumberLaps = data.readUInt16LE(offset); - offset += 2; - this._teamTrialsBaseTimeUnderPar = data.readUInt16LE(offset); - offset += 2; - this._raceCashFactor = data.readUInt32LE(offset); - // 563 total bytes + /** + * Deserialize the data + * + * @param {Buffer} data + */ + deserialize(data: Buffer) { + if (data.length !== this.size()) { + throw new ServerError( + `LobbyInfo.deserialize() expected ${this.size()} bytes but got ${ + data.length + } bytes`, + ); + } + let offset = 0; + this._lobbyId = data.readUInt32LE(offset); + offset += 4; + this._raceTypeId = data.readUInt32LE(offset); + offset += 4; + this._terfId = data.readUInt32LE(offset); + offset += 4; + this._lobbyName = data.toString("utf8", offset, offset + 32); + offset += 32; + this._turfName = data.toString("utf8", offset, offset + 256); + offset += 256; + this._clientArt = data.toString("utf8", offset, offset + 11); + offset += 11; + this._elementId = data.readUInt32LE(offset); + offset += 4; + this._turfLengthId = data.readUInt32LE(offset); + offset += 4; + this._startSlice = data.readUInt32LE(offset); + offset += 4; + this._endSlice = data.readUInt32LE(offset); + offset += 4; + this._dragStageLeft = data.readUInt32LE(offset); + offset += 4; + this._dragStageRight = data.readUInt32LE(offset); + offset += 4; + this._dragStagingSlice = data.readUInt32LE(offset); + offset += 4; + this._gridSpreadFactor = data.readUInt32LE(offset); + offset += 4; + this._linear = data.readUInt16LE(offset); + offset += 2; + this._minNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._maxNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._numberOfPlayersEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._minLaps = data.readUInt16LE(offset); + offset += 2; + this._maxLaps = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberOfLaps = data.readUInt16LE(offset); + offset += 2; + this._numberOfLapsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._minNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._maxNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._defaultNumberRounds = data.readUInt16LE(offset); + offset += 2; + this._numberOfRoundsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultWeather = data.readUInt16LE(offset); + offset += 2; + this._weatherEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultNight = data.readUInt16LE(offset); + offset += 2; + this._nightEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultBackwards = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._backwardsEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultTraffic = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._trafficEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._defaultDriverAI = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._driverAIEnabled = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._topDog = data.toString("utf8", offset, offset + 13); + offset += 13; + this._turfOwner = data.toString("utf8", offset, offset + 33); + offset += 33; + this._qualifyingTime = data.readUInt32LE(offset); + offset += 4; + this._numberOfClubPlayers = data.readUInt32LE(offset); + offset += 4; + this._numberofClubLaps = data.readUInt32LE(offset); + offset += 4; + this._numberOfClubRounds = data.readUInt32LE(offset); + offset += 4; + this._clubNight = data.readUInt16LE(offset); + offset += 2; + this._clubWeather = data.readUInt16LE(offset); + offset += 2; + this._clubBackwards = data.readUInt16LE(offset); + offset += 2; + this._bestLapTime = data.readUInt32LE(offset); + offset += 4; + this._lobbyDifficulty = data.readUInt32LE(offset); + offset += 4; + this._timetrialPointsToQualify = data.readUInt32LE(offset); + offset += 4; + this._timetrialCashToQualify = data.readUInt32LE(offset); + offset += 4; + this._timetrialPointsBonusIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrialCashBonusIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrialTimeIncrements = data.readUInt32LE(offset); + offset += 4; + this._timetrial1stPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial1stPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._timetrial2ndPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial2ndPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._timetrial3rdPlaceVictoryPoints = data.readUInt32LE(offset); + offset += 4; + this._timetrial3rdPlaceVictoryCash = data.readUInt32LE(offset); + offset += 4; + this._minLevel = data.readUInt16LE(offset); + offset += 2; + this._minResetSlice = data.readUInt32LE(offset); + offset += 4; + this._maxResetSlice = data.readUInt32LE(offset); + offset += 4; + this._newbieFlag = data.readUInt16LE(offset); + offset += 2; + this._driverHelmetFlag = data.readUInt16LE(offset); + offset += 2; + this._clubMaxNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._clubMinNumberPlayers = data.readUInt16LE(offset); + offset += 2; + this._clubNumberPlayersDefault = data.readUInt16LE(offset); + offset += 2; + this._minNumberOfClubs = data.readUInt16LE(offset); + offset += 2; + this._maxNumberOfClubs = data.readUInt16LE(offset); + offset += 2; + this._racePointsFactor = data.readUInt32LE(offset); + offset += 4; + this._maxBodyClass = data.readUInt16LE(offset); + offset += 2; + this._maxPowerClass = data.readUInt16LE(offset); + offset += 2; + this._partsPrizeMax = data.readUInt16LE(offset); + offset += 2; + this._partsPrizeWon = data.readUInt16LE(offset); + offset += 2; + this._clubLogoId = data.readUInt32LE(offset); + offset += 4; + this._teamTrialsWeatherFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsNightFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsBackwardsFlag = this.deserializeBool( + data.subarray(offset, offset + 2), + ); + offset += 2; + this._teamTrialsNumberLaps = data.readUInt16LE(offset); + offset += 2; + this._teamTrialsBaseTimeUnderPar = data.readUInt16LE(offset); + offset += 2; + this._raceCashFactor = data.readUInt32LE(offset); + // 563 total bytes - return this; - } + return this; + } - override serialize() { - const buf = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buf.writeUInt32LE(this._lobbyId, offset); - offset += 4; // offset is 4 - buf.writeUInt32LE(this._raceTypeId, offset); - offset += 4; // offset is 8 - buf.writeUInt32LE(this._terfId, offset); - offset += 4; // offset is 12 - buf.write(this._lobbyName, offset, 32); - offset += 32; // offset is 44 - buf.write(this._turfName, offset, 256); - offset += 256; // offset is 300 - buf.write(this._clientArt, offset, 11); - offset += 11; // offset is 311 - buf.writeUInt32LE(this._elementId, offset); - offset += 4; // offset is 315 - buf.writeUInt32LE(this._turfLengthId, offset); - offset += 4; // offset is 319 - buf.writeUInt32LE(this._startSlice, offset); - offset += 4; // offset is 323 - buf.writeUInt32LE(this._endSlice, offset); - offset += 4; // offset is 327 - buf.writeUInt32LE(this._dragStageLeft, offset); - offset += 4; // offset is 331 - buf.writeUInt32LE(this._dragStageRight, offset); - offset += 4; // offset is 335 - buf.writeUInt32LE(this._dragStagingSlice, offset); - offset += 4; // offset is 339 - buf.writeUInt32LE(this._gridSpreadFactor, offset); - offset += 4; // offset is 343 - buf.writeUInt16LE(this._linear, offset); - offset += 2; // offset is 345 - buf.writeUInt16LE(this._minNumberPlayers, offset); - offset += 2; // offset is 347 - buf.writeUInt16LE(this._maxNumberPlayers, offset); - offset += 2; // offset is 349 - buf.writeUInt16LE(this._defaultNumberPlayers, offset); - offset += 2; // offset is 351 - buf.writeUInt16LE(this._numberOfPlayersEnabled ? 1 : 0, offset); - offset += 2; // offset is 353 - buf.writeUInt16LE(this._minLaps, offset); - offset += 2; // offset is 355 - buf.writeUInt16LE(this._maxLaps, offset); - offset += 2; // offset is 357 - buf.writeUInt16LE(this._defaultNumberOfLaps, offset); - offset += 2; // offset is 359 - buf.writeUInt16LE(this._numberOfLapsEnabled ? 1 : 0, offset); - offset += 2; // offset is 361 - buf.writeUInt16LE(this._minNumberRounds, offset); - offset += 2; // offset is 363 - buf.writeUInt16LE(this._maxNumberRounds, offset); - offset += 2; // offset is 365 - buf.writeUInt16LE(this._defaultNumberRounds, offset); - offset += 2; // offset is 367 - buf.writeUInt16LE(this._numberOfRoundsEnabled ? 1 : 0, offset); - offset += 2; // offset is 369 - buf.writeUInt16LE(this._defaultWeather, offset); - offset += 2; // offset is 371 - buf.writeUInt16LE(this._weatherEnabled ? 1 : 0, offset); - offset += 2; // offset is 373 - buf.writeUInt16LE(this._defaultNight, offset); - offset += 2; // offset is 375 - buf.writeUInt16LE(this._nightEnabled ? 1 : 0, offset); - offset += 2; // offset is 377 - buf.writeUInt16LE(this._defaultBackwards ? 1 : 0, offset); - offset += 2; // offset is 379 - buf.writeUInt16LE(this._backwardsEnabled ? 1 : 0, offset); - offset += 2; // offset is 381 - buf.writeUInt16LE(this._defaultTraffic ? 1 : 0, offset); - offset += 2; // offset is 383 - buf.writeUInt16LE(this._trafficEnabled ? 1 : 0, offset); - offset += 2; // offset is 385 - buf.writeUInt16LE(this._defaultDriverAI ? 1 : 0, offset); - offset += 2; // offset is 387 - buf.writeUInt16LE(this._driverAIEnabled ? 1 : 0, offset); - offset += 2; // offset is 389 - buf.write(this._topDog, offset, 13); - offset += 13; // offset is 402 - buf.write(this._turfOwner, offset, 33); - offset += 33; // offset is 435 - buf.writeUInt32LE(this._qualifyingTime, offset); - offset += 4; // offset is 439 - buf.writeUInt32LE(this._numberOfClubPlayers, offset); - offset += 4; // offset is 443 - buf.writeUInt32LE(this._numberofClubLaps, offset); - offset += 4; // offset is 447 - buf.writeUInt32LE(this._numberOfClubRounds, offset); - offset += 4; // offset is 451 - buf.writeUInt16LE(this._clubNight, offset); - offset += 2; // offset is 453 - buf.writeUInt16LE(this._clubWeather, offset); - offset += 2; // offset is 455 - buf.writeUInt16LE(this._clubBackwards, offset); - offset += 2; // offset is 457 - buf.writeUInt32LE(this._bestLapTime, offset); - offset += 4; // offset is 461 - buf.writeUInt32LE(this._lobbyDifficulty, offset); - offset += 4; // offset is 465 - buf.writeUInt32LE(this._timetrialPointsToQualify, offset); - offset += 4; // offset is 469 - buf.writeUInt32LE(this._timetrialCashToQualify, offset); - offset += 4; // offset is 473 - buf.writeUInt32LE(this._timetrialPointsBonusIncrements, offset); - offset += 4; // offset is 477 - buf.writeUInt32LE(this._timetrialCashBonusIncrements, offset); - offset += 4; // offset is 481 - buf.writeUInt32LE(this._timetrialTimeIncrements, offset); - offset += 4; // offset is 485 - buf.writeUInt32LE(this._timetrial1stPlaceVictoryPoints, offset); - offset += 4; // offset is 489 - buf.writeUInt32LE(this._timetrial1stPlaceVictoryCash, offset); - offset += 4; // offset is 493 - buf.writeUInt32LE(this._timetrial2ndPlaceVictoryPoints, offset); - offset += 4; // offset is 497 - buf.writeUInt32LE(this._timetrial2ndPlaceVictoryCash, offset); - offset += 4; // offset is 501 - buf.writeUInt32LE(this._timetrial3rdPlaceVictoryPoints, offset); - offset += 4; // offset is 505 - buf.writeUInt32LE(this._timetrial3rdPlaceVictoryCash, offset); - offset += 4; // offset is 509 - buf.writeUInt16LE(this._minLevel, offset); - offset += 2; // offset is 511 - buf.writeUInt32LE(this._minResetSlice, offset); - offset += 4; // offset is 515 - buf.writeUInt32LE(this._maxResetSlice, offset); - offset += 4; // offset is 519 - buf.writeUInt16LE(this._newbieFlag, offset); - offset += 2; // offset is 521 - buf.writeUInt16LE(this._driverHelmetFlag, offset); - offset += 2; // offset is 523 - buf.writeUInt16LE(this._clubMaxNumberPlayers, offset); - offset += 2; // offset is 525 - buf.writeUInt16LE(this._clubMinNumberPlayers, offset); - offset += 2; // offset is 527 - buf.writeUInt16LE(this._clubNumberPlayersDefault, offset); - offset += 2; // offset is 529 - buf.writeUInt16LE(this._minNumberOfClubs, offset); - offset += 2; // offset is 531 - buf.writeUInt16LE(this._maxNumberOfClubs, offset); - offset += 2; // offset is 533 - buf.writeUInt32LE(this._racePointsFactor, offset); - offset += 4; // offset is 537 - buf.writeUInt16LE(this._maxBodyClass, offset); - offset += 2; // offset is 539 - buf.writeUInt16LE(this._maxPowerClass, offset); - offset += 2; // offset is 541 - buf.writeUInt16LE(this._partsPrizeMax, offset); - offset += 2; // offset is 543 - buf.writeUInt16LE(this._partsPrizeWon, offset); - offset += 2; // offset is 545 - buf.writeUInt32LE(this._clubLogoId, offset); - offset += 4; // offset is 549 - buf.writeUInt16LE(this._teamTrialsWeatherFlag ? 1 : 0, offset); - offset += 2; // offset is 551 - buf.writeUInt16LE(this._teamTrialsNightFlag ? 1 : 0, offset); - offset += 2; // offset is 553 - buf.writeUInt16LE(this._teamTrialsBackwardsFlag ? 1 : 0, offset); - offset += 2; // offset is 555 - buf.writeUInt16LE(this._teamTrialsNumberLaps, offset); - offset += 2; // offset is 557 - buf.writeUInt16LE(this._teamTrialsBaseTimeUnderPar, offset); - offset += 2; // offset is 559 - buf.writeUInt32LE(this._raceCashFactor, offset); - // offset is 563 + override serialize() { + const buf = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buf.writeUInt32LE(this._lobbyId, offset); + offset += 4; // offset is 4 + buf.writeUInt32LE(this._raceTypeId, offset); + offset += 4; // offset is 8 + buf.writeUInt32LE(this._terfId, offset); + offset += 4; // offset is 12 + buf.write(this._lobbyName, offset, 32); + offset += 32; // offset is 44 + buf.write(this._turfName, offset, 256); + offset += 256; // offset is 300 + buf.write(this._clientArt, offset, 11); + offset += 11; // offset is 311 + buf.writeUInt32LE(this._elementId, offset); + offset += 4; // offset is 315 + buf.writeUInt32LE(this._turfLengthId, offset); + offset += 4; // offset is 319 + buf.writeUInt32LE(this._startSlice, offset); + offset += 4; // offset is 323 + buf.writeUInt32LE(this._endSlice, offset); + offset += 4; // offset is 327 + buf.writeUInt32LE(this._dragStageLeft, offset); + offset += 4; // offset is 331 + buf.writeUInt32LE(this._dragStageRight, offset); + offset += 4; // offset is 335 + buf.writeUInt32LE(this._dragStagingSlice, offset); + offset += 4; // offset is 339 + buf.writeUInt32LE(this._gridSpreadFactor, offset); + offset += 4; // offset is 343 + buf.writeUInt16LE(this._linear, offset); + offset += 2; // offset is 345 + buf.writeUInt16LE(this._minNumberPlayers, offset); + offset += 2; // offset is 347 + buf.writeUInt16LE(this._maxNumberPlayers, offset); + offset += 2; // offset is 349 + buf.writeUInt16LE(this._defaultNumberPlayers, offset); + offset += 2; // offset is 351 + buf.writeUInt16LE(this._numberOfPlayersEnabled ? 1 : 0, offset); + offset += 2; // offset is 353 + buf.writeUInt16LE(this._minLaps, offset); + offset += 2; // offset is 355 + buf.writeUInt16LE(this._maxLaps, offset); + offset += 2; // offset is 357 + buf.writeUInt16LE(this._defaultNumberOfLaps, offset); + offset += 2; // offset is 359 + buf.writeUInt16LE(this._numberOfLapsEnabled ? 1 : 0, offset); + offset += 2; // offset is 361 + buf.writeUInt16LE(this._minNumberRounds, offset); + offset += 2; // offset is 363 + buf.writeUInt16LE(this._maxNumberRounds, offset); + offset += 2; // offset is 365 + buf.writeUInt16LE(this._defaultNumberRounds, offset); + offset += 2; // offset is 367 + buf.writeUInt16LE(this._numberOfRoundsEnabled ? 1 : 0, offset); + offset += 2; // offset is 369 + buf.writeUInt16LE(this._defaultWeather, offset); + offset += 2; // offset is 371 + buf.writeUInt16LE(this._weatherEnabled ? 1 : 0, offset); + offset += 2; // offset is 373 + buf.writeUInt16LE(this._defaultNight, offset); + offset += 2; // offset is 375 + buf.writeUInt16LE(this._nightEnabled ? 1 : 0, offset); + offset += 2; // offset is 377 + buf.writeUInt16LE(this._defaultBackwards ? 1 : 0, offset); + offset += 2; // offset is 379 + buf.writeUInt16LE(this._backwardsEnabled ? 1 : 0, offset); + offset += 2; // offset is 381 + buf.writeUInt16LE(this._defaultTraffic ? 1 : 0, offset); + offset += 2; // offset is 383 + buf.writeUInt16LE(this._trafficEnabled ? 1 : 0, offset); + offset += 2; // offset is 385 + buf.writeUInt16LE(this._defaultDriverAI ? 1 : 0, offset); + offset += 2; // offset is 387 + buf.writeUInt16LE(this._driverAIEnabled ? 1 : 0, offset); + offset += 2; // offset is 389 + buf.write(this._topDog, offset, 13); + offset += 13; // offset is 402 + buf.write(this._turfOwner, offset, 33); + offset += 33; // offset is 435 + buf.writeUInt32LE(this._qualifyingTime, offset); + offset += 4; // offset is 439 + buf.writeUInt32LE(this._numberOfClubPlayers, offset); + offset += 4; // offset is 443 + buf.writeUInt32LE(this._numberofClubLaps, offset); + offset += 4; // offset is 447 + buf.writeUInt32LE(this._numberOfClubRounds, offset); + offset += 4; // offset is 451 + buf.writeUInt16LE(this._clubNight, offset); + offset += 2; // offset is 453 + buf.writeUInt16LE(this._clubWeather, offset); + offset += 2; // offset is 455 + buf.writeUInt16LE(this._clubBackwards, offset); + offset += 2; // offset is 457 + buf.writeUInt32LE(this._bestLapTime, offset); + offset += 4; // offset is 461 + buf.writeUInt32LE(this._lobbyDifficulty, offset); + offset += 4; // offset is 465 + buf.writeUInt32LE(this._timetrialPointsToQualify, offset); + offset += 4; // offset is 469 + buf.writeUInt32LE(this._timetrialCashToQualify, offset); + offset += 4; // offset is 473 + buf.writeUInt32LE(this._timetrialPointsBonusIncrements, offset); + offset += 4; // offset is 477 + buf.writeUInt32LE(this._timetrialCashBonusIncrements, offset); + offset += 4; // offset is 481 + buf.writeUInt32LE(this._timetrialTimeIncrements, offset); + offset += 4; // offset is 485 + buf.writeUInt32LE(this._timetrial1stPlaceVictoryPoints, offset); + offset += 4; // offset is 489 + buf.writeUInt32LE(this._timetrial1stPlaceVictoryCash, offset); + offset += 4; // offset is 493 + buf.writeUInt32LE(this._timetrial2ndPlaceVictoryPoints, offset); + offset += 4; // offset is 497 + buf.writeUInt32LE(this._timetrial2ndPlaceVictoryCash, offset); + offset += 4; // offset is 501 + buf.writeUInt32LE(this._timetrial3rdPlaceVictoryPoints, offset); + offset += 4; // offset is 505 + buf.writeUInt32LE(this._timetrial3rdPlaceVictoryCash, offset); + offset += 4; // offset is 509 + buf.writeUInt16LE(this._minLevel, offset); + offset += 2; // offset is 511 + buf.writeUInt32LE(this._minResetSlice, offset); + offset += 4; // offset is 515 + buf.writeUInt32LE(this._maxResetSlice, offset); + offset += 4; // offset is 519 + buf.writeUInt16LE(this._newbieFlag, offset); + offset += 2; // offset is 521 + buf.writeUInt16LE(this._driverHelmetFlag, offset); + offset += 2; // offset is 523 + buf.writeUInt16LE(this._clubMaxNumberPlayers, offset); + offset += 2; // offset is 525 + buf.writeUInt16LE(this._clubMinNumberPlayers, offset); + offset += 2; // offset is 527 + buf.writeUInt16LE(this._clubNumberPlayersDefault, offset); + offset += 2; // offset is 529 + buf.writeUInt16LE(this._minNumberOfClubs, offset); + offset += 2; // offset is 531 + buf.writeUInt16LE(this._maxNumberOfClubs, offset); + offset += 2; // offset is 533 + buf.writeUInt32LE(this._racePointsFactor, offset); + offset += 4; // offset is 537 + buf.writeUInt16LE(this._maxBodyClass, offset); + offset += 2; // offset is 539 + buf.writeUInt16LE(this._maxPowerClass, offset); + offset += 2; // offset is 541 + buf.writeUInt16LE(this._partsPrizeMax, offset); + offset += 2; // offset is 543 + buf.writeUInt16LE(this._partsPrizeWon, offset); + offset += 2; // offset is 545 + buf.writeUInt32LE(this._clubLogoId, offset); + offset += 4; // offset is 549 + buf.writeUInt16LE(this._teamTrialsWeatherFlag ? 1 : 0, offset); + offset += 2; // offset is 551 + buf.writeUInt16LE(this._teamTrialsNightFlag ? 1 : 0, offset); + offset += 2; // offset is 553 + buf.writeUInt16LE(this._teamTrialsBackwardsFlag ? 1 : 0, offset); + offset += 2; // offset is 555 + buf.writeUInt16LE(this._teamTrialsNumberLaps, offset); + offset += 2; // offset is 557 + buf.writeUInt16LE(this._teamTrialsBaseTimeUnderPar, offset); + offset += 2; // offset is 559 + buf.writeUInt32LE(this._raceCashFactor, offset); + // offset is 563 - return buf; - } + return buf; + } - override toString() { - return `LobbyInfo { + override toString() { + return `LobbyInfo { lobbyId: ${this._lobbyId}, raceTypeId: ${this._raceTypeId}, terfId: ${this._terfId}, @@ -725,5 +725,5 @@ export class LobbyInfo extends SerializedBuffer { teamTrialsBaseTimeUnderPar: ${this._teamTrialsBaseTimeUnderPar}, raceCashFactor: ${this._raceCashFactor}, }`; - } + } } diff --git a/packages/transactions/src/OwnedVehiclesMessage.ts b/packages/transactions/src/OwnedVehiclesMessage.ts index a33d323cd..4fb37eccf 100644 --- a/packages/transactions/src/OwnedVehiclesMessage.ts +++ b/packages/transactions/src/OwnedVehiclesMessage.ts @@ -14,83 +14,83 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; /** * A message listing the player's owned vehicles * This is the body of a MessageNode */ export class OwnedVehiclesMessage extends SerializedBuffer { - _msgNo: number; - _numberOfVehicles: number; - _vehicleList: OwnedVehicle[]; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._numberOfVehicles = 0; // 1 bytes - /** @type {OwnedVehicle[]} */ - this._vehicleList = []; // 8 bytes each - } + _msgNo: number; + _numberOfVehicles: number; + _vehicleList: OwnedVehicle[]; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._numberOfVehicles = 0; // 1 bytes + /** @type {OwnedVehicle[]} */ + this._vehicleList = []; // 8 bytes each + } - override size() { - return 5 + this._vehicleList.length * 8; - } + override size() { + return 5 + this._vehicleList.length * 8; + } - /** - * Add a lobby to the list - * @param {GameUrl} lobby - */ - addVehicle(vehicle: OwnedVehicle) { - this._vehicleList.push(vehicle); - this._numberOfVehicles++; - } + /** + * Add a lobby to the list + * @param {GameUrl} lobby + */ + addVehicle(vehicle: OwnedVehicle) { + this._vehicleList.push(vehicle); + this._numberOfVehicles++; + } - override serialize() { - const neededSize = 4 + this._vehicleList.length * 8; - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeInt8(this._numberOfVehicles, offset); - offset += 1; // offset is 3 - for (const vehicle of this._vehicleList) { - const vehicleBuffer = vehicle.serialize(); - vehicleBuffer.copy(buffer, offset); - offset += vehicleBuffer.length; - } + override serialize() { + const neededSize = 4 + this._vehicleList.length * 8; + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeInt8(this._numberOfVehicles, offset); + offset += 1; // offset is 3 + for (const vehicle of this._vehicleList) { + const vehicleBuffer = vehicle.serialize(); + vehicleBuffer.copy(buffer, offset); + offset += vehicleBuffer.length; + } - return buffer; - } + return buffer; + } - override toString() { - return `OwnedVehiclesMessage: msgNo=${this._msgNo} numberOfVehicles=${this._numberOfVehicles}`; - } + override toString() { + return `OwnedVehiclesMessage: msgNo=${this._msgNo} numberOfVehicles=${this._numberOfVehicles}`; + } } export class OwnedVehicle extends SerializedBuffer { - _vehicleId: number; - _brandedPartId: number; - constructor() { - super(); - this._vehicleId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - } + _vehicleId: number; + _brandedPartId: number; + constructor() { + super(); + this._vehicleId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + } - override size() { - return 8; - } + override size() { + return 8; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt32LE(this._vehicleId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._brandedPartId, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt32LE(this._vehicleId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._brandedPartId, offset); - return buffer; - } + return buffer; + } - override toString() { - return `OwnedVehicle: vehicleId=${this._vehicleId} brandedPartId=${this._brandedPartId}`; - } + override toString() { + return `OwnedVehicle: vehicleId=${this._vehicleId} brandedPartId=${this._brandedPartId}`; + } } diff --git a/packages/transactions/src/PartsAssemblyMessage.ts b/packages/transactions/src/PartsAssemblyMessage.ts index 0628012ea..9454158d7 100644 --- a/packages/transactions/src/PartsAssemblyMessage.ts +++ b/packages/transactions/src/PartsAssemblyMessage.ts @@ -1,101 +1,101 @@ -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; export class PartsAssemblyMessage extends SerializedBuffer { - _msgNo: number; - _ownerId: number; - _numberOfParts: number; - _partList: Part[]; - constructor(owerId: number) { - super(); - this._msgNo = 0; // 2 bytes - this._ownerId = owerId; // 4 bytes - this._numberOfParts = 0; // 1 bytes - /** @type {Part[]} */ - this._partList = []; // 34 bytes each - } + _msgNo: number; + _ownerId: number; + _numberOfParts: number; + _partList: Part[]; + constructor(owerId: number) { + super(); + this._msgNo = 0; // 2 bytes + this._ownerId = owerId; // 4 bytes + this._numberOfParts = 0; // 1 bytes + /** @type {Part[]} */ + this._partList = []; // 34 bytes each + } - override size() { - return 7 + this._partList.length * 34; - } + override size() { + return 7 + this._partList.length * 34; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._ownerId, offset); - offset += 4; // offset is 6 - buffer.writeInt8(this._numberOfParts, offset); - offset += 1; // offset is 7 - for (const part of this._partList) { - const partBuffer = part.serialize(); - partBuffer.copy(buffer, offset); - offset += partBuffer.length; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._ownerId, offset); + offset += 4; // offset is 6 + buffer.writeInt8(this._numberOfParts, offset); + offset += 1; // offset is 7 + for (const part of this._partList) { + const partBuffer = part.serialize(); + partBuffer.copy(buffer, offset); + offset += partBuffer.length; + } - return buffer; - } + return buffer; + } } export class Part extends SerializedBuffer { - _partId: number; // 4 bytes - _parentPartId: number; // 4 bytes - _brandedPartId: number; // 4 bytes - _repairPrice: number; // 4 bytes - _junkPrice: number; // 4 bytes - _wear: number; // 4 bytes - _attachmentPoint: number; // 1 byte - _damage: number; // 1 byte - _retailPrice: number; // 4 bytes - _maxWear: number; // 4 bytes + _partId: number; // 4 bytes + _parentPartId: number; // 4 bytes + _brandedPartId: number; // 4 bytes + _repairPrice: number; // 4 bytes + _junkPrice: number; // 4 bytes + _wear: number; // 4 bytes + _attachmentPoint: number; // 1 byte + _damage: number; // 1 byte + _retailPrice: number; // 4 bytes + _maxWear: number; // 4 bytes - constructor() { - super(); - this._partId = 0; // 4 bytes - this._parentPartId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - this._repairPrice = 0; // 4 bytes - this._junkPrice = 0; // 4 bytes - this._wear = 0; // 4 bytes - this._attachmentPoint = 0; // 1 byte - this._damage = 0; // 1 byte - this._retailPrice = 0; // 4 bytes - this._maxWear = 0; // 4 bytes - // 33 bytes total - } + constructor() { + super(); + this._partId = 0; // 4 bytes + this._parentPartId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + this._repairPrice = 0; // 4 bytes + this._junkPrice = 0; // 4 bytes + this._wear = 0; // 4 bytes + this._attachmentPoint = 0; // 1 byte + this._damage = 0; // 1 byte + this._retailPrice = 0; // 4 bytes + this._maxWear = 0; // 4 bytes + // 33 bytes total + } - override size() { - return 34; - } + override size() { + return 34; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt32LE(this._partId, offset); - offset += 4; // offset is 4 - buffer.writeUInt32LE(this._parentPartId, offset); - offset += 4; // offset is 8 - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; // offset is 12 - buffer.writeUInt32LE(this._repairPrice, offset); - offset += 4; // offset is 16 - buffer.writeUInt32LE(this._junkPrice, offset); - offset += 4; // offset is 20 - buffer.writeUInt32LE(this._wear, offset); - offset += 4; // offset is 24 - buffer.writeUInt8(this._attachmentPoint, offset); - offset += 1; // offset is 25 - buffer.writeUInt8(this._damage, offset); - offset += 1; // offset is 26 - buffer.writeUInt32LE(this._retailPrice, offset); - offset += 4; // offset is 30 - buffer.writeUInt32LE(this._maxWear, offset); - // offset += 4; // offset is 34 + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt32LE(this._partId, offset); + offset += 4; // offset is 4 + buffer.writeUInt32LE(this._parentPartId, offset); + offset += 4; // offset is 8 + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; // offset is 12 + buffer.writeUInt32LE(this._repairPrice, offset); + offset += 4; // offset is 16 + buffer.writeUInt32LE(this._junkPrice, offset); + offset += 4; // offset is 20 + buffer.writeUInt32LE(this._wear, offset); + offset += 4; // offset is 24 + buffer.writeUInt8(this._attachmentPoint, offset); + offset += 1; // offset is 25 + buffer.writeUInt8(this._damage, offset); + offset += 1; // offset is 26 + buffer.writeUInt32LE(this._retailPrice, offset); + offset += 4; // offset is 30 + buffer.writeUInt32LE(this._maxWear, offset); + // offset += 4; // offset is 34 - return buffer; - } + return buffer; + } - override toString() { - return `Part: partId=${this._partId} parentPartId=${this._parentPartId} brandedPartId=${this._brandedPartId} repairPrice=${this._repairPrice} junkPrice=${this._junkPrice} wear=${this._wear} attachmentPoint=${this._attachmentPoint} damage=${this._damage} retailPrice=${this._retailPrice} maxWear=${this._maxWear}`; - } + override toString() { + return `Part: partId=${this._partId} parentPartId=${this._parentPartId} brandedPartId=${this._brandedPartId} repairPrice=${this._repairPrice} junkPrice=${this._junkPrice} wear=${this._wear} attachmentPoint=${this._attachmentPoint} damage=${this._damage} retailPrice=${this._retailPrice} maxWear=${this._maxWear}`; + } } diff --git a/packages/transactions/src/PlayerInfoMessage.ts b/packages/transactions/src/PlayerInfoMessage.ts index 6a48818b2..4fe7d1425 100644 --- a/packages/transactions/src/PlayerInfoMessage.ts +++ b/packages/transactions/src/PlayerInfoMessage.ts @@ -15,201 +15,204 @@ // along with this program. If not, see . import { Timestamp } from "../../shared/TimeStamp.js"; -import { - SerializedBuffer, - serializeStringRaw, -} from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { serializeStringRaw } from "../../shared/serializeStringRaw.js"; /** * A message listing the player's owned vehicles * This is the body of a MessageNode */ export class PlayerInfoMessage extends SerializedBuffer { - _msgNo: number; // 2 bytes - _playerId: number; // 4 bytes - _playerName: string; // 13 bytes - _driversLicense: string; // 12 bytes - _driverClass: number; // 1 byte - _bankBalance: number; // 4 bytes - _numberOfVehicles: number; // 2 bytes - _isLoggedOn: boolean; // 1 byte - _carsList: string[] = []; // 6 entries of 3 byte strings - _licensesPlateCode: number; // 2 bytes - _licensesPlateText: string; // 8 bytes - _carInfoSetttings: number; // 4 bytes - _vehicleId: number; // 4 bytes - _numberOfRacesEntered: number; // 4 bytes - _numberOfRacesWon: number; // 4 bytes - _numberOfRacesCompleted: number; // 4 bytes - _totalWinings: number; // 4 bytes - _insuranceRisk: number; // 2 bytes - _insurancePoints: number; // 4 bytes - _challengeRacesEntered: number; // 4 bytes - _challengeRacesWon: number; // 4 bytes - _challengeRacesCompleted: number; // 4 bytes - _numberofCarsWon: number; // 2 bytes - _numberOfCarsLost: number; // 2 bytes - _points: number; // 4 bytes - _currentLevel: number; // 4 bytes - _currentRank: number; // 4 bytes - _numberOfPointsToNextLevel: number; // 2 bytes - _numberOfPointsToNextRank: number; // 2 bytes - _maxInventorySlots: number; // 4 bytes - _numberOfInventorySlotsUsed: number; // 4 bytes - _numberOfInventoryIemsOnAuction: number; // 4 bytes - _highestBidInAuction: number; // 4 bytes - _currentClub: number; // 4 bytes - _dateLeftClub: Timestamp; // 4 bytes - _canBeInvitedToClub: boolean; // 1 byte - _playerDescription: string; // 256 + 1 bytes + _msgNo: number; // 2 bytes + _playerId: number; // 4 bytes + _playerName: string; // 13 bytes + _driversLicense: string; // 12 bytes + _driverClass: number; // 1 byte + _bankBalance: number; // 4 bytes + _numberOfVehicles: number; // 2 bytes + _isLoggedOn: boolean; // 1 byte + _carsList: string[] = []; // 6 entries of 3 byte strings + _licensesPlateCode: number; // 2 bytes + _licensesPlateText: string; // 8 bytes + _carInfoSetttings: number; // 4 bytes + _vehicleId: number; // 4 bytes + _numberOfRacesEntered: number; // 4 bytes + _numberOfRacesWon: number; // 4 bytes + _numberOfRacesCompleted: number; // 4 bytes + _totalWinings: number; // 4 bytes + _insuranceRisk: number; // 2 bytes + _insurancePoints: number; // 4 bytes + _challengeRacesEntered: number; // 4 bytes + _challengeRacesWon: number; // 4 bytes + _challengeRacesCompleted: number; // 4 bytes + _numberofCarsWon: number; // 2 bytes + _numberOfCarsLost: number; // 2 bytes + _points: number; // 4 bytes + _currentLevel: number; // 4 bytes + _currentRank: number; // 4 bytes + _numberOfPointsToNextLevel: number; // 2 bytes + _numberOfPointsToNextRank: number; // 2 bytes + _maxInventorySlots: number; // 4 bytes + _numberOfInventorySlotsUsed: number; // 4 bytes + _numberOfInventoryIemsOnAuction: number; // 4 bytes + _highestBidInAuction: number; // 4 bytes + _currentClub: number; // 4 bytes + _dateLeftClub: Timestamp; // 4 bytes + _canBeInvitedToClub: boolean; // 1 byte + _playerDescription: string; // 256 + 1 bytes - constructor() { - super(); - this._msgNo = 122; // 2 bytes - this._playerId = 0; // 4 bytes - this._playerName = ""; // 13 bytes - this._driversLicense = ""; // 12 bytes - this._driverClass = 0; // 1 byte - this._bankBalance = 0; // 4 bytes - this._numberOfVehicles = 0; // 2 bytes - this._isLoggedOn = false; // 1 byte - this._carsList = ["", "", "", "", "", ""]; // 6 entries of 3 byte strings - this._licensesPlateCode = 0; // 2 bytes - this._licensesPlateText = ""; // 8 bytes - this._carInfoSetttings = 0; // 4 bytes - this._vehicleId = 0; // 4 bytes - this._numberOfRacesEntered = 0; // 4 bytes - this._numberOfRacesWon = 0; // 4 bytes - this._numberOfRacesCompleted = 0; // 4 bytes - this._totalWinings = 0; // 4 bytes - this._insuranceRisk = 0; // 2 bytes - this._insurancePoints = 0; // 4 bytes - this._challengeRacesEntered = 0; // 4 bytes - this._challengeRacesWon = 0; // 4 bytes - this._challengeRacesCompleted = 0; // 4 bytes - this._numberofCarsWon = 0; // 2 bytes - this._numberOfCarsLost = 0; // 2 bytes - this._points = 0; // 4 bytes - this._currentLevel = 0; // 4 bytes - this._currentRank = 0; // 4 bytes - this._numberOfPointsToNextLevel = 0; // 2 bytes - this._numberOfPointsToNextRank = 0; // 2 bytes - this._maxInventorySlots = 0; // 4 bytes - this._numberOfInventorySlotsUsed = 0; // 4 bytes - this._numberOfInventoryIemsOnAuction = 0; // 4 bytes - this._highestBidInAuction = 0; // 4 bytes - this._currentClub = 0; // 4 bytes - this._dateLeftClub = new Timestamp(); // 4 bytes - this._canBeInvitedToClub = false; // 1 byte - this._playerDescription = ""; // 256 + 1 bytes - // total byes: 128 + 256 + 1 = 385 - } + constructor() { + super(); + this._msgNo = 122; // 2 bytes + this._playerId = 0; // 4 bytes + this._playerName = ""; // 13 bytes + this._driversLicense = ""; // 12 bytes + this._driverClass = 0; // 1 byte + this._bankBalance = 0; // 4 bytes + this._numberOfVehicles = 0; // 2 bytes + this._isLoggedOn = false; // 1 byte + this._carsList = ["", "", "", "", "", ""]; // 6 entries of 3 byte strings + this._licensesPlateCode = 0; // 2 bytes + this._licensesPlateText = ""; // 8 bytes + this._carInfoSetttings = 0; // 4 bytes + this._vehicleId = 0; // 4 bytes + this._numberOfRacesEntered = 0; // 4 bytes + this._numberOfRacesWon = 0; // 4 bytes + this._numberOfRacesCompleted = 0; // 4 bytes + this._totalWinings = 0; // 4 bytes + this._insuranceRisk = 0; // 2 bytes + this._insurancePoints = 0; // 4 bytes + this._challengeRacesEntered = 0; // 4 bytes + this._challengeRacesWon = 0; // 4 bytes + this._challengeRacesCompleted = 0; // 4 bytes + this._numberofCarsWon = 0; // 2 bytes + this._numberOfCarsLost = 0; // 2 bytes + this._points = 0; // 4 bytes + this._currentLevel = 0; // 4 bytes + this._currentRank = 0; // 4 bytes + this._numberOfPointsToNextLevel = 0; // 2 bytes + this._numberOfPointsToNextRank = 0; // 2 bytes + this._maxInventorySlots = 0; // 4 bytes + this._numberOfInventorySlotsUsed = 0; // 4 bytes + this._numberOfInventoryIemsOnAuction = 0; // 4 bytes + this._highestBidInAuction = 0; // 4 bytes + this._currentClub = 0; // 4 bytes + this._dateLeftClub = new Timestamp(); // 4 bytes + this._canBeInvitedToClub = false; // 1 byte + this._playerDescription = ""; // 256 + 1 bytes + // total byes: 128 + 256 + 1 = 385 + } - override size() { - return 385; - } + override size() { + return 385; + } - override serialize() { - const neededSize = this.size(); - const buffer = Buffer.alloc(neededSize); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._playerId, offset); - offset += 4; // offset is 6 - serializeStringRaw(this._playerName.substring(0, 12), buffer, offset, 13); - offset += 13; // offset is 19 - serializeStringRaw( - this._driversLicense.substring(0, 11), - buffer, - offset, - 12, - ); - offset += 12; // offset is 31 - buffer.writeUInt8(this._driverClass, offset); - offset += 1; // offset is 32 - buffer.writeUInt32LE(this._bankBalance, offset); - offset += 4; // offset is 36 - buffer.writeUInt16LE(this._numberOfVehicles, offset); - offset += 2; // offset is 38 - buffer.writeUInt8(this._isLoggedOn ? 1 : 0, offset); - offset += 1; // offset is 39 - for (const car of this._carsList) { - buffer.write(car, offset); - serializeStringRaw(car, buffer, offset, 3); - offset += 3; - } - buffer.writeUInt16LE(this._licensesPlateCode, offset); - offset += 2; // offset is 41 - serializeStringRaw( - this._licensesPlateText.substring(0, 7), - buffer, - offset, - 8, - ); - offset += 8; // offset is 49 - buffer.writeUInt32LE(this._carInfoSetttings, offset); - offset += 4; // offset is 53 - buffer.writeUInt32LE(this._vehicleId, offset); - offset += 4; // offset is 57 - buffer.writeUInt32LE(this._numberOfRacesEntered, offset); - offset += 4; // offset is 61 - buffer.writeUInt32LE(this._numberOfRacesWon, offset); - offset += 4; // offset is 65 - buffer.writeUInt32LE(this._numberOfRacesCompleted, offset); - offset += 4; // offset is 69 - buffer.writeUInt32LE(this._totalWinings, offset); - offset += 4; // offset is 73 - buffer.writeUInt16LE(this._insuranceRisk, offset); - offset += 2; // offset is 75 - buffer.writeUInt32LE(this._insurancePoints, offset); - offset += 4; // offset is 79 - buffer.writeUInt32LE(this._challengeRacesEntered, offset); - offset += 4; // offset is 83 - buffer.writeUInt32LE(this._challengeRacesWon, offset); - offset += 4; // offset is 87 - buffer.writeUInt32LE(this._challengeRacesCompleted, offset); - offset += 4; // offset is 91 - buffer.writeUInt16LE(this._numberofCarsWon, offset); - offset += 2; // offset is 93 - buffer.writeUInt16LE(this._numberOfCarsLost, offset); - offset += 2; // offset is 95 - buffer.writeUInt32LE(this._points, offset); - offset += 4; // offset is 99 - buffer.writeUInt32LE(this._currentLevel, offset); - offset += 4; // offset is 103 - buffer.writeUInt32LE(this._currentRank, offset); - offset += 4; // offset is 107 - buffer.writeUInt16LE(this._numberOfPointsToNextLevel, offset); - offset += 2; // offset is 109 - buffer.writeUInt16LE(this._numberOfPointsToNextRank, offset); - offset += 2; // offset is 111 - buffer.writeUInt32LE(this._maxInventorySlots, offset); - offset += 4; // offset is 115 - buffer.writeUInt32LE(this._numberOfInventorySlotsUsed, offset); - offset += 4; // offset is 119 - buffer.writeUInt32LE(this._numberOfInventoryIemsOnAuction, offset); - offset += 4; // offset is 123 - buffer.writeUInt32LE(this._highestBidInAuction, offset); - offset += 4; // offset is 127 - buffer.writeUInt32LE(this._currentClub, offset); - offset += 4; // offset is 131 - const dateLeftClubBuffer = this._dateLeftClub.as64BitNumber(); - buffer.writeUInt32LE(dateLeftClubBuffer, offset); - offset += 4; // offset is 135 - buffer.writeUInt8(this._canBeInvitedToClub ? 1 : 0, offset); - offset += 1; // offset is 136 - serializeStringRaw( - this._playerDescription.substring(0, 255), - buffer, - offset, - 256, - ); + override serialize() { + const neededSize = this.size(); + const buffer = Buffer.alloc(neededSize); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._playerId, offset); + offset += 4; // offset is 6 + serializeStringRaw( + this._playerName.substring(0, 12), + buffer, + offset, + 13, + ); + offset += 13; // offset is 19 + serializeStringRaw( + this._driversLicense.substring(0, 11), + buffer, + offset, + 12, + ); + offset += 12; // offset is 31 + buffer.writeUInt8(this._driverClass, offset); + offset += 1; // offset is 32 + buffer.writeUInt32LE(this._bankBalance, offset); + offset += 4; // offset is 36 + buffer.writeUInt16LE(this._numberOfVehicles, offset); + offset += 2; // offset is 38 + buffer.writeUInt8(this._isLoggedOn ? 1 : 0, offset); + offset += 1; // offset is 39 + for (const car of this._carsList) { + buffer.write(car, offset); + serializeStringRaw(car, buffer, offset, 3); + offset += 3; + } + buffer.writeUInt16LE(this._licensesPlateCode, offset); + offset += 2; // offset is 41 + serializeStringRaw( + this._licensesPlateText.substring(0, 7), + buffer, + offset, + 8, + ); + offset += 8; // offset is 49 + buffer.writeUInt32LE(this._carInfoSetttings, offset); + offset += 4; // offset is 53 + buffer.writeUInt32LE(this._vehicleId, offset); + offset += 4; // offset is 57 + buffer.writeUInt32LE(this._numberOfRacesEntered, offset); + offset += 4; // offset is 61 + buffer.writeUInt32LE(this._numberOfRacesWon, offset); + offset += 4; // offset is 65 + buffer.writeUInt32LE(this._numberOfRacesCompleted, offset); + offset += 4; // offset is 69 + buffer.writeUInt32LE(this._totalWinings, offset); + offset += 4; // offset is 73 + buffer.writeUInt16LE(this._insuranceRisk, offset); + offset += 2; // offset is 75 + buffer.writeUInt32LE(this._insurancePoints, offset); + offset += 4; // offset is 79 + buffer.writeUInt32LE(this._challengeRacesEntered, offset); + offset += 4; // offset is 83 + buffer.writeUInt32LE(this._challengeRacesWon, offset); + offset += 4; // offset is 87 + buffer.writeUInt32LE(this._challengeRacesCompleted, offset); + offset += 4; // offset is 91 + buffer.writeUInt16LE(this._numberofCarsWon, offset); + offset += 2; // offset is 93 + buffer.writeUInt16LE(this._numberOfCarsLost, offset); + offset += 2; // offset is 95 + buffer.writeUInt32LE(this._points, offset); + offset += 4; // offset is 99 + buffer.writeUInt32LE(this._currentLevel, offset); + offset += 4; // offset is 103 + buffer.writeUInt32LE(this._currentRank, offset); + offset += 4; // offset is 107 + buffer.writeUInt16LE(this._numberOfPointsToNextLevel, offset); + offset += 2; // offset is 109 + buffer.writeUInt16LE(this._numberOfPointsToNextRank, offset); + offset += 2; // offset is 111 + buffer.writeUInt32LE(this._maxInventorySlots, offset); + offset += 4; // offset is 115 + buffer.writeUInt32LE(this._numberOfInventorySlotsUsed, offset); + offset += 4; // offset is 119 + buffer.writeUInt32LE(this._numberOfInventoryIemsOnAuction, offset); + offset += 4; // offset is 123 + buffer.writeUInt32LE(this._highestBidInAuction, offset); + offset += 4; // offset is 127 + buffer.writeUInt32LE(this._currentClub, offset); + offset += 4; // offset is 131 + const dateLeftClubBuffer = this._dateLeftClub.as64BitNumber(); + buffer.writeUInt32LE(dateLeftClubBuffer, offset); + offset += 4; // offset is 135 + buffer.writeUInt8(this._canBeInvitedToClub ? 1 : 0, offset); + offset += 1; // offset is 136 + serializeStringRaw( + this._playerDescription.substring(0, 255), + buffer, + offset, + 256, + ); - return buffer; - } + return buffer; + } - override toString() { - return `PlayerInfoMessage: msgNo=${this._msgNo} playerId=${this._playerId} playerName=${this._playerName} driversLicense=${this._driversLicense} driverClass=${this._driverClass} bankBalance=${this._bankBalance} numberOfVehicles=${this._numberOfVehicles} isLoggedOn=${this._isLoggedOn} carsList=${this._carsList} licensesPlateCode=${this._licensesPlateCode} licensesPlateText=${this._licensesPlateText} carInfoSetttings=${this._carInfoSetttings} vehicleId=${this._vehicleId} numberOfRacesEntered=${this._numberOfRacesEntered} numberOfRacesWon=${this._numberOfRacesWon} numberOfRacesCompleted=${this._numberOfRacesCompleted} totalWinings=${this._totalWinings} insuranceRisk=${this._insuranceRisk} insurancePoints=${this._insurancePoints} challengeRacesEntered=${this._challengeRacesEntered} challengeRacesWon=${this._challengeRacesWon} challengeRacesCompleted=${this._challengeRacesCompleted} numberofCarsWon=${this._numberofCarsWon} numberOfCarsLost=${this._numberOfCarsLost} points=${this._points} currentLevel=${this._currentLevel} currentRank=${this._currentRank} numberOfPointsToNextLevel=${this._numberOfPointsToNextLevel} numberOfPointsToNextRank=${this._numberOfPointsToNextRank} maxInventorySlots=${this._maxInventorySlots} numberOfInventorySlotsUsed=${this._numberOfInventorySlotsUsed} numberOfInventoryIemsOnAuction=${this._numberOfInventoryIemsOnAuction} highestBidInAuction=${this._highestBidInAuction} currentClub=${this._currentClub} dateLeftClub=${this._dateLeftClub} canBeInvitedToClub=${this._canBeInvitedToClub} playerDescription=${this._playerDescription}`; - } + override toString() { + return `PlayerInfoMessage: msgNo=${this._msgNo} playerId=${this._playerId} playerName=${this._playerName} driversLicense=${this._driversLicense} driverClass=${this._driverClass} bankBalance=${this._bankBalance} numberOfVehicles=${this._numberOfVehicles} isLoggedOn=${this._isLoggedOn} carsList=${this._carsList} licensesPlateCode=${this._licensesPlateCode} licensesPlateText=${this._licensesPlateText} carInfoSetttings=${this._carInfoSetttings} vehicleId=${this._vehicleId} numberOfRacesEntered=${this._numberOfRacesEntered} numberOfRacesWon=${this._numberOfRacesWon} numberOfRacesCompleted=${this._numberOfRacesCompleted} totalWinings=${this._totalWinings} insuranceRisk=${this._insuranceRisk} insurancePoints=${this._insurancePoints} challengeRacesEntered=${this._challengeRacesEntered} challengeRacesWon=${this._challengeRacesWon} challengeRacesCompleted=${this._challengeRacesCompleted} numberofCarsWon=${this._numberofCarsWon} numberOfCarsLost=${this._numberOfCarsLost} points=${this._points} currentLevel=${this._currentLevel} currentRank=${this._currentRank} numberOfPointsToNextLevel=${this._numberOfPointsToNextLevel} numberOfPointsToNextRank=${this._numberOfPointsToNextRank} maxInventorySlots=${this._maxInventorySlots} numberOfInventorySlotsUsed=${this._numberOfInventorySlotsUsed} numberOfInventoryIemsOnAuction=${this._numberOfInventoryIemsOnAuction} highestBidInAuction=${this._highestBidInAuction} currentClub=${this._currentClub} dateLeftClub=${this._dateLeftClub} canBeInvitedToClub=${this._canBeInvitedToClub} playerDescription=${this._playerDescription}`; + } } diff --git a/packages/transactions/src/PlayerPhysicalMessage.ts b/packages/transactions/src/PlayerPhysicalMessage.ts index e5a50d1d6..015897225 100644 --- a/packages/transactions/src/PlayerPhysicalMessage.ts +++ b/packages/transactions/src/PlayerPhysicalMessage.ts @@ -1,50 +1,50 @@ -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; export class PlayerPhysicalMessage extends SerializedBuffer { - _msgNo: number; // 2 bytes - _playerId: number; // 4 bytes - _bodytype: number; // 4 bytes - _hairColor: number; // 4 bytes - _skinColor: number; // 4 bytes - _shirtColor: number; // 4 bytes - _pantsColor: number; // 4 bytes - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._playerId = 0; // 4 bytes - this._bodytype = 0; // 4 bytes - this._hairColor = 0; // 4 bytes - this._skinColor = 0; // 4 bytes - this._shirtColor = 0; // 4 bytes - this._pantsColor = 0; // 4 bytes - // total: 26 bytes - } + _msgNo: number; // 2 bytes + _playerId: number; // 4 bytes + _bodytype: number; // 4 bytes + _hairColor: number; // 4 bytes + _skinColor: number; // 4 bytes + _shirtColor: number; // 4 bytes + _pantsColor: number; // 4 bytes + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._playerId = 0; // 4 bytes + this._bodytype = 0; // 4 bytes + this._hairColor = 0; // 4 bytes + this._skinColor = 0; // 4 bytes + this._shirtColor = 0; // 4 bytes + this._pantsColor = 0; // 4 bytes + // total: 26 bytes + } - override size() { - return 26; - } + override size() { + return 26; + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._playerId, offset); - offset += 4; - buffer.writeUInt32LE(this._bodytype, offset); - offset += 4; - buffer.writeUInt32LE(this._hairColor, offset); - offset += 4; - buffer.writeUInt32LE(this._skinColor, offset); - offset += 4; - buffer.writeUInt32LE(this._shirtColor, offset); - offset += 4; - buffer.writeUInt32LE(this._pantsColor, offset); + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._playerId, offset); + offset += 4; + buffer.writeUInt32LE(this._bodytype, offset); + offset += 4; + buffer.writeUInt32LE(this._hairColor, offset); + offset += 4; + buffer.writeUInt32LE(this._skinColor, offset); + offset += 4; + buffer.writeUInt32LE(this._shirtColor, offset); + offset += 4; + buffer.writeUInt32LE(this._pantsColor, offset); - return buffer; - } + return buffer; + } - override toString() { - return `PlayerPhysicalMessage: msgNo=${this._msgNo} playerId=${this._playerId} bodytype=${this._bodytype} hairColor=${this._hairColor} skinColor=${this._skinColor} shirtColor=${this._shirtColor} pantsColor=${this._pantsColor}`; - } + override toString() { + return `PlayerPhysicalMessage: msgNo=${this._msgNo} playerId=${this._playerId} bodytype=${this._bodytype} hairColor=${this._hairColor} skinColor=${this._skinColor} shirtColor=${this._shirtColor} pantsColor=${this._pantsColor}`; + } } diff --git a/packages/transactions/src/PlayerRacingHistoryMessage.ts b/packages/transactions/src/PlayerRacingHistoryMessage.ts index 64bf3f9b4..2e80f73cf 100644 --- a/packages/transactions/src/PlayerRacingHistoryMessage.ts +++ b/packages/transactions/src/PlayerRacingHistoryMessage.ts @@ -1,153 +1,153 @@ -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; export class PlayerRacingHistoryMessage extends SerializedBuffer { - _msgId: number; // 2 bytes - _userId: number; // 4 bytes - _numRaces: number; // 2 bytes - _expectMore: boolean; // 1 byte - _raceHistoryRecords: RacingHistoryRecordEntry[]; // 32 bytes each - - constructor() { - super(); - this._msgId = 0; - this._userId = 0; - this._numRaces = 0; - this._expectMore = false; - this._raceHistoryRecords = []; - // total: 39 bytes + 32 bytes * numRaces - } - - override size(): number { - return 39 + this._numRaces * 32; - } - - addRecord(record: RacingHistoryRecordEntry) { - this._raceHistoryRecords.push(record); - this._numRaces++; - } - - deserialize(buffer: Buffer): PlayerRacingHistoryMessage { - let offset = 0; - this._msgId = buffer.readInt16LE(offset); - offset += 2; - this._userId = buffer.readInt32LE(offset); - offset += 4; - this._numRaces = buffer.readInt16LE(offset); - offset += 2; - this._expectMore = buffer.readInt8(offset) === 1; - offset += 1; - for (let i = 0; i < this._numRaces; i++) { - const record = new RacingHistoryRecordEntry(); - record.deserialize(buffer.subarray(offset, offset + 32)); - offset += 32; - this._raceHistoryRecords.push(record); - } - - return this; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt16LE(this._msgId, offset); - offset += 2; - buffer.writeInt32LE(this._userId, offset); - offset += 4; - buffer.writeInt16LE(this._numRaces, offset); - offset += 2; - buffer.writeInt8(this._expectMore ? 1 : 0, offset); - offset += 1; - for (let i = 0; i < this._numRaces; i++) { - this._raceHistoryRecords[i].serialize().copy(buffer, offset); - offset += 32; - } - - return buffer; - } - - asString(): string { - let result = `PlayerRacingHistoryMessage: MsgId: ${this._msgId}, UserId: ${this._userId}, NumRaces: ${this._numRaces}, ExpectMore: ${this._expectMore}`; - for (let i = 0; i < this._numRaces; i++) { - result += `\n${this._raceHistoryRecords[i].asString()}`; - } - - return result; - } + _msgId: number; // 2 bytes + _userId: number; // 4 bytes + _numRaces: number; // 2 bytes + _expectMore: boolean; // 1 byte + _raceHistoryRecords: RacingHistoryRecordEntry[]; // 32 bytes each + + constructor() { + super(); + this._msgId = 0; + this._userId = 0; + this._numRaces = 0; + this._expectMore = false; + this._raceHistoryRecords = []; + // total: 39 bytes + 32 bytes * numRaces + } + + override size(): number { + return 39 + this._numRaces * 32; + } + + addRecord(record: RacingHistoryRecordEntry) { + this._raceHistoryRecords.push(record); + this._numRaces++; + } + + deserialize(buffer: Buffer): PlayerRacingHistoryMessage { + let offset = 0; + this._msgId = buffer.readInt16LE(offset); + offset += 2; + this._userId = buffer.readInt32LE(offset); + offset += 4; + this._numRaces = buffer.readInt16LE(offset); + offset += 2; + this._expectMore = buffer.readInt8(offset) === 1; + offset += 1; + for (let i = 0; i < this._numRaces; i++) { + const record = new RacingHistoryRecordEntry(); + record.deserialize(buffer.subarray(offset, offset + 32)); + offset += 32; + this._raceHistoryRecords.push(record); + } + + return this; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt16LE(this._msgId, offset); + offset += 2; + buffer.writeInt32LE(this._userId, offset); + offset += 4; + buffer.writeInt16LE(this._numRaces, offset); + offset += 2; + buffer.writeInt8(this._expectMore ? 1 : 0, offset); + offset += 1; + for (let i = 0; i < this._numRaces; i++) { + this._raceHistoryRecords[i].serialize().copy(buffer, offset); + offset += 32; + } + + return buffer; + } + + asString(): string { + let result = `PlayerRacingHistoryMessage: MsgId: ${this._msgId}, UserId: ${this._userId}, NumRaces: ${this._numRaces}, ExpectMore: ${this._expectMore}`; + for (let i = 0; i < this._numRaces; i++) { + result += `\n${this._raceHistoryRecords[i].asString()}`; + } + + return result; + } } export class RacingHistoryRecordEntry extends SerializedBuffer { - raceType: number; // 4 bytes - numberOfRacesEntered: number; // 4 bytes - numberOfRacesFinished: number; // 4 bytes - numberOfRacesWon: number; // 4 bytes - numberOfCarsWon: number; // 4 bytes - numberOfCarsLost: number; // 4 bytes - numberOfChampionshipsWon: number; // 4 bytes - cashWon: number; // 4 bytes - - constructor() { - super(); - this.raceType = 0; - this.numberOfRacesEntered = 0; - this.numberOfRacesFinished = 0; - this.numberOfRacesWon = 0; - this.numberOfCarsWon = 0; - this.numberOfCarsLost = 0; - this.numberOfChampionshipsWon = 0; - this.cashWon = 0; - // total: 32 bytes - } - - override size(): number { - return 32; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.writeInt32LE(this.raceType, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesEntered, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesFinished, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfRacesWon, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfCarsWon, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfCarsLost, offset); - offset += 4; - buffer.writeInt32LE(this.numberOfChampionshipsWon, offset); - offset += 4; - buffer.writeInt32LE(this.cashWon, offset); - // total: 8 * 4 = 32 bytes - - return buffer; - } - - deserialize(buffer: Buffer): RacingHistoryRecordEntry { - let offset = 0; - this.raceType = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesEntered = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesFinished = buffer.readInt32LE(offset); - offset += 4; - this.numberOfRacesWon = buffer.readInt32LE(offset); - offset += 4; - this.numberOfCarsWon = buffer.readInt32LE(offset); - offset += 4; - this.numberOfCarsLost = buffer.readInt32LE(offset); - offset += 4; - this.numberOfChampionshipsWon = buffer.readInt32LE(offset); - offset += 4; - this.cashWon = buffer.readInt32LE(offset); - // total: 8 * 4 = 32 bytes - - return this; - } - - asString(): string { - return `RacingHistoryRecord: RaceType: ${this.raceType}, NumberOfRacesEntered: ${this.numberOfRacesEntered}, NumberOfRacesFinished: ${this.numberOfRacesFinished}, NumberOfRacesWon: ${this.numberOfRacesWon}, NumberOfCarsWon: ${this.numberOfCarsWon}, NumberOfCarsLost: ${this.numberOfCarsLost}, NumberOfChampionshipsWon: ${this.numberOfChampionshipsWon}, CashWon: ${this.cashWon}`; - } + raceType: number; // 4 bytes + numberOfRacesEntered: number; // 4 bytes + numberOfRacesFinished: number; // 4 bytes + numberOfRacesWon: number; // 4 bytes + numberOfCarsWon: number; // 4 bytes + numberOfCarsLost: number; // 4 bytes + numberOfChampionshipsWon: number; // 4 bytes + cashWon: number; // 4 bytes + + constructor() { + super(); + this.raceType = 0; + this.numberOfRacesEntered = 0; + this.numberOfRacesFinished = 0; + this.numberOfRacesWon = 0; + this.numberOfCarsWon = 0; + this.numberOfCarsLost = 0; + this.numberOfChampionshipsWon = 0; + this.cashWon = 0; + // total: 32 bytes + } + + override size(): number { + return 32; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.writeInt32LE(this.raceType, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesEntered, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesFinished, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfRacesWon, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfCarsWon, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfCarsLost, offset); + offset += 4; + buffer.writeInt32LE(this.numberOfChampionshipsWon, offset); + offset += 4; + buffer.writeInt32LE(this.cashWon, offset); + // total: 8 * 4 = 32 bytes + + return buffer; + } + + deserialize(buffer: Buffer): RacingHistoryRecordEntry { + let offset = 0; + this.raceType = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesEntered = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesFinished = buffer.readInt32LE(offset); + offset += 4; + this.numberOfRacesWon = buffer.readInt32LE(offset); + offset += 4; + this.numberOfCarsWon = buffer.readInt32LE(offset); + offset += 4; + this.numberOfCarsLost = buffer.readInt32LE(offset); + offset += 4; + this.numberOfChampionshipsWon = buffer.readInt32LE(offset); + offset += 4; + this.cashWon = buffer.readInt32LE(offset); + // total: 8 * 4 = 32 bytes + + return this; + } + + asString(): string { + return `RacingHistoryRecord: RaceType: ${this.raceType}, NumberOfRacesEntered: ${this.numberOfRacesEntered}, NumberOfRacesFinished: ${this.numberOfRacesFinished}, NumberOfRacesWon: ${this.numberOfRacesWon}, NumberOfCarsWon: ${this.numberOfCarsWon}, NumberOfCarsLost: ${this.numberOfCarsLost}, NumberOfChampionshipsWon: ${this.numberOfChampionshipsWon}, CashWon: ${this.cashWon}`; + } } diff --git a/packages/transactions/src/TClientConnectMessage.ts b/packages/transactions/src/TClientConnectMessage.ts index 725eb56b0..0443418ae 100644 --- a/packages/transactions/src/TClientConnectMessage.ts +++ b/packages/transactions/src/TClientConnectMessage.ts @@ -14,84 +14,84 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; export class TClientConnectMessage extends OldServerMessage { - _customerId: number; - _personaId: number; - _customerName: string; - _personaName: string; - _mcVersion: string; - constructor() { - super(); - this._msgNo = 0; // 8 bytes - this._customerId = 0; // 4 bytes - this._personaId = 0; // 4 bytes - this._customerName = ""; // 13 bytes - this._personaName = ""; // 13 bytes - this._mcVersion = ""; // 4 bytes - } + _customerId: number; + _personaId: number; + _customerName: string; + _personaName: string; + _mcVersion: string; + constructor() { + super(); + this._msgNo = 0; // 8 bytes + this._customerId = 0; // 4 bytes + this._personaId = 0; // 4 bytes + this._customerName = ""; // 13 bytes + this._personaName = ""; // 13 bytes + this._mcVersion = ""; // 4 bytes + } - override size() { - return 51; - } + override size() { + return 51; + } - /** - * @param {Buffer} buffer - */ - deserialize(buffer: Buffer) { - let offset = 0; - this._header._doDeserialize(buffer); - offset += this._header._size; - this._msgNo = buffer.readUInt16LE(offset); - offset += 2; - this._customerId = buffer.readUInt32LE(offset); - offset += 4; - this._personaId = buffer.readUInt32LE(offset); - offset += 4; - this._customerName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._personaName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._mcVersion = buffer.toString("utf8", offset, offset + 4); - // 51 bytes - } + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer) { + let offset = 0; + this._header._doDeserialize(buffer); + offset += this._header._size; + this._msgNo = buffer.readUInt16LE(offset); + offset += 2; + this._customerId = buffer.readUInt32LE(offset); + offset += 4; + this._personaId = buffer.readUInt32LE(offset); + offset += 4; + this._customerName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._personaName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._mcVersion = buffer.toString("utf8", offset, offset + 4); + // 51 bytes + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - buffer.copy(this._header._doSerialize(), offset); - offset += this._header._size; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._customerId, offset); - offset += 4; - buffer.writeUInt32LE(this._personaId, offset); - offset += 4; - buffer.write(this._customerName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._personaName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._mcVersion, offset, 4, "utf8"); - // 51 bytes - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + buffer.copy(this._header._doSerialize(), offset); + offset += this._header._size; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._customerId, offset); + offset += 4; + buffer.writeUInt32LE(this._personaId, offset); + offset += 4; + buffer.write(this._customerName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._personaName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._mcVersion, offset, 4, "utf8"); + // 51 bytes + return buffer; + } - /** - * @override - */ - override toString() { - return `TClientConnectMessage: ${JSON.stringify({ - length: this._header.length, - mcoSig: this._header.mcoSig, - seq: this._header.sequence, - flags: this._header.flags, - msgNo: this._msgNo, - customerId: this._customerId, - personaId: this._personaId, - customerName: this._customerName, - personaName: this._personaName, - mcVersion: this._mcVersion, - })}`; - } + /** + * @override + */ + override toString() { + return `TClientConnectMessage: ${JSON.stringify({ + length: this._header.length, + mcoSig: this._header.mcoSig, + seq: this._header.sequence, + flags: this._header.flags, + msgNo: this._msgNo, + customerId: this._customerId, + personaId: this._personaId, + customerName: this._customerName, + personaName: this._personaName, + mcVersion: this._mcVersion, + })}`; + } } diff --git a/packages/transactions/src/TLoginMessage.ts b/packages/transactions/src/TLoginMessage.ts index a183ab3a1..10427d68b 100644 --- a/packages/transactions/src/TLoginMessage.ts +++ b/packages/transactions/src/TLoginMessage.ts @@ -14,133 +14,131 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { - OldServerMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; export class ListEntry extends SerializedBuffer { - constructor() { - super(); - } + constructor() { + super(); + } } export class LoginCompleteMessage extends SerializedBuffer { - _msgNo: number; - _serverTime: number; - _firstTime: boolean; - _paycheckWaiting: boolean; - _clubInvitesWaiting: boolean; - tallyInProgress: boolean; - _secondsUntilShutdown: number; - _shardGNP: number; - _shardCarsSold: number; - _shardAverageSalaries: number; - _shardAverageCarsOwned: number; - _shardAverageLevel: number; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._serverTime = 0; // 4 bytes - this._firstTime = false; // 1 byte - this._paycheckWaiting = false; // 1 byte - this._clubInvitesWaiting = false; // 1 byte - this.tallyInProgress = false; // 1 byte - this._secondsUntilShutdown = 0; // 2 bytes + _msgNo: number; + _serverTime: number; + _firstTime: boolean; + _paycheckWaiting: boolean; + _clubInvitesWaiting: boolean; + tallyInProgress: boolean; + _secondsUntilShutdown: number; + _shardGNP: number; + _shardCarsSold: number; + _shardAverageSalaries: number; + _shardAverageCarsOwned: number; + _shardAverageLevel: number; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._serverTime = 0; // 4 bytes + this._firstTime = false; // 1 byte + this._paycheckWaiting = false; // 1 byte + this._clubInvitesWaiting = false; // 1 byte + this.tallyInProgress = false; // 1 byte + this._secondsUntilShutdown = 0; // 2 bytes - this._shardGNP = 0; // 4 bytes - this._shardCarsSold = 0; // 4 bytes - this._shardAverageSalaries = 0; // 4 bytes - this._shardAverageCarsOwned = 0; // 4 bytes - this._shardAverageLevel = 0; // 4 bytes - } + this._shardGNP = 0; // 4 bytes + this._shardCarsSold = 0; // 4 bytes + this._shardAverageSalaries = 0; // 4 bytes + this._shardAverageCarsOwned = 0; // 4 bytes + this._shardAverageLevel = 0; // 4 bytes + } } export class TLoginMessage extends OldServerMessage { - _size: number; - _customerId: number; - _personaId: number; - _lotOwnerId: number; - _brandedPartId: number; - _skinId: number; - _personaName: string; - _mcVersion: string; - constructor() { - super(); - this._size = 40; - this._msgNo = 0; // 2 bytes - this._customerId = 0; // 4 bytes - this._personaId = 0; // 4 bytes - this._lotOwnerId = 0; // 4 bytes - this._brandedPartId = 0; // 4 bytes - this._skinId = 0; // 4 bytes - this._personaName = ""; // 13 bytes - this._mcVersion = ""; // 4 bytes - } + _size: number; + _customerId: number; + _personaId: number; + _lotOwnerId: number; + _brandedPartId: number; + _skinId: number; + _personaName: string; + _mcVersion: string; + constructor() { + super(); + this._size = 40; + this._msgNo = 0; // 2 bytes + this._customerId = 0; // 4 bytes + this._personaId = 0; // 4 bytes + this._lotOwnerId = 0; // 4 bytes + this._brandedPartId = 0; // 4 bytes + this._skinId = 0; // 4 bytes + this._personaName = ""; // 13 bytes + this._mcVersion = ""; // 4 bytes + } - /** - * @param {Buffer} buffer - */ - deserialize(buffer: Buffer) { - let offset = 0; - this._header._doDeserialize(buffer); - offset += this._header._size; - this._msgNo = buffer.readUInt16LE(offset); - offset += 2; - this._customerId = buffer.readUInt32LE(offset); - offset += 4; - this._personaId = buffer.readUInt32LE(offset); - offset += 4; - this._lotOwnerId = buffer.readUInt32LE(offset); - offset += 4; - this._brandedPartId = buffer.readUInt32LE(offset); - offset += 4; - this._skinId = buffer.readUInt32LE(offset); - offset += 4; - this._personaName = buffer.toString("utf8", offset, offset + 13); - offset += 13; - this._mcVersion = buffer.toString("utf8", offset, offset + 4); - // 40 bytes - } + /** + * @param {Buffer} buffer + */ + deserialize(buffer: Buffer) { + let offset = 0; + this._header._doDeserialize(buffer); + offset += this._header._size; + this._msgNo = buffer.readUInt16LE(offset); + offset += 2; + this._customerId = buffer.readUInt32LE(offset); + offset += 4; + this._personaId = buffer.readUInt32LE(offset); + offset += 4; + this._lotOwnerId = buffer.readUInt32LE(offset); + offset += 4; + this._brandedPartId = buffer.readUInt32LE(offset); + offset += 4; + this._skinId = buffer.readUInt32LE(offset); + offset += 4; + this._personaName = buffer.toString("utf8", offset, offset + 13); + offset += 13; + this._mcVersion = buffer.toString("utf8", offset, offset + 4); + // 40 bytes + } - override serialize() { - const buffer = Buffer.alloc(this._size); - let offset = 0; - buffer.copy(this._header._doSerialize(), offset); - offset += this._header._size; - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; - buffer.writeUInt32LE(this._customerId, offset); - offset += 4; - buffer.writeUInt32LE(this._personaId, offset); - offset += 4; - buffer.writeUInt32LE(this._lotOwnerId, offset); - offset += 4; - buffer.writeUInt32LE(this._brandedPartId, offset); - offset += 4; - buffer.writeUInt32LE(this._skinId, offset); - offset += 4; - buffer.write(this._personaName, offset, 13, "utf8"); - offset += 13; - buffer.write(this._mcVersion, offset, 4, "utf8"); - // 40 bytes - return buffer; - } + override serialize() { + const buffer = Buffer.alloc(this._size); + let offset = 0; + buffer.copy(this._header._doSerialize(), offset); + offset += this._header._size; + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; + buffer.writeUInt32LE(this._customerId, offset); + offset += 4; + buffer.writeUInt32LE(this._personaId, offset); + offset += 4; + buffer.writeUInt32LE(this._lotOwnerId, offset); + offset += 4; + buffer.writeUInt32LE(this._brandedPartId, offset); + offset += 4; + buffer.writeUInt32LE(this._skinId, offset); + offset += 4; + buffer.write(this._personaName, offset, 13, "utf8"); + offset += 13; + buffer.write(this._mcVersion, offset, 4, "utf8"); + // 40 bytes + return buffer; + } - asJSON() { - return { - msgNo: this._msgNo, - customerId: this._customerId, - personaId: this._personaId, - lotOwnerId: this._lotOwnerId, - brandedPartId: this._brandedPartId, - skinId: this._skinId, - personaName: this._personaName, - mcVersion: this._mcVersion, - }; - } + asJSON() { + return { + msgNo: this._msgNo, + customerId: this._customerId, + personaId: this._personaId, + lotOwnerId: this._lotOwnerId, + brandedPartId: this._brandedPartId, + skinId: this._skinId, + personaName: this._personaName, + mcVersion: this._mcVersion, + }; + } - override toString() { - return `TLoginMessage: msgNo=${this._msgNo} customerId=${this._customerId} personaId=${this._personaId} lotOwnerId=${this._lotOwnerId} brandedPartId=${this._brandedPartId} skinId=${this._skinId} personaName=${this._personaName} mcVersion=${this._mcVersion}`; - } + override toString() { + return `TLoginMessage: msgNo=${this._msgNo} customerId=${this._customerId} personaId=${this._personaId} lotOwnerId=${this._lotOwnerId} brandedPartId=${this._brandedPartId} skinId=${this._skinId} personaName=${this._personaName} mcVersion=${this._mcVersion}`; + } } diff --git a/packages/transactions/src/TunablesMessage.ts b/packages/transactions/src/TunablesMessage.ts index cecf6ef22..57d4f1f3f 100644 --- a/packages/transactions/src/TunablesMessage.ts +++ b/packages/transactions/src/TunablesMessage.ts @@ -14,139 +14,139 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/messageFactory.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ export class TunablesMessage extends SerializedBuffer { - _msgNo: number; - _clubCreationCost: number; - _clubCreationRequiredLevel: number; - _clubOfficerRequiredLevel: number; - _inventorySizePerLevel: number; - _carsPerLevel: number; - _maxEZStreetLevel: number; - _clubSwitchCooldown: number; - _universalRepairCostModifier: number; - _universalScrapValueModifier: number; - _addCost1Day: number; - _addCost2Days: number; - _addCost3Days: number; - _addCost4Days: number; - _addCost5Days: number; - _addCost6Days: number; - _addCost7Days: number; - _tradeinModifier: number; - _simStreetMaxWager: number; - saleryPerLevel: number; - _clubMaxMembers: number; - _clubRegistrationCost: number; - _clubReRegistrationCost: number; - _classifiedAdRate: number; - _classifiedAdMaxDuration: number; - _classifiedAdMaxSize: number; - _classifiedAdMaxCountPerPlayer: number; - constructor() { - super(); - this._msgNo = 0; // 2 bytes - this._clubCreationCost = 150; // 4 bytes - this._clubCreationRequiredLevel = 1; // 4 bytes - this._clubOfficerRequiredLevel = 1; // 4 bytes - this._inventorySizePerLevel = 20; // 4 bytes - this._carsPerLevel = 3; // 4 bytes - this._maxEZStreetLevel = 5; // 4 bytes - this._clubSwitchCooldown = 1; // 4 bytes - this._universalRepairCostModifier = 3.6; // 8 bytes - this._universalScrapValueModifier = 3.6; // 8 bytes - this._addCost1Day = 1; // 4 bytes - this._addCost2Days = 2; // 4 bytes - this._addCost3Days = 3; // 4 bytes - this._addCost4Days = 4; // 4 bytes - this._addCost5Days = 5; // 4 bytes - this._addCost6Days = 6; // 4 bytes - this._addCost7Days = 7; // 4 bytes - this._tradeinModifier = 3.6; // 8 bytes - this._simStreetMaxWager = 20; // 4 bytes - this.saleryPerLevel = 6; // 4 bytes - this._clubMaxMembers = 4; // 4 bytes - this._clubRegistrationCost = 2; // 4 bytes - this._clubReRegistrationCost = 3; // 4 bytes - this._classifiedAdRate = 10; // 4 bytes - this._classifiedAdMaxDuration = 4; // 4 bytes - this._classifiedAdMaxSize = 17; // 4 bytes - this._classifiedAdMaxCountPerPlayer = 2; // 4 bytes - // total: 118 bytes - } + _msgNo: number; + _clubCreationCost: number; + _clubCreationRequiredLevel: number; + _clubOfficerRequiredLevel: number; + _inventorySizePerLevel: number; + _carsPerLevel: number; + _maxEZStreetLevel: number; + _clubSwitchCooldown: number; + _universalRepairCostModifier: number; + _universalScrapValueModifier: number; + _addCost1Day: number; + _addCost2Days: number; + _addCost3Days: number; + _addCost4Days: number; + _addCost5Days: number; + _addCost6Days: number; + _addCost7Days: number; + _tradeinModifier: number; + _simStreetMaxWager: number; + saleryPerLevel: number; + _clubMaxMembers: number; + _clubRegistrationCost: number; + _clubReRegistrationCost: number; + _classifiedAdRate: number; + _classifiedAdMaxDuration: number; + _classifiedAdMaxSize: number; + _classifiedAdMaxCountPerPlayer: number; + constructor() { + super(); + this._msgNo = 0; // 2 bytes + this._clubCreationCost = 150; // 4 bytes + this._clubCreationRequiredLevel = 1; // 4 bytes + this._clubOfficerRequiredLevel = 1; // 4 bytes + this._inventorySizePerLevel = 20; // 4 bytes + this._carsPerLevel = 3; // 4 bytes + this._maxEZStreetLevel = 5; // 4 bytes + this._clubSwitchCooldown = 1; // 4 bytes + this._universalRepairCostModifier = 3.6; // 8 bytes + this._universalScrapValueModifier = 3.6; // 8 bytes + this._addCost1Day = 1; // 4 bytes + this._addCost2Days = 2; // 4 bytes + this._addCost3Days = 3; // 4 bytes + this._addCost4Days = 4; // 4 bytes + this._addCost5Days = 5; // 4 bytes + this._addCost6Days = 6; // 4 bytes + this._addCost7Days = 7; // 4 bytes + this._tradeinModifier = 3.6; // 8 bytes + this._simStreetMaxWager = 20; // 4 bytes + this.saleryPerLevel = 6; // 4 bytes + this._clubMaxMembers = 4; // 4 bytes + this._clubRegistrationCost = 2; // 4 bytes + this._clubReRegistrationCost = 3; // 4 bytes + this._classifiedAdRate = 10; // 4 bytes + this._classifiedAdMaxDuration = 4; // 4 bytes + this._classifiedAdMaxSize = 17; // 4 bytes + this._classifiedAdMaxCountPerPlayer = 2; // 4 bytes + // total: 118 bytes + } - override size() { - return 118; // This needs to 124 bytes, but the last 6 bytes are unknown - } + override size() { + return 118; // This needs to 124 bytes, but the last 6 bytes are unknown + } - override serialize() { - const buffer = Buffer.alloc(this.size()); - let offset = 0; // offset is 0 - buffer.writeUInt16LE(this._msgNo, offset); - offset += 2; // offset is 2 - buffer.writeUInt32LE(this._clubCreationCost, offset); - offset += 4; // offset is 6 - buffer.writeUInt32LE(this._clubCreationRequiredLevel, offset); - offset += 4; // offset is 10 - buffer.writeUInt32LE(this._clubOfficerRequiredLevel, offset); - offset += 4; // offset is 14 - buffer.writeUInt32LE(this._inventorySizePerLevel, offset); - offset += 4; // offset is 18 - buffer.writeUInt32LE(this._carsPerLevel, offset); - offset += 4; // offset is 22 - buffer.writeUInt32LE(this._maxEZStreetLevel, offset); - offset += 4; // offset is 26 - buffer.writeUInt32LE(this._clubSwitchCooldown, offset); - offset += 4; // offset is 30 - buffer.writeDoubleLE(this._universalRepairCostModifier, offset); - offset += 8; // offset is 38 - buffer.writeDoubleLE(this._universalScrapValueModifier, offset); - offset += 8; // offset is 46 - buffer.writeUInt32LE(this._addCost1Day, offset); - offset += 4; // offset is 50 - buffer.writeUInt32LE(this._addCost2Days, offset); - offset += 4; // offset is 54 - buffer.writeUInt32LE(this._addCost3Days, offset); - offset += 4; // offset is 58 - buffer.writeUInt32LE(this._addCost4Days, offset); - offset += 4; // offset is 62 - buffer.writeUInt32LE(this._addCost5Days, offset); - offset += 4; // offset is 66 - buffer.writeUInt32LE(this._addCost6Days, offset); - offset += 4; // offset is 70 - buffer.writeUInt32LE(this._addCost7Days, offset); - offset += 4; // offset is 74 - buffer.writeDoubleLE(this._tradeinModifier, offset); - offset += 8; // offset is 82 - buffer.writeUInt32LE(this._simStreetMaxWager, offset); - offset += 4; // offset is 86 - buffer.writeUInt32LE(this.saleryPerLevel, offset); - offset += 4; // offset is 90 - buffer.writeUInt32LE(this._clubMaxMembers, offset); - offset += 4; // offset is 94 - buffer.writeUInt32LE(this._clubRegistrationCost, offset); - offset += 4; // offset is 98 - buffer.writeUInt32LE(this._clubReRegistrationCost, offset); - offset += 4; // offset is 102 - buffer.writeUInt32LE(this._classifiedAdRate, offset); - offset += 4; // offset is 106 - buffer.writeUInt32LE(this._classifiedAdMaxDuration, offset); - offset += 4; // offset is 110 - buffer.writeUInt32LE(this._classifiedAdMaxSize, offset); - offset += 4; // offset is 114 - buffer.writeUInt32LE(this._classifiedAdMaxCountPerPlayer, offset); - // offset is 118 + override serialize() { + const buffer = Buffer.alloc(this.size()); + let offset = 0; // offset is 0 + buffer.writeUInt16LE(this._msgNo, offset); + offset += 2; // offset is 2 + buffer.writeUInt32LE(this._clubCreationCost, offset); + offset += 4; // offset is 6 + buffer.writeUInt32LE(this._clubCreationRequiredLevel, offset); + offset += 4; // offset is 10 + buffer.writeUInt32LE(this._clubOfficerRequiredLevel, offset); + offset += 4; // offset is 14 + buffer.writeUInt32LE(this._inventorySizePerLevel, offset); + offset += 4; // offset is 18 + buffer.writeUInt32LE(this._carsPerLevel, offset); + offset += 4; // offset is 22 + buffer.writeUInt32LE(this._maxEZStreetLevel, offset); + offset += 4; // offset is 26 + buffer.writeUInt32LE(this._clubSwitchCooldown, offset); + offset += 4; // offset is 30 + buffer.writeDoubleLE(this._universalRepairCostModifier, offset); + offset += 8; // offset is 38 + buffer.writeDoubleLE(this._universalScrapValueModifier, offset); + offset += 8; // offset is 46 + buffer.writeUInt32LE(this._addCost1Day, offset); + offset += 4; // offset is 50 + buffer.writeUInt32LE(this._addCost2Days, offset); + offset += 4; // offset is 54 + buffer.writeUInt32LE(this._addCost3Days, offset); + offset += 4; // offset is 58 + buffer.writeUInt32LE(this._addCost4Days, offset); + offset += 4; // offset is 62 + buffer.writeUInt32LE(this._addCost5Days, offset); + offset += 4; // offset is 66 + buffer.writeUInt32LE(this._addCost6Days, offset); + offset += 4; // offset is 70 + buffer.writeUInt32LE(this._addCost7Days, offset); + offset += 4; // offset is 74 + buffer.writeDoubleLE(this._tradeinModifier, offset); + offset += 8; // offset is 82 + buffer.writeUInt32LE(this._simStreetMaxWager, offset); + offset += 4; // offset is 86 + buffer.writeUInt32LE(this.saleryPerLevel, offset); + offset += 4; // offset is 90 + buffer.writeUInt32LE(this._clubMaxMembers, offset); + offset += 4; // offset is 94 + buffer.writeUInt32LE(this._clubRegistrationCost, offset); + offset += 4; // offset is 98 + buffer.writeUInt32LE(this._clubReRegistrationCost, offset); + offset += 4; // offset is 102 + buffer.writeUInt32LE(this._classifiedAdRate, offset); + offset += 4; // offset is 106 + buffer.writeUInt32LE(this._classifiedAdMaxDuration, offset); + offset += 4; // offset is 110 + buffer.writeUInt32LE(this._classifiedAdMaxSize, offset); + offset += 4; // offset is 114 + buffer.writeUInt32LE(this._classifiedAdMaxCountPerPlayer, offset); + // offset is 118 - return buffer; - } + return buffer; + } - override toString() { - return ` + override toString() { + return ` TunablesMessage: msgNo=${this._msgNo} @@ -177,5 +177,5 @@ export class TunablesMessage extends SerializedBuffer { classifiedAdMaxSize=${this._classifiedAdMaxSize} classifiedAdMaxCountPerPlayer=${this._classifiedAdMaxCountPerPlayer} `; - } + } } diff --git a/packages/transactions/src/_getArcadeCarInfo.ts b/packages/transactions/src/_getArcadeCarInfo.ts index 63b5a7d04..7418a814f 100644 --- a/packages/transactions/src/_getArcadeCarInfo.ts +++ b/packages/transactions/src/_getArcadeCarInfo.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { ArcadeCarInfo, ArcadeCarMessage } from "./ArcadeCarMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -8,28 +8,28 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getArcadeCarInfo({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getArcadeCarInfoMessage = new GenericRequestMessage(); - getArcadeCarInfoMessage.deserialize(packet.data); + const getArcadeCarInfoMessage = new GenericRequestMessage(); + getArcadeCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getArcadeCarInfoMessage.toString()}`); + log.debug(`Received Message: ${getArcadeCarInfoMessage.toString()}`); - const arcadeCarInfoMessage = new ArcadeCarMessage(); - arcadeCarInfoMessage._msgNo = 323; + const arcadeCarInfoMessage = new ArcadeCarMessage(); + arcadeCarInfoMessage._msgNo = 323; - const car1 = new ArcadeCarInfo(); - car1._brandedPartId = 113; // Bel-air - car1._lobbyId = 0; - arcadeCarInfoMessage.addCar(car1); + const car1 = new ArcadeCarInfo(); + car1._brandedPartId = 113; // Bel-air + car1._lobbyId = 0; + arcadeCarInfoMessage.addCar(car1); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(arcadeCarInfoMessage.serialize()); + responsePacket.setBuffer(arcadeCarInfoMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getGameUrls.ts b/packages/transactions/src/_getGameUrls.ts index 71c1a49aa..d1f68e2af 100644 --- a/packages/transactions/src/_getGameUrls.ts +++ b/packages/transactions/src/_getGameUrls.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GameUrl, GameUrlsMessage } from "./GameUrlsMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -8,28 +8,28 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getGameUrls({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getGameUrlsMessage = new GenericRequestMessage(); - getGameUrlsMessage.deserialize(packet.data); + const getGameUrlsMessage = new GenericRequestMessage(); + getGameUrlsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getGameUrlsMessage.toString()}`); + log.debug(`Received Message: ${getGameUrlsMessage.toString()}`); - const gameUrlsMessage = new GameUrlsMessage(); - gameUrlsMessage._msgNo = 364; + const gameUrlsMessage = new GameUrlsMessage(); + gameUrlsMessage._msgNo = 364; - const url1 = new GameUrl(); - url1._urlId = 1; - url1.urlRef = "http://localhost:8080"; - gameUrlsMessage.addURL(url1); + const url1 = new GameUrl(); + url1._urlId = 1; + url1.urlRef = "http://localhost:8080"; + gameUrlsMessage.addURL(url1); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(gameUrlsMessage.serialize()); + responsePacket.setBuffer(gameUrlsMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getOwnedParts.ts b/packages/transactions/src/_getOwnedParts.ts index 0fba03ddc..36305bb21 100644 --- a/packages/transactions/src/_getOwnedParts.ts +++ b/packages/transactions/src/_getOwnedParts.ts @@ -1,39 +1,39 @@ import { - fetchStateFromDatabase, - findSessionByConnectionId, + fetchStateFromDatabase, + findSessionByConnectionId, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PartsAssemblyMessage } from "./PartsAssemblyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getOwnedParts({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getOwnedPartsMessage = new GenericRequestMessage(); - getOwnedPartsMessage.deserialize(packet.data); + const getOwnedPartsMessage = new GenericRequestMessage(); + getOwnedPartsMessage.deserialize(packet.data); - log.debug(`Received Message: ${getOwnedPartsMessage.toString()}`); + log.debug(`Received Message: ${getOwnedPartsMessage.toString()}`); - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const session = findSessionByConnectionId(state, connectionId); + const session = findSessionByConnectionId(state, connectionId); - if (!session) { - throw new ServerError("Session not found"); - } + if (!session) { + throw new ServerError("Session not found"); + } - const ownedPartsMessage = new PartsAssemblyMessage(session.gameId); - ownedPartsMessage._msgNo = 175; + const ownedPartsMessage = new PartsAssemblyMessage(session.gameId); + ownedPartsMessage._msgNo = 175; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(ownedPartsMessage.serialize()); + responsePacket.setBuffer(ownedPartsMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getOwnedVehicles.ts b/packages/transactions/src/_getOwnedVehicles.ts index 3b4b67a0e..eecca051a 100644 --- a/packages/transactions/src/_getOwnedVehicles.ts +++ b/packages/transactions/src/_getOwnedVehicles.ts @@ -1,48 +1,48 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { OwnedVehicle, OwnedVehiclesMessage } from "./OwnedVehiclesMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; const vehicleList = [ - { - personId: 1, - vehicleId: 1, - brandedPartId: 113, - }, + { + personId: 1, + vehicleId: 1, + brandedPartId: 113, + }, ]; export function getVehiclesForPerson(personId: number) { - return vehicleList.filter((vehicle) => vehicle.personId === personId); + return vehicleList.filter((vehicle) => vehicle.personId === personId); } export async function _getOwnedVehicles( - args: MessageHandlerArgs, + args: MessageHandlerArgs, ): Promise { - const getOwnedVehiclesMessage = new GenericRequestMessage(); - getOwnedVehiclesMessage.deserialize(args.packet.data); + const getOwnedVehiclesMessage = new GenericRequestMessage(); + getOwnedVehiclesMessage.deserialize(args.packet.data); - args.log.debug(`Received Message: ${getOwnedVehiclesMessage.toString()}`); + args.log.debug(`Received Message: ${getOwnedVehiclesMessage.toString()}`); - const personId = getOwnedVehiclesMessage.data.readUInt32LE(0); + const personId = getOwnedVehiclesMessage.data.readUInt32LE(0); - const ownedVehiclesMessage = new OwnedVehiclesMessage(); + const ownedVehiclesMessage = new OwnedVehiclesMessage(); - const vehicles = getVehiclesForPerson(personId); + const vehicles = getVehiclesForPerson(personId); - for (const vehicle of vehicles) { - const ownedVehicle = new OwnedVehicle(); - ownedVehicle._vehicleId = vehicle.vehicleId; - ownedVehicle._brandedPartId = vehicle.brandedPartId; - ownedVehiclesMessage.addVehicle(ownedVehicle); - } + for (const vehicle of vehicles) { + const ownedVehicle = new OwnedVehicle(); + ownedVehicle._vehicleId = vehicle.vehicleId; + ownedVehicle._brandedPartId = vehicle.brandedPartId; + ownedVehiclesMessage.addVehicle(ownedVehicle); + } - ownedVehiclesMessage._msgNo = 173; + ownedVehiclesMessage._msgNo = 173; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = args.packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = args.packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(ownedVehiclesMessage.serialize()); + responsePacket.setBuffer(ownedVehiclesMessage.serialize()); - return { connectionId: args.connectionId, messages: [responsePacket] }; + return { connectionId: args.connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getPlayerInfo.ts b/packages/transactions/src/_getPlayerInfo.ts index 39eadcb0d..ecc95a315 100644 --- a/packages/transactions/src/_getPlayerInfo.ts +++ b/packages/transactions/src/_getPlayerInfo.ts @@ -1,33 +1,33 @@ import { ServerError } from "../../shared/errors/ServerError.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerInfoMessage } from "./PlayerInfoMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getPlayerInfo( - args: MessageHandlerArgs, + args: MessageHandlerArgs, ): Promise { - const getPlayerInfoMessage = new GenericRequestMessage(); - getPlayerInfoMessage.deserialize(args.packet.data); + const getPlayerInfoMessage = new GenericRequestMessage(); + getPlayerInfoMessage.deserialize(args.packet.data); - args.log.debug(`Received Message: ${getPlayerInfoMessage.toString()}`); + args.log.debug(`Received Message: ${getPlayerInfoMessage.toString()}`); - const playerId = getPlayerInfoMessage.data.readUInt32LE(0); - try { - const playerInfoMessage = new PlayerInfoMessage(); - playerInfoMessage._msgNo = 108; - playerInfoMessage._playerId = playerId; - playerInfoMessage._playerName = "Drazi Crendraven"; - playerInfoMessage._currentLevel = 1; + const playerId = getPlayerInfoMessage.data.readUInt32LE(0); + try { + const playerInfoMessage = new PlayerInfoMessage(); + playerInfoMessage._msgNo = 108; + playerInfoMessage._playerId = playerId; + playerInfoMessage._playerName = "Drazi Crendraven"; + playerInfoMessage._currentLevel = 1; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = args.packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = args.packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(playerInfoMessage.serialize()); + responsePacket.setBuffer(playerInfoMessage.serialize()); - return { connectionId: args.connectionId, messages: [responsePacket] }; - } catch (error) { - throw ServerError.fromUnknown(error, "Error in _getPlayerInfo"); - } + return { connectionId: args.connectionId, messages: [responsePacket] }; + } catch (error) { + throw ServerError.fromUnknown(error, "Error in _getPlayerInfo"); + } } diff --git a/packages/transactions/src/_getPlayerPhysical.ts b/packages/transactions/src/_getPlayerPhysical.ts index ea29ef719..b470cc9d5 100644 --- a/packages/transactions/src/_getPlayerPhysical.ts +++ b/packages/transactions/src/_getPlayerPhysical.ts @@ -1,29 +1,29 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerPhysicalMessage } from "./PlayerPhysicalMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; export async function _getPlayerPhysical({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getPlayerPhysicalMessage = new GenericRequestMessage(); - getPlayerPhysicalMessage.deserialize(packet.data); + const getPlayerPhysicalMessage = new GenericRequestMessage(); + getPlayerPhysicalMessage.deserialize(packet.data); - log.debug(`Received Message: ${getPlayerPhysicalMessage.toString()}`); + log.debug(`Received Message: ${getPlayerPhysicalMessage.toString()}`); - const playerId = getPlayerPhysicalMessage.data.readUInt32LE(0); + const playerId = getPlayerPhysicalMessage.data.readUInt32LE(0); - const playerPhysicalMessage = new PlayerPhysicalMessage(); - playerPhysicalMessage._msgNo = 265; - playerPhysicalMessage._playerId = playerId; + const playerPhysicalMessage = new PlayerPhysicalMessage(); + playerPhysicalMessage._msgNo = 265; + playerPhysicalMessage._playerId = playerId; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(playerPhysicalMessage.serialize()); + responsePacket.setBuffer(playerPhysicalMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getStockCarInfo.ts b/packages/transactions/src/_getStockCarInfo.ts index 59c862afc..0ccf5da40 100644 --- a/packages/transactions/src/_getStockCarInfo.ts +++ b/packages/transactions/src/_getStockCarInfo.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { StockCar } from "./StockCar.js"; import { StockCarInfoMessage } from "./StockCarInfoMessage.js"; @@ -9,31 +9,31 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getStockCarInfo({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getStockCarInfoMessage = new GenericRequestMessage(); - getStockCarInfoMessage.deserialize(packet.data); + const getStockCarInfoMessage = new GenericRequestMessage(); + getStockCarInfoMessage.deserialize(packet.data); - log.debug(`Received Message: ${getStockCarInfoMessage.toString()}`); + log.debug(`Received Message: ${getStockCarInfoMessage.toString()}`); - const stockCarInfoMessage = new StockCarInfoMessage(200, 0, 105); - stockCarInfoMessage.starterCash = 200; - stockCarInfoMessage.dealerId = 8; - stockCarInfoMessage.brand = 105; + const stockCarInfoMessage = new StockCarInfoMessage(200, 0, 105); + stockCarInfoMessage.starterCash = 200; + stockCarInfoMessage.dealerId = 8; + stockCarInfoMessage.brand = 105; - stockCarInfoMessage.addStockCar(new StockCar(113, 20, false)); // Bel-air - stockCarInfoMessage.addStockCar(new StockCar(104, 15, true)); // Fairlane - Deal of the day - stockCarInfoMessage.addStockCar(new StockCar(402, 20, false)); // Century + stockCarInfoMessage.addStockCar(new StockCar(113, 20, false)); // Bel-air + stockCarInfoMessage.addStockCar(new StockCar(104, 15, true)); // Fairlane - Deal of the day + stockCarInfoMessage.addStockCar(new StockCar(402, 20, false)); // Century - log.debug(`Sending Message: ${stockCarInfoMessage.toString()}`); + log.debug(`Sending Message: ${stockCarInfoMessage.toString()}`); - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(stockCarInfoMessage.serialize()); + responsePacket.setBuffer(stockCarInfoMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_getTunables.ts b/packages/transactions/src/_getTunables.ts index e4ba434ae..a52370ebc 100644 --- a/packages/transactions/src/_getTunables.ts +++ b/packages/transactions/src/_getTunables.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { TunablesMessage } from "./TunablesMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -8,23 +8,23 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _getTunables({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const getTunablesMessage = new GenericRequestMessage(); - getTunablesMessage.deserialize(packet.data); + const getTunablesMessage = new GenericRequestMessage(); + getTunablesMessage.deserialize(packet.data); - log.debug(`Received Message: ${getTunablesMessage.toString()}`); + log.debug(`Received Message: ${getTunablesMessage.toString()}`); - const tunablesMessage = new TunablesMessage(); - tunablesMessage._msgNo = 390; + const tunablesMessage = new TunablesMessage(); + tunablesMessage._msgNo = 390; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; - responsePacket.setBuffer(tunablesMessage.serialize()); + responsePacket.setBuffer(tunablesMessage.serialize()); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/_logout.ts b/packages/transactions/src/_logout.ts index e452b369f..fca6adb26 100644 --- a/packages/transactions/src/_logout.ts +++ b/packages/transactions/src/_logout.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -7,20 +7,20 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function _logout({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 101; - pReply.msgReply = 106; - const rPacket = new OldServerMessage(); - rPacket._header.sequence = packet._header.sequence + 1; - rPacket._header.flags = 8; - rPacket.setBuffer(pReply.serialize()); + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 101; + pReply.msgReply = 106; + const rPacket = new OldServerMessage(); + rPacket._header.sequence = packet._header.sequence + 1; + rPacket._header.flags = 8; + rPacket.setBuffer(pReply.serialize()); - log.debug(`Logout: ${rPacket.toString()}`); + log.debug(`Logout: ${rPacket.toString()}`); - return { connectionId, messages: [rPacket] }; + return { connectionId, messages: [rPacket] }; } diff --git a/packages/transactions/src/clientConnect.ts b/packages/transactions/src/clientConnect.ts index 3437e7008..6ff479f73 100644 --- a/packages/transactions/src/clientConnect.ts +++ b/packages/transactions/src/clientConnect.ts @@ -1,17 +1,17 @@ import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { - createCommandEncryptionPair, - createDataEncryptionPair, + createCommandEncryptionPair, + createDataEncryptionPair, } from "../../gateway/src/encryption.js"; import { - McosEncryption, - McosSession, - addEncryption, - addSession, - fetchStateFromDatabase, - getEncryption, + McosEncryption, + McosSession, + addEncryption, + addSession, + fetchStateFromDatabase, + getEncryption, } from "../../shared/State.js"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericReply } from "./GenericReplyMessage.js"; import { TClientConnectMessage } from "./TClientConnectMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -21,81 +21,81 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function clientConnect({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - /** - * Let's turn it into a ClientConnectMsg - */ - const newMessage = new TClientConnectMessage(); + /** + * Let's turn it into a ClientConnectMsg + */ + const newMessage = new TClientConnectMessage(); - newMessage.deserialize(packet.serialize()); + newMessage.deserialize(packet.serialize()); - log.debug(`ClientConnectMsg: ${newMessage.toString()}`); + log.debug(`ClientConnectMsg: ${newMessage.toString()}`); - const customerId = newMessage._customerId; - if (typeof customerId !== "number") { - throw new TypeError( - `customerId is wrong type. Expected 'number', got ${typeof customerId}`, - ); - } + const customerId = newMessage._customerId; + if (typeof customerId !== "number") { + throw new TypeError( + `customerId is wrong type. Expected 'number', got ${typeof customerId}`, + ); + } - const state = fetchStateFromDatabase(); + const state = fetchStateFromDatabase(); - const existingEncryption = getEncryption(state, connectionId); + const existingEncryption = getEncryption(state, connectionId); - if (existingEncryption) { - log.debug("Encryption already exists for this connection"); - return { connectionId, messages: [] }; - } + if (existingEncryption) { + log.debug("Encryption already exists for this connection"); + return { connectionId, messages: [] }; + } - let result; + let result; - log.debug(`Looking up the session key for ${customerId}...`); + log.debug(`Looking up the session key for ${customerId}...`); - result = await getDatabaseServer({ - log, - }).fetchSessionKeyByCustomerId(customerId); - log.debug(`Session key found for ${customerId}`); + result = await getDatabaseServer({ + log, + }).fetchSessionKeyByCustomerId(customerId); + log.debug(`Session key found for ${customerId}`); - const newCommandEncryptionPair = createCommandEncryptionPair( - result.sessionKey, - ); + const newCommandEncryptionPair = createCommandEncryptionPair( + result.sessionKey, + ); - const newDataEncryptionPair = createDataEncryptionPair(result.sessionKey); + const newDataEncryptionPair = createDataEncryptionPair(result.sessionKey); - const newEncryption = new McosEncryption({ - connectionId, - commandEncryptionPair: newCommandEncryptionPair, - dataEncryptionPair: newDataEncryptionPair, - }); + const newEncryption = new McosEncryption({ + connectionId, + commandEncryptionPair: newCommandEncryptionPair, + dataEncryptionPair: newDataEncryptionPair, + }); - const updatedState = addEncryption(state, newEncryption); + const updatedState = addEncryption(state, newEncryption); - const session = new McosSession({ - connectionId, - gameId: newMessage._personaId, - }); + const session = new McosSession({ + connectionId, + gameId: newMessage._personaId, + }); - addSession(updatedState, session).save(); + addSession(updatedState, session).save(); - const personaId = newMessage._personaId; + const personaId = newMessage._personaId; - const personaName = newMessage._personaName; + const personaName = newMessage._personaName; - log.debug(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); + log.debug(`cust: ${customerId} ID: ${personaId} Name: ${personaName}`); - // Create new response packet - const pReply = new GenericReply(); - pReply.msgNo = 101; - pReply.msgReply = newMessage._msgNo; + // Create new response packet + const pReply = new GenericReply(); + pReply.msgNo = 101; + pReply.msgReply = newMessage._msgNo; - const responsePacket = new OldServerMessage(); - responsePacket.setBuffer(pReply.serialize()); - responsePacket._header.sequence = packet._header.sequence; + const responsePacket = new OldServerMessage(); + responsePacket.setBuffer(pReply.serialize()); + responsePacket._header.sequence = packet._header.sequence; - log.debug(`Response: ${responsePacket.serialize().toString("hex")}`); + log.debug(`Response: ${responsePacket.serialize().toString("hex")}`); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/getLobbies.ts b/packages/transactions/src/getLobbies.ts index cc95b0b4d..6049ea13d 100644 --- a/packages/transactions/src/getLobbies.ts +++ b/packages/transactions/src/getLobbies.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { EntryFeePurseMessage, PurseEntry } from "./EntryFeePurseMessage.js"; import { LobbyInfo, LobbyMessage } from "./LobbyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -9,82 +9,82 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; */ async function _getLobbies({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - log.debug("In _getLobbies..."); + log.debug("In _getLobbies..."); - log.debug(`Received Message: ${packet.toString()}`); + log.debug(`Received Message: ${packet.toString()}`); - // Create new response packet - const lobbiesResponsePacket = new OldServerMessage(); - lobbiesResponsePacket._header.sequence = packet._header.sequence; - lobbiesResponsePacket._header.flags = 8; + // Create new response packet + const lobbiesResponsePacket = new OldServerMessage(); + lobbiesResponsePacket._header.sequence = packet._header.sequence; + lobbiesResponsePacket._header.flags = 8; - const lobbyResponse = new LobbyMessage(); - lobbyResponse._msgNo = 325; - lobbyResponse._shouldExpectMoreMessages = false; + const lobbyResponse = new LobbyMessage(); + lobbyResponse._msgNo = 325; + lobbyResponse._shouldExpectMoreMessages = false; - const lobby = new LobbyInfo(); - lobby._lobbyId = 1; - lobby._lobbyName = "Lobby 1"; - lobby._topDog = "Drazi Crendraven"; + const lobby = new LobbyInfo(); + lobby._lobbyId = 1; + lobby._lobbyName = "Lobby 1"; + lobby._topDog = "Drazi Crendraven"; - log.debug(`Logging LobbyInfo: ${lobby.serialize().toString("hex")}`); + log.debug(`Logging LobbyInfo: ${lobby.serialize().toString("hex")}`); - lobbyResponse.addLobby(lobby); + lobbyResponse.addLobby(lobby); - log.debug( - `Logging LobbyMessage: ${lobbyResponse.serialize().toString("hex")}`, - ); + log.debug( + `Logging LobbyMessage: ${lobbyResponse.serialize().toString("hex")}`, + ); - lobbiesResponsePacket.setBuffer(lobbyResponse.serialize()); + lobbiesResponsePacket.setBuffer(lobbyResponse.serialize()); - // Handle purse entries - const purseEntry = new PurseEntry(); - purseEntry._entryFee = 100; - purseEntry._purse = 1000; + // Handle purse entries + const purseEntry = new PurseEntry(); + purseEntry._entryFee = 100; + purseEntry._purse = 1000; - const perseEntryResponse = new EntryFeePurseMessage(); - perseEntryResponse._msgNo = 408; - perseEntryResponse._shouldExpectMoreMessages = false; - perseEntryResponse.addEntry(purseEntry); + const perseEntryResponse = new EntryFeePurseMessage(); + perseEntryResponse._msgNo = 408; + perseEntryResponse._shouldExpectMoreMessages = false; + perseEntryResponse.addEntry(purseEntry); - log.debug( - `Logging EntryFeePurseMessage: ${perseEntryResponse - .serialize() - .toString("hex")}`, - ); + log.debug( + `Logging EntryFeePurseMessage: ${perseEntryResponse + .serialize() + .toString("hex")}`, + ); - const perseEntriesResponsePacket = new OldServerMessage(); - perseEntriesResponsePacket._header.sequence = packet._header.sequence; - perseEntriesResponsePacket._header.flags = 8; + const perseEntriesResponsePacket = new OldServerMessage(); + perseEntriesResponsePacket._header.sequence = packet._header.sequence; + perseEntriesResponsePacket._header.flags = 8; - perseEntriesResponsePacket.setBuffer(perseEntryResponse.serialize()); + perseEntriesResponsePacket.setBuffer(perseEntryResponse.serialize()); - return { - connectionId, - messages: [lobbiesResponsePacket, perseEntriesResponsePacket], - }; + return { + connectionId, + messages: [lobbiesResponsePacket, perseEntriesResponsePacket], + }; } /** * @param {MessageHandlerArgs} args * @return {Promise} */ export async function getLobbies({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - const result = await _getLobbies({ connectionId, packet, log }); - log.debug("Dumping Lobbies response packet..."); - result.messages.forEach((msg) => { - log.debug(msg.toString()); - }); - log.debug(result.messages.join().toString()); - return { - connectionId, - messages: result.messages, - }; + const result = await _getLobbies({ connectionId, packet, log }); + log.debug("Dumping Lobbies response packet..."); + result.messages.forEach((msg) => { + log.debug(msg.toString()); + }); + log.debug(result.messages.join().toString()); + return { + connectionId, + messages: result.messages, + }; } diff --git a/packages/transactions/src/handlers.ts b/packages/transactions/src/handlers.ts index 3fda4234a..9cc368b1d 100644 --- a/packages/transactions/src/handlers.ts +++ b/packages/transactions/src/handlers.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { ServerMessage } from "../../shared/src/ServerMessage.js"; import { _getArcadeCarInfo } from "./_getArcadeCarInfo.js"; import { _getGameUrls } from "./_getGameUrls.js"; @@ -32,76 +32,76 @@ import { login } from "./login.js"; import { trackingPing } from "./trackingPing.js"; export interface MessageHandlerArgs { - connectionId: string; - packet: OldServerMessage; - log: import("pino").Logger; + connectionId: string; + packet: OldServerMessage; + log: import("pino").Logger; } export interface MessageHandlerResult { - connectionId: string; - messages: OldServerMessage[] | ServerMessage[]; + connectionId: string; + messages: OldServerMessage[] | ServerMessage[]; } export interface MessageHandler { - name: string; - handler: (args: MessageHandlerArgs) => Promise; + name: string; + handler: (args: MessageHandlerArgs) => Promise; } export const messageHandlers: MessageHandler[] = [ - { - name: "MC_TRACKING_MSG", - handler: trackingPing, - }, - { - name: "MC_CLIENT_CONNECT_MSG", - handler: clientConnect, - }, - { - name: "MC_LOGIN", - handler: login, - }, - { - name: "MC_LOGOUT", - handler: _logout, - }, - { - name: "MC_GET_LOBBIES", - handler: getLobbies, - }, - { - name: "MC_STOCK_CAR_INFO", - handler: _getStockCarInfo, - }, - { - name: "MC_GET_ARCADE_CARS", - handler: _getArcadeCarInfo, - }, - { - name: "MC_GET_GAME_URLS", - handler: _getGameUrls, - }, - { - name: "MC_GET_MCO_TUNABLES", - handler: _getTunables, - }, - { - name: "MC_GET_OWNED_VEHICLES", - handler: _getOwnedVehicles, - }, - { - name: "MC_GET_PLAYER_INFO", - handler: _getPlayerInfo, - }, - { - name: "MC_GET_PLAYER_PHYSICAL", - handler: _getPlayerPhysical, - }, - { - name: "MC_GET_OWNED_PARTS", - handler: _getOwnedParts, - }, - { - name: "MC_GET_PLAYER_RACING_HISTORY", - handler: _getPlayerRaceHistory, - }, + { + name: "MC_TRACKING_MSG", + handler: trackingPing, + }, + { + name: "MC_CLIENT_CONNECT_MSG", + handler: clientConnect, + }, + { + name: "MC_LOGIN", + handler: login, + }, + { + name: "MC_LOGOUT", + handler: _logout, + }, + { + name: "MC_GET_LOBBIES", + handler: getLobbies, + }, + { + name: "MC_STOCK_CAR_INFO", + handler: _getStockCarInfo, + }, + { + name: "MC_GET_ARCADE_CARS", + handler: _getArcadeCarInfo, + }, + { + name: "MC_GET_GAME_URLS", + handler: _getGameUrls, + }, + { + name: "MC_GET_MCO_TUNABLES", + handler: _getTunables, + }, + { + name: "MC_GET_OWNED_VEHICLES", + handler: _getOwnedVehicles, + }, + { + name: "MC_GET_PLAYER_INFO", + handler: _getPlayerInfo, + }, + { + name: "MC_GET_PLAYER_PHYSICAL", + handler: _getPlayerPhysical, + }, + { + name: "MC_GET_OWNED_PARTS", + handler: _getOwnedParts, + }, + { + name: "MC_GET_PLAYER_RACING_HISTORY", + handler: _getPlayerRaceHistory, + }, ]; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index e67e0d874..32e4859d4 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -16,17 +16,15 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { - fetchStateFromDatabase, - getEncryption, - updateEncryption, + fetchStateFromDatabase, + getEncryption, + updateEncryption, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; // eslint-disable-next-line no-unused-vars -import { - OldServerMessage, - SerializedBuffer, -} from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; +import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { ServerMessage } from "../../shared/src/ServerMessage.js"; import { messageHandlers } from "./handlers.js"; @@ -37,9 +35,9 @@ import { messageHandlers } from "./handlers.js"; * @return {boolean} */ function isMessageEncrypted( - message: OldServerMessage | ServerMessage, + message: OldServerMessage | ServerMessage, ): boolean { - return message._header.flags - 8 >= 0; + return message._header.flags - 8 >= 0; } /** @@ -49,38 +47,38 @@ function isMessageEncrypted( * @return {string} */ function _MSG_STRING(messageID: number): string { - const messageIds = [ - { id: 105, name: "MC_LOGIN" }, // 0x69 - { id: 106, name: "MC_LOGOUT" }, // 0x6a - { id: 108, name: "MC_GET_PLAYER_INFO" }, // 0x6c - { id: 109, name: "MC_SET_OPTIONS" }, // 0x6d - { id: 122, name: "MC_PLAYER_INFO" }, // 0x7a"} - { id: 141, name: "MC_STOCK_CAR_INFO" }, // 0x8d - { id: 172, name: "MC_GET_OWNED_VEHICLES" }, // 0xac"} - { id: 173, name: "MC_OWNED_VEHICLES_LIST" }, // 0xad"} - { id: 174, name: "MC_GET_OWNED_PARTS" }, // 0xae"} - { id: 213, name: "MC_LOGIN_COMPLETE" }, // 0xd5 - { id: 264, name: "MC_GET_PLAYER_PHYSICAL" }, // 0x108 - { id: 265, name: "MC_PLAYER_PHYSICAL_INFO" }, // 0x109 - { id: 363, name: "MC_GET_GAME_URLS" }, // 0x16b"} - { id: 266, name: "MC_UPDATE_PLAYER_PHYSICAL" }, // 0x10a - { id: 322, name: "MC_GET_ARCADE_CARS" }, // 0x142"} - { id: 324, name: "MC_GET_LOBBIES" }, // 0x144 - { id: 325, name: "MC_LOBBIES" }, // 0x145 - { id: 361, name: "MC_GET_PLAYER_RACING_HISTORY" }, // 0x169"} - { id: 362, name: "MC_PLAYER_RACING_HISTORY" }, // 0x16a"} - { id: 389, name: "MC_GET_MCO_TUNABLES" }, // 0x185"} - { id: 391, name: "MC_CLUB_GET_INVITATIONS" }, // 0x187 - { id: 438, name: "MC_CLIENT_CONNECT_MSG" }, // 0x1b6 - { id: 440, name: "MC_TRACKING_MSG" }, - ]; - const result = messageIds.find((id) => id.id === messageID); - - if (typeof result !== "undefined") { - return result.name; - } - - return "Unknown"; + const messageIds = [ + { id: 105, name: "MC_LOGIN" }, // 0x69 + { id: 106, name: "MC_LOGOUT" }, // 0x6a + { id: 108, name: "MC_GET_PLAYER_INFO" }, // 0x6c + { id: 109, name: "MC_SET_OPTIONS" }, // 0x6d + { id: 122, name: "MC_PLAYER_INFO" }, // 0x7a"} + { id: 141, name: "MC_STOCK_CAR_INFO" }, // 0x8d + { id: 172, name: "MC_GET_OWNED_VEHICLES" }, // 0xac"} + { id: 173, name: "MC_OWNED_VEHICLES_LIST" }, // 0xad"} + { id: 174, name: "MC_GET_OWNED_PARTS" }, // 0xae"} + { id: 213, name: "MC_LOGIN_COMPLETE" }, // 0xd5 + { id: 264, name: "MC_GET_PLAYER_PHYSICAL" }, // 0x108 + { id: 265, name: "MC_PLAYER_PHYSICAL_INFO" }, // 0x109 + { id: 363, name: "MC_GET_GAME_URLS" }, // 0x16b"} + { id: 266, name: "MC_UPDATE_PLAYER_PHYSICAL" }, // 0x10a + { id: 322, name: "MC_GET_ARCADE_CARS" }, // 0x142"} + { id: 324, name: "MC_GET_LOBBIES" }, // 0x144 + { id: 325, name: "MC_LOBBIES" }, // 0x145 + { id: 361, name: "MC_GET_PLAYER_RACING_HISTORY" }, // 0x169"} + { id: 362, name: "MC_PLAYER_RACING_HISTORY" }, // 0x16a"} + { id: 389, name: "MC_GET_MCO_TUNABLES" }, // 0x185"} + { id: 391, name: "MC_CLUB_GET_INVITATIONS" }, // 0x187 + { id: 438, name: "MC_CLIENT_CONNECT_MSG" }, // 0x1b6 + { id: 440, name: "MC_TRACKING_MSG" }, + ]; + const result = messageIds.find((id) => id.id === messageID); + + if (typeof result !== "undefined") { + return result.name; + } + + return "Unknown"; } /** @@ -89,42 +87,44 @@ function _MSG_STRING(messageID: number): string { * @returns {Promise} */ async function processInput({ - connectionId, - packet, - log = getServerLogger({ - module: "transactionServer", - }), + connectionId, + packet, + log = getServerLogger({ + module: "transactionServer", + }), }: import("./handlers.js").MessageHandlerArgs): Promise< - import("./handlers.js").MessageHandlerResult + import("./handlers.js").MessageHandlerResult > { - const currentMessageNo = packet._msgNo; - const currentMessageString = _MSG_STRING(currentMessageNo); - - log.debug( - `We are attempting to process a message with id ${currentMessageNo}(${currentMessageString})`, - ); - - const result = messageHandlers.find( - (msg) => msg.name === currentMessageString, - ); - - if (typeof result !== "undefined") { - try { - const responsePackets = await result.handler({ - connectionId, - packet, - log, - }); - return responsePackets; - } catch (error) { - const err = new ServerError(`Error handling packet: ${String(error)}`); - throw err; - } - } - - throw new ServerError( - `Message Number Not Handled: ${currentMessageNo} (${currentMessageString}`, - ); + const currentMessageNo = packet._msgNo; + const currentMessageString = _MSG_STRING(currentMessageNo); + + log.debug( + `We are attempting to process a message with id ${currentMessageNo}(${currentMessageString})`, + ); + + const result = messageHandlers.find( + (msg) => msg.name === currentMessageString, + ); + + if (typeof result !== "undefined") { + try { + const responsePackets = await result.handler({ + connectionId, + packet, + log, + }); + return responsePackets; + } catch (error) { + const err = new ServerError( + `Error handling packet: ${String(error)}`, + ); + throw err; + } + } + + throw new ServerError( + `Message Number Not Handled: ${currentMessageNo} (${currentMessageString}`, + ); } /** @@ -138,131 +138,144 @@ async function processInput({ * }>} */ export async function receiveTransactionsData({ - connectionId, - message, - log = getServerLogger({ - module: "transactionServer", - }), + connectionId, + message, + log = getServerLogger({ + module: "transactionServer", + }), }: { - connectionId: string; - message: SerializedBuffer; - log?: import("pino").Logger; + connectionId: string; + message: SerializedBuffer; + log?: import("pino").Logger; }): Promise<{ - connectionId: string; - messages: SerializedBuffer[]; + connectionId: string; + messages: SerializedBuffer[]; }> { - log.level = getServerConfiguration({}).logLevel ?? "info"; - - log.debug(`Received Transaction Server packet: ${connectionId}`); + log.level = getServerConfiguration({}).logLevel ?? "info"; - // Going to use ServerMessage in this module + log.debug(`Received Transaction Server packet: ${connectionId}`); - const inboundMessage = new OldServerMessage(); - inboundMessage._doDeserialize(message.data); - log.debug(`Received Transaction Server packet: ${inboundMessage.toString()}`); + // Going to use ServerMessage in this module - // Is the message encrypted? - if (isMessageEncrypted(inboundMessage)) { - log.debug("Message is encrypted"); - // Get the encryyption settings for this connection - const state = fetchStateFromDatabase(); - - const encryptionSettings = getEncryption(state, connectionId); - - if (typeof encryptionSettings === "undefined") { - throw new ServerError( - `Unable to locate encryption settings for connection ${connectionId}`, - ); - } - - // log the old buffer - log.debug(`Encrypted buffer: ${inboundMessage.data.toString("hex")}`); - - try { - const decryptedMessage = encryptionSettings.dataEncryption.decrypt( - inboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(inboundMessage.data, decryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - log.debug(`Decrypted buffer: ${decryptedMessage.toString("hex")}`); - - inboundMessage.setBuffer(decryptedMessage); - inboundMessage._header.flags -= 8; - inboundMessage.updateMsgNo(); - - log.debug(`Decrypted message: ${inboundMessage.toString()}`); - } catch (error) { - throw new ServerError(`Unable to decrypt message: ${String(error)}`); - } - } - - log.debug("Calling processInput()"); - const response = await processInput({ - connectionId, - packet: inboundMessage, - log, - }); - - // Loop through the outbound messages and encrypt them - const outboundMessages: SerializedBuffer[] = []; - - response.messages.forEach((outboundMessage) => { - log.debug(`Outbound message: ${outboundMessage.toString()}`); - - if (isMessageEncrypted(outboundMessage)) { - const state = fetchStateFromDatabase(); - - const encryptionSettings = getEncryption(state, connectionId); - - if (typeof encryptionSettings === "undefined") { - throw new ServerError( - `Unable to locate encryption settings for connection ${connectionId}`, - ); - } - - // log the old buffer - log.debug(`Outbound buffer: ${outboundMessage.data.toString("hex")}`); - - try { - const encryptedMessage = encryptionSettings.dataEncryption.encrypt( - outboundMessage.data, - ); - updateEncryption(state, encryptionSettings).save(); - - // Verify the length of the message - verifyLength(outboundMessage.data, encryptedMessage); - - // Assuming the message was decrypted successfully, update the buffer - - log.debug(`Encrypted buffer: ${encryptedMessage.toString("hex")}`); - - outboundMessage.setBuffer(encryptedMessage); - - log.debug(`Encrypted message: ${outboundMessage.toString()}`); - - const outboundRawMessage = new SerializedBuffer(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); - log.debug(`Encrypted message: ${outboundRawMessage.toString()}`); - outboundMessages.push(outboundRawMessage); - } catch (error) { - throw new ServerError(`Unable to encrypt message: ${String(error)}`); - } - } else { - const outboundRawMessage = new SerializedBuffer(); - outboundRawMessage.setBuffer(outboundMessage.serialize()); - log.debug(`Outbound message: ${outboundRawMessage.toString()}`); - outboundMessages.push(outboundRawMessage); - } - }); - - return { - connectionId, - messages: outboundMessages, - }; + const inboundMessage = new OldServerMessage(); + inboundMessage._doDeserialize(message.data); + log.debug( + `Received Transaction Server packet: ${inboundMessage.toString()}`, + ); + + // Is the message encrypted? + if (isMessageEncrypted(inboundMessage)) { + log.debug("Message is encrypted"); + // Get the encryyption settings for this connection + const state = fetchStateFromDatabase(); + + const encryptionSettings = getEncryption(state, connectionId); + + if (typeof encryptionSettings === "undefined") { + throw new ServerError( + `Unable to locate encryption settings for connection ${connectionId}`, + ); + } + + // log the old buffer + log.debug(`Encrypted buffer: ${inboundMessage.data.toString("hex")}`); + + try { + const decryptedMessage = encryptionSettings.dataEncryption.decrypt( + inboundMessage.data, + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(inboundMessage.data, decryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + log.debug(`Decrypted buffer: ${decryptedMessage.toString("hex")}`); + + inboundMessage.setBuffer(decryptedMessage); + inboundMessage._header.flags -= 8; + inboundMessage.updateMsgNo(); + + log.debug(`Decrypted message: ${inboundMessage.toString()}`); + } catch (error) { + throw new ServerError( + `Unable to decrypt message: ${String(error)}`, + ); + } + } + + log.debug("Calling processInput()"); + const response = await processInput({ + connectionId, + packet: inboundMessage, + log, + }); + + // Loop through the outbound messages and encrypt them + const outboundMessages: SerializedBuffer[] = []; + + response.messages.forEach((outboundMessage) => { + log.debug(`Outbound message: ${outboundMessage.toString()}`); + + if (isMessageEncrypted(outboundMessage)) { + const state = fetchStateFromDatabase(); + + const encryptionSettings = getEncryption(state, connectionId); + + if (typeof encryptionSettings === "undefined") { + throw new ServerError( + `Unable to locate encryption settings for connection ${connectionId}`, + ); + } + + // log the old buffer + log.debug( + `Outbound buffer: ${outboundMessage.data.toString("hex")}`, + ); + + try { + const encryptedMessage = + encryptionSettings.dataEncryption.encrypt( + outboundMessage.data, + ); + updateEncryption(state, encryptionSettings).save(); + + // Verify the length of the message + verifyLength(outboundMessage.data, encryptedMessage); + + // Assuming the message was decrypted successfully, update the buffer + + log.debug( + `Encrypted buffer: ${encryptedMessage.toString("hex")}`, + ); + + outboundMessage.setBuffer(encryptedMessage); + + log.debug(`Encrypted message: ${outboundMessage.toString()}`); + + const outboundRawMessage = new SerializedBuffer(); + outboundRawMessage.setBuffer(outboundMessage.serialize()); + log.debug( + `Encrypted message: ${outboundRawMessage.toString()}`, + ); + outboundMessages.push(outboundRawMessage); + } catch (error) { + throw new ServerError( + `Unable to encrypt message: ${String(error)}`, + ); + } + } else { + const outboundRawMessage = new SerializedBuffer(); + outboundRawMessage.setBuffer(outboundMessage.serialize()); + log.debug(`Outbound message: ${outboundRawMessage.toString()}`); + outboundMessages.push(outboundRawMessage); + } + }); + + return { + connectionId, + messages: outboundMessages, + }; } /** @@ -270,9 +283,9 @@ export async function receiveTransactionsData({ * @param {Buffer} buffer2 */ export function verifyLength(buffer: Buffer, buffer2: Buffer) { - if (buffer.length !== buffer2.length) { - throw new ServerError( - `Length mismatch: ${buffer.length} !== ${buffer2.length}`, - ); - } + if (buffer.length !== buffer2.length) { + throw new ServerError( + `Length mismatch: ${buffer.length} !== ${buffer2.length}`, + ); + } } diff --git a/packages/transactions/src/login.ts b/packages/transactions/src/login.ts index eaaf2f0d3..982fb6ab7 100644 --- a/packages/transactions/src/login.ts +++ b/packages/transactions/src/login.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { TLoginMessage } from "./TLoginMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -8,25 +8,25 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function login({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Read the inbound packet - const loginMessage = new TLoginMessage(); - loginMessage.deserialize(packet.serialize()); - log.debug(`Received LoginMessage: ${loginMessage.toString()}`); + // Read the inbound packet + const loginMessage = new TLoginMessage(); + loginMessage.deserialize(packet.serialize()); + log.debug(`Received LoginMessage: ${loginMessage.toString()}`); - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 213; - pReply.msgReply = 105; - const responsePacket = new OldServerMessage(); - responsePacket._header.sequence = packet._header.sequence; - responsePacket._header.flags = 8; - responsePacket.setBuffer(pReply.serialize()); + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 213; + pReply.msgReply = 105; + const responsePacket = new OldServerMessage(); + responsePacket._header.sequence = packet._header.sequence; + responsePacket._header.flags = 8; + responsePacket.setBuffer(pReply.serialize()); - log.debug(`Response: ${responsePacket.toString()}`); + log.debug(`Response: ${responsePacket.toString()}`); - return { connectionId, messages: [responsePacket] }; + return { connectionId, messages: [responsePacket] }; } diff --git a/packages/transactions/src/trackingPing.ts b/packages/transactions/src/trackingPing.ts index accf4f30e..9f6a8dec8 100644 --- a/packages/transactions/src/trackingPing.ts +++ b/packages/transactions/src/trackingPing.ts @@ -1,4 +1,4 @@ -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericReplyMessage } from "./GenericReplyMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; @@ -7,21 +7,21 @@ import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; * @return {Promise} */ export async function trackingPing({ - connectionId, - packet, - log, + connectionId, + packet, + log, }: MessageHandlerArgs): Promise { - // Create new response packet - const pReply = new GenericReplyMessage(); - pReply.msgNo = 101; - pReply.msgReply = 440; - const rPacket = new OldServerMessage(); - rPacket._header.sequence = packet._header.sequence; - rPacket._header.flags = 8; + // Create new response packet + const pReply = new GenericReplyMessage(); + pReply.msgNo = 101; + pReply.msgReply = 440; + const rPacket = new OldServerMessage(); + rPacket._header.sequence = packet._header.sequence; + rPacket._header.flags = 8; - rPacket.setBuffer(pReply.serialize()); + rPacket.setBuffer(pReply.serialize()); - log.debug(`TrackingPing: ${rPacket.toString()}`); + log.debug(`TrackingPing: ${rPacket.toString()}`); - return { connectionId, messages: [] }; + return { connectionId, messages: [] }; } From 4a93d9116e62bce274a27643d8e47cfda658c222 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 05:33:03 -0400 Subject: [PATCH 33/84] refactor: Update ServerMessage.ts to use the updated getServerLogger function --- packages/shared-packets/src/ServerMessage.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts index 254ee1f10..971496cff 100644 --- a/packages/shared-packets/src/ServerMessage.ts +++ b/packages/shared-packets/src/ServerMessage.ts @@ -2,7 +2,7 @@ import { McosEncryptionPair, getServerLogger } from "rusty-motors-shared"; import { BasePacket, Serializable } from "./BasePacket.js"; import type { IMessage, ISerializable } from "./interfaces.js"; -const log = getServerLogger(); +const log = getServerLogger({}); /** * From d32edfbc44715395b70e8e98ba4b495833d3b1f0 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 05:34:00 -0400 Subject: [PATCH 34/84] refactor: Update ClientConnectMessage and utils to improve deserialization logic closes **Add test coverage for `ClientConnectionMessage`.** #2076 --- .../payloads/ClientConnectMessage.test.ts | 41 ++++++++++++++ .../mcots/payloads/ClientConnectMessage.ts | 7 ++- packages/mcots/payloads/utils.test.ts | 56 +++++++++++++++++++ packages/mcots/payloads/utils.ts | 15 +++++ 4 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 packages/mcots/payloads/ClientConnectMessage.test.ts create mode 100644 packages/mcots/payloads/utils.test.ts create mode 100644 packages/mcots/payloads/utils.ts diff --git a/packages/mcots/payloads/ClientConnectMessage.test.ts b/packages/mcots/payloads/ClientConnectMessage.test.ts new file mode 100644 index 000000000..e06bb786e --- /dev/null +++ b/packages/mcots/payloads/ClientConnectMessage.test.ts @@ -0,0 +1,41 @@ +import { describe, it, expect } from "vitest"; +import { ClientConnectionMessage } from "./ClientConnectMessage"; + +describe("ClientConnectionMessage", () => { + it("should deserialize the data correctly", () => { + // arrange + const size = 40; + const data = Buffer.alloc(size); + data.writeUInt16LE(123, 0); // messageId + data.writeUInt32LE(456, 2); // customerId + data.writeUInt32LE(789, 6); // personaId + data.write("Test Customer", 10, 13, "ascii"); // customerName + data.write("Test Persona", 23, 13, "ascii"); // personaName + data.writeUInt32LE(1, 36); // clientVersion + + const message = new ClientConnectionMessage(size); + + // act + const result = message.deserialize(data); + + // assert + expect(result).toBeInstanceOf(ClientConnectionMessage); + expect(result.getByteSize()).toBe(size); + expect(result.getMessageId()).toBe(123); + expect(result.getCustomerId()).toBe(456); + expect(result.getPersonaId()).toBe(789); + expect(result.getCustomerName()).toBe("Test Customer"); + expect(result.getPersonaName()).toBe("Test Persona"); + expect(result.getClientVersion()).toBe(1); + }); + + it("should throw an error if there is not enough data to deserialize", () => { + // arrange + const size = 40; + const data = Buffer.alloc(size - 1); // less than required size + const message = new ClientConnectionMessage(size); + + // act/assert + expect(() => message.deserialize(data)).toThrowError(); + }); +}); diff --git a/packages/mcots/payloads/ClientConnectMessage.ts b/packages/mcots/payloads/ClientConnectMessage.ts index 7ce240c8f..fc4102a95 100644 --- a/packages/mcots/payloads/ClientConnectMessage.ts +++ b/packages/mcots/payloads/ClientConnectMessage.ts @@ -1,7 +1,8 @@ import { getServerLogger } from "rusty-motors-shared"; import { ServerMessagePayload } from "rusty-motors-shared-packets"; +import { readStringFromBuffer } from "./utils"; -const log = getServerLogger(); +const log = getServerLogger({}); export class ClientConnectionMessage extends ServerMessagePayload { private _customerId: number = 0; // 4 bytes @@ -30,9 +31,9 @@ export class ClientConnectionMessage extends ServerMessagePayload { this._personaId = data.readUInt32LE(6); - this._customerName = data.toString("utf8", 10, 23); + this._customerName = readStringFromBuffer(data, 10, 23); - this._personaName = data.toString("utf8", 23, 36); + this._personaName = readStringFromBuffer(data, 23, 36); this._clientVersion = data.readUInt32LE(36); diff --git a/packages/mcots/payloads/utils.test.ts b/packages/mcots/payloads/utils.test.ts new file mode 100644 index 000000000..a183bc93d --- /dev/null +++ b/packages/mcots/payloads/utils.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, it } from "vitest"; +import { readStringFromBuffer } from "./utils"; + +describe("readStringFromBuffer", () => { + it("should read a string from the buffer", () => { + // arrange + const data = Buffer.from("Hello, World!\0Extra Data"); + const start = 0; + const end = 13; + + // act + const result = readStringFromBuffer(data, start, end); + + // assert + expect(result).toBe("Hello, World!"); + }); + + it("should handle empty strings", () => { + // arrange + const data = Buffer.from("\0"); + const start = 0; + const end = 1; + + // act + const result = readStringFromBuffer(data, start, end); + + // assert + expect(result).toBe(""); + }); + + it("should handle strings with null characters", () => { + // arrange + const data = Buffer.from("Test\0String\0"); + const start = 0; + const end = 12; + + // act + const result = readStringFromBuffer(data, start, end); + + // assert + expect(result).toBe("TestString"); + }); + + it("should handle start and end indices outside the buffer range", () => { + // arrange + const data = Buffer.from("Hello, World!"); + const start = -1; + const end = 20; + + // act + const result = readStringFromBuffer(data, start, end); + + // assert + expect(result).toBe("Hello, World!"); + }); +}); diff --git a/packages/mcots/payloads/utils.ts b/packages/mcots/payloads/utils.ts new file mode 100644 index 000000000..beacd6334 --- /dev/null +++ b/packages/mcots/payloads/utils.ts @@ -0,0 +1,15 @@ +/** + * Reads a string from a buffer. + * + * @param data - The buffer containing the string. + * @param start - The starting index of the string in the buffer. + * @param end - The ending index of the string in the buffer. + * @returns The extracted string from the buffer. + */ +export function readStringFromBuffer( + data: Buffer, + start: number, + end: number, +): string { + return data.toString("ascii", start, end).replace(/\0/g, ""); +} From 76b3c05e01da7ca24039ebbfaa69da8bd4501034 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 06:18:52 -0400 Subject: [PATCH 35/84] fix: add back database package --- .github/workflows/node.yml | 2 +- Makefile | 6 +- package.json | 4 + packages/database/index.ts | 13 + packages/database/package.json | 65 +- packages/database/src/DatabaseManager.ts | 226 +- .../src/__generated__/abstract_part_type.ts | 109 + .../atdatabases_migrations_applied.ts | 37 + .../atdatabases_migrations_version.ts | 21 + .../src/__generated__/attachment_point.ts | 21 + packages/database/src/__generated__/brand.ts | 31 + .../src/__generated__/branded_part.ts | 42 + .../src/__generated__/driver_class.ts | 21 + packages/database/src/__generated__/index.ts | 118 + packages/database/src/__generated__/key.ts | 23 + packages/database/src/__generated__/login.ts | 33 + packages/database/src/__generated__/model.ts | 75 + packages/database/src/__generated__/part.ts | 52 + .../database/src/__generated__/part_grade.ts | 27 + .../database/src/__generated__/part_type.ts | 30 + packages/database/src/__generated__/player.ts | 282 +++ .../database/src/__generated__/player_type.ts | 21 + .../database/src/__generated__/profile.ts | 113 + .../database/src/__generated__/pt_skin.ts | 156 ++ .../database/src/__generated__/schema.json | 2131 +++++++++++++++++ .../database/src/__generated__/skin_type.ts | 21 + .../src/__generated__/stock_assembly.ts | 30 + .../__generated__/stock_vehicle_attributes.ts | 57 + .../src/__generated__/sva_car_class.ts | 27 + .../src/__generated__/sva_mode_restriction.ts | 27 + .../database/src/__generated__/vehicle.ts | 40 + .../database/src/__generated__/warehouse.ts | 25 + .../database/src/functions/createNewCar.ts | 300 +++ .../src/functions/getAbstractPartTypeId.ts | 53 + .../src/functions/getWarehouseInventory.ts | 73 + .../src/functions/transferPartAssembly.ts | 162 ++ packages/database/src/seeders/index.ts | 198 ++ packages/database/src/services/database.ts | 36 + packages/database/src/services/tunables.ts | 578 +++++ packages/database/test/Database.test.ts | 126 +- packages/database/vite.config.ts | 36 +- pnpm-lock.yaml | 546 ++++- 42 files changed, 5728 insertions(+), 266 deletions(-) create mode 100644 packages/database/index.ts create mode 100644 packages/database/src/__generated__/abstract_part_type.ts create mode 100644 packages/database/src/__generated__/atdatabases_migrations_applied.ts create mode 100644 packages/database/src/__generated__/atdatabases_migrations_version.ts create mode 100644 packages/database/src/__generated__/attachment_point.ts create mode 100644 packages/database/src/__generated__/brand.ts create mode 100644 packages/database/src/__generated__/branded_part.ts create mode 100644 packages/database/src/__generated__/driver_class.ts create mode 100644 packages/database/src/__generated__/index.ts create mode 100644 packages/database/src/__generated__/key.ts create mode 100644 packages/database/src/__generated__/login.ts create mode 100644 packages/database/src/__generated__/model.ts create mode 100644 packages/database/src/__generated__/part.ts create mode 100644 packages/database/src/__generated__/part_grade.ts create mode 100644 packages/database/src/__generated__/part_type.ts create mode 100644 packages/database/src/__generated__/player.ts create mode 100644 packages/database/src/__generated__/player_type.ts create mode 100644 packages/database/src/__generated__/profile.ts create mode 100644 packages/database/src/__generated__/pt_skin.ts create mode 100644 packages/database/src/__generated__/schema.json create mode 100644 packages/database/src/__generated__/skin_type.ts create mode 100644 packages/database/src/__generated__/stock_assembly.ts create mode 100644 packages/database/src/__generated__/stock_vehicle_attributes.ts create mode 100644 packages/database/src/__generated__/sva_car_class.ts create mode 100644 packages/database/src/__generated__/sva_mode_restriction.ts create mode 100644 packages/database/src/__generated__/vehicle.ts create mode 100644 packages/database/src/__generated__/warehouse.ts create mode 100644 packages/database/src/functions/createNewCar.ts create mode 100644 packages/database/src/functions/getAbstractPartTypeId.ts create mode 100644 packages/database/src/functions/getWarehouseInventory.ts create mode 100644 packages/database/src/functions/transferPartAssembly.ts create mode 100644 packages/database/src/seeders/index.ts create mode 100644 packages/database/src/services/database.ts create mode 100644 packages/database/src/services/tunables.ts diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index 1473fb5c2..91eceaf41 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -29,7 +29,7 @@ jobs: - name: Install and test run: | pnpm install - pnpm test + make test env: CODECOV_UPLOAD_BUNDLE_TOKEN: ${{ secrets.CODECOV_UPLOAD_BUNDLE_TOKEN }} - name: Codecov diff --git a/Makefile b/Makefile index 7dd60683c..087693399 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +include .env + all: @npm install @@ -8,8 +10,10 @@ certs: @echo "certs regenerated. remember to update pub.key for all clients" test: - @clear + @export DATABASE_URL=$$(npx pg-test start) + @pnpm migrate @pnpm test + @npx pg-test stop diff --git a/package.json b/package.json index 00f091514..4d64d5a18 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "type": "module", "dependencies": { "@adminjs/sequelize": "^4.1.1", + "@databases/pg": "^5.5.0", "@fastify/sensible": "^5.5.0", "@sentry/node": "7.88", "@sentry/profiling-node": "^1.3.2", @@ -37,12 +38,15 @@ "moment": "^2.29.4", "pino": "^8.17.1", "rusty-motors-gateway": "link:packages/gateway", + "rusty-motors-nps": "link:packages/nps", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" }, "devDependencies": { "@biomejs/biome": "1.8.3", + "@databases/pg-migrations": "^5.0.3", + "@databases/pg-test": "^3.1.2", "@sentry/cli": "^2.23.1", "@tsconfig/node-lts": "^20.1.0", "@tsconfig/node20": "^20.1.2", diff --git a/packages/database/index.ts b/packages/database/index.ts new file mode 100644 index 000000000..96ed8db19 --- /dev/null +++ b/packages/database/index.ts @@ -0,0 +1,13 @@ +export { + fetchSessionKeyByConnectionId, + fetchSessionKeyByCustomerId, + updateSessionKey, + updateUser, +} from './src/DatabaseManager.js'; +export { getWarehouseInventory } from './src/functions/getWarehouseInventory.js'; +export type { WarehouseInventory } from './src/functions/getWarehouseInventory.js'; +export * from './src/services/database.js'; +import * as DatabaseSchema from './src/__generated__/schema.json'; +export { DatabaseSchema as databaseSchema }; +export { DatabaseSchema }; +export { getTunables as getTuneables } from './src/services/tunables.js'; diff --git a/packages/database/package.json b/packages/database/package.json index 904658ad3..69ffaf927 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -1,34 +1,35 @@ { - "name": "rusty-motors-database", - "version": "1.0.0", - "exports": { - ".": { - "import": "./index.js", - "require": "./index.js" - } - }, - "type": "module", - "scripts": { - "check": "tsc", - "lint": "eslint .", - "format": "npm prettier --write .", - "test": "vitest run --coverage", - "types:db": "npx @databases/pg-schema-cli --directory src/__generated__" - }, - "keywords": [], - "author": "", - "license": "AGPL-3.0", - "dependencies": { - "@databases/pg": "^5.5.0", - "@databases/pg-schema-cli": "^4.4.0", - "@databases/pg-typed": "^4.4.1", - "@sentry/node": "^8.0.0", - "@types/pg": "^8.11.6", - "pg": "^8.11.5", - "pg-hstore": "^2.3.4" - }, - "directories": { - "test": "test" - }, - "description": "" + "name": "rusty-motors-database", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage", + "types:db": "npx @databases/pg-schema-cli --directory src/__generated__" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@databases/pg": "^5.5.0", + "@databases/pg-schema-cli": "^4.4.0", + "@databases/pg-typed": "^4.4.1", + "@sentry/node": "^8.0.0", + "@types/pg": "^8.11.6", + "pg": "^8.11.5", + "pg-hstore": "^2.3.4", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" } diff --git a/packages/database/src/DatabaseManager.ts b/packages/database/src/DatabaseManager.ts index 7f1fbd023..c6824994d 100644 --- a/packages/database/src/DatabaseManager.ts +++ b/packages/database/src/DatabaseManager.ts @@ -3,163 +3,103 @@ * @see {@link getDatabaseServer()} to get a singleton instance */ -import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import type { ConnectionRecord } from "rusty-motors-shared"; /** - * @module Database + * This class abstracts database methods + * @see {@link getDatabaseServer()} to get a singleton instance */ -export class Database { - updateUser(user: { userId: number; userData: Buffer }) { - try { - this._users.set(user.userId, user.userData); - } catch (error) { - this._log.error(error); - } - } - static instance: Database | undefined; - private _log: import("pino").Logger; - private _sessions: interfaces.ConnectionRecord[]; - private _lobbies: interfaces.RaceLobbyRecord[][]; - private _users: Map; +// This is a fake database table that holds sessions of currently logged in users +const _sessions: ConnectionRecord[] = []; +// This is a fake database table that holds user data +const _users: Map = new Map(); - /** - * Creates an instance of Database. - * - * @param {interfaces.external.pino.Logger} [log=getServerLogger({ module: "database" })] - */ - constructor( - log: interfaces.external.pino.Logger = getServerLogger({ - module: "database", - }), - ) { - this._log = log; - this._sessions = []; - /** - * @private - * @type {interfaces.RaceLobbyRecord[]} - */ - this._lobbies = []; - this._users = new Map(); - } +/** + * @module Database + */ - /** - * Return the singleton instance of the DatabaseManager class - * - * @static - * @param {import("pino").Logger} log - * @returns {Database} - */ - static getInstance(log: import("pino").Logger): Database { - if (!Database.instance) { - Database.instance = new Database(log); - } - const self = Database.instance; - return self; - } +/** + * Update a user record in the database - /** - * Locate customer session encryption key in the database - * - * @param {number} customerId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async fetchSessionKeyByCustomerId( - customerId: number, - ): Promise { - const record = this._sessions.find((session) => { - return session.customerId === customerId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - `Session key not found for customer ${customerId}`, - ); - throw err; - } - return record; - } +* @throws {Error} If the user record is not found + */ +export async function updateUser(user: { + userId: number; + userData: Buffer; +}): Promise { + try { + _users.set(user.userId, user.userData); + return Promise.resolve(); + } catch (error) { + throw Error(`Error updating user: ${String(error)}`); + } +} - /** - * Locate customer session encryption key in the database - * - * @param {string} connectionId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async fetchSessionKeyByConnectionId( - connectionId: string, - ): Promise { - const record = this._sessions.find((session) => { - return session.connectionId === connectionId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - `Session key not found for connection ${connectionId}`, - ); - throw err; - } - return record; - } +/** + * Locate customer session encryption key in the database + * + * @throws {Error} If the session key is not found + */ +export async function fetchSessionKeyByCustomerId( + customerId: number, +): Promise { + const record = _sessions.find((session) => { + return session.customerId === customerId; + }); + if (typeof record === "undefined") { + throw Error(`Session key not found for customer ${customerId}`); + } + return Promise.resolve(record); +} - /** - * Create or overwrite a customer's session key record - * - * @param {number} customerId - * @param {string} sessionKey - * @param {string} contextId - * @param {string} connectionId - * @returns {Promise} - * @throws {Error} If the session key is not found - */ - async updateSessionKey( - customerId: number, - sessionKey: string, - contextId: string, - connectionId: string, - ): Promise { - const sKey = sessionKey.slice(0, 16); +/** + * Create or overwrite a customer's session key record + * + * @param {number} customerId + * @param {string} sessionKey + * @param {string} contextId + * @param {string} connectionId + * @returns {Promise} + */ +export async function updateSessionKey( + customerId: number, + sessionKey: string, + contextId: string, + connectionId: string, +): Promise { + const sKey = sessionKey.slice(0, 16); - const updatedSession: import("../../interfaces/index.js").ConnectionRecord = - { - customerId, - sessionKey, - sKey, - contextId, - connectionId, - }; + const updatedSession: ConnectionRecord = { + customerId, + sessionKey, + sKey, + contextId, + connectionId, + }; + const record = _sessions.findIndex((session) => { + return session.customerId === customerId; + }); - const record = this._sessions.findIndex((session) => { - return session.customerId === customerId; - }); - if (typeof record === "undefined") { - const err = new ServerError( - "Error updating session key: existing key not found", - ); - throw err; - } - this._sessions.splice(record, 1, updatedSession); - } + _sessions.splice(record, 1, updatedSession); + return Promise.resolve(); } /** - * Return the singleton instance of the DatabaseManager class + * Locate customer session encryption key in the database * - * @param {object} options - * @param {import("pino").Logger} options.log=getServerLogger({ module: "database" }) - * @returns {Database} + * @param {string} connectionId + * @returns {Promise} + * @throws {Error} If the session key is not found */ - -export function getDatabaseServer( - option = { - log: getServerLogger({ - module: "database", - }), - }, -): Database { - if (!Database.instance) { - Database.instance = new Database(option.log); - } - return Database.getInstance(option.log); +export async function fetchSessionKeyByConnectionId( + connectionId: string, +): Promise { + const record = _sessions.find((session) => { + return session.connectionId === connectionId; + }); + if (typeof record === "undefined") { + throw Error(`Session key not found for connection ${connectionId}`); + } + return Promise.resolve(record); } diff --git a/packages/database/src/__generated__/abstract_part_type.ts b/packages/database/src/__generated__/abstract_part_type.ts new file mode 100644 index 000000000..2ed181817 --- /dev/null +++ b/packages/database/src/__generated__/abstract_part_type.ts @@ -0,0 +1,109 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: 4F7qIfLDFaUNa+UpB5zv1oo5dQLYfT/Nyv4WWdHYycpa2Cd8U60HudGhGUikk6S2Ux1YFnwowfbpOewG2pObzA== + */ + +/* eslint-disable */ +// tslint:disable + +interface AbstractPartType { + abstract_part_type_id: number & {readonly __brand?: 'abstract_part_type_abstract_part_type_id'} + baft: (string) | null + /** + * @default 0 + */ + block_family_compatibility: (number) | null + but: (string) | null + depends_on: (number) | null + eapt: string + eut: (string) | null + faft: (string) | null + fut: (string) | null + gapt: (string) | null + /** + * @default 0 + */ + garage_category: (number) | null + gut: (string) | null + iaft: (string) | null + iut: (string) | null + jaft: (string) | null + jut: (string) | null + /** + * @default 0 + */ + modified_rule: (number) | null + parent_abstract_part_type_id: (number) | null + part_filename: (string) | null + /** + * @default 0 + */ + part_paired: (number) | null + /** + * @default 0 + */ + repair_cost_modifier: (string) | null + saft: (string) | null + schematic_picname1: (string) | null + schematic_picname2: (string) | null + /** + * @default 0 + */ + scrap_value_modifier: (string) | null + sut: (string) | null + sw_aft: (string) | null + swut: (string) | null +} +export default AbstractPartType; + +interface AbstractPartType_InsertParameters { + abstract_part_type_id: number & {readonly __brand?: 'abstract_part_type_abstract_part_type_id'} + baft?: (string) | null + /** + * @default 0 + */ + block_family_compatibility?: (number) | null + but?: (string) | null + depends_on?: (number) | null + eapt: string + eut?: (string) | null + faft?: (string) | null + fut?: (string) | null + gapt?: (string) | null + /** + * @default 0 + */ + garage_category?: (number) | null + gut?: (string) | null + iaft?: (string) | null + iut?: (string) | null + jaft?: (string) | null + jut?: (string) | null + /** + * @default 0 + */ + modified_rule?: (number) | null + parent_abstract_part_type_id?: (number) | null + part_filename?: (string) | null + /** + * @default 0 + */ + part_paired?: (number) | null + /** + * @default 0 + */ + repair_cost_modifier?: (string) | null + saft?: (string) | null + schematic_picname1?: (string) | null + schematic_picname2?: (string) | null + /** + * @default 0 + */ + scrap_value_modifier?: (string) | null + sut?: (string) | null + sw_aft?: (string) | null + swut?: (string) | null +} +export type {AbstractPartType_InsertParameters} diff --git a/packages/database/src/__generated__/atdatabases_migrations_applied.ts b/packages/database/src/__generated__/atdatabases_migrations_applied.ts new file mode 100644 index 000000000..6c123cde7 --- /dev/null +++ b/packages/database/src/__generated__/atdatabases_migrations_applied.ts @@ -0,0 +1,37 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: WsmDmKvwU+poIX0iFyB7Bz5NyR4Fm9VrG2x3f4c3JAwWc31YsLU4jiLx+9kHFzICeXSQYvdlpaLUEDPCGjMv+g== + */ + +/* eslint-disable */ +// tslint:disable + +interface AtdatabasesMigrationsApplied { + applied_at: Date + /** + * @default nextval('atdatabases_migrations_applied_id_seq'::regclass) + */ + id: number & {readonly __brand?: 'atdatabases_migrations_applied_id'} + ignored_error: (string) | null + index: number + name: string + obsolete: boolean + script: string +} +export default AtdatabasesMigrationsApplied; + +interface AtdatabasesMigrationsApplied_InsertParameters { + applied_at: Date + /** + * @default nextval('atdatabases_migrations_applied_id_seq'::regclass) + */ + id?: number & {readonly __brand?: 'atdatabases_migrations_applied_id'} + ignored_error?: (string) | null + index: number + name: string + obsolete: boolean + script: string +} +export type {AtdatabasesMigrationsApplied_InsertParameters} diff --git a/packages/database/src/__generated__/atdatabases_migrations_version.ts b/packages/database/src/__generated__/atdatabases_migrations_version.ts new file mode 100644 index 000000000..a76badb39 --- /dev/null +++ b/packages/database/src/__generated__/atdatabases_migrations_version.ts @@ -0,0 +1,21 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: TpzCQ93K0bjZPn+fXJRl8zC0sQMsUxzUePHiU8MTUjxrIJrQ3DId+E1dxnpZFwz7QWacFdhwsU5SfE9Y34LG4w== + */ + +/* eslint-disable */ +// tslint:disable + +interface AtdatabasesMigrationsVersion { + id: number & {readonly __brand?: 'atdatabases_migrations_version_id'} + version: (string) | null +} +export default AtdatabasesMigrationsVersion; + +interface AtdatabasesMigrationsVersion_InsertParameters { + id: number & {readonly __brand?: 'atdatabases_migrations_version_id'} + version?: (string) | null +} +export type {AtdatabasesMigrationsVersion_InsertParameters} diff --git a/packages/database/src/__generated__/attachment_point.ts b/packages/database/src/__generated__/attachment_point.ts new file mode 100644 index 000000000..eadde0605 --- /dev/null +++ b/packages/database/src/__generated__/attachment_point.ts @@ -0,0 +1,21 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: M8/YeSSGw/7qUaLSrfbNooJeHfkjY6i8wHalJSCCjZyADA5nkk9+voEpAQfQJOdg7cNlnxivhPF6qgfyE3cFgA== + */ + +/* eslint-disable */ +// tslint:disable + +interface AttachmentPoint { + attachment_point: string + attachment_point_id: number & {readonly __brand?: 'attachment_point_attachment_point_id'} +} +export default AttachmentPoint; + +interface AttachmentPoint_InsertParameters { + attachment_point: string + attachment_point_id: number & {readonly __brand?: 'attachment_point_attachment_point_id'} +} +export type {AttachmentPoint_InsertParameters} diff --git a/packages/database/src/__generated__/brand.ts b/packages/database/src/__generated__/brand.ts new file mode 100644 index 000000000..94d79a69f --- /dev/null +++ b/packages/database/src/__generated__/brand.ts @@ -0,0 +1,31 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: 5+uzmr7yCLCXynf+ykB59Q6WCsFKvE5CITtT72DJC1xt3sMAQVveNbFQXfbXlAcX9C5B3rkf3ngCkoUik4pp7g== + */ + +/* eslint-disable */ +// tslint:disable + +interface Brand { + brand: (string) | null + brand_id: number & {readonly __brand?: 'brand_brand_id'} + /** + * @default 0 + */ + is_stock: (number) | null + pic_name: (string) | null +} +export default Brand; + +interface Brand_InsertParameters { + brand?: (string) | null + brand_id: number & {readonly __brand?: 'brand_brand_id'} + /** + * @default 0 + */ + is_stock?: (number) | null + pic_name?: (string) | null +} +export type {Brand_InsertParameters} diff --git a/packages/database/src/__generated__/branded_part.ts b/packages/database/src/__generated__/branded_part.ts new file mode 100644 index 000000000..c5c55871a --- /dev/null +++ b/packages/database/src/__generated__/branded_part.ts @@ -0,0 +1,42 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: FO1yVOHkrUQOwgs9QB7W4cjJTnhjXQ/AMtegydVJKYAy6IrWZfobFOsHnQZkd9wBwKOr3ZsMe0f6wPTHye3Tgg== + */ + +/* eslint-disable */ +// tslint:disable + +import Model from './model' +import PartType from './part_type' + +interface BrandedPart { + branded_part_id: number & {readonly __brand?: 'branded_part_branded_part_id'} + /** + * @default 0 + */ + engine_block_family_id: number + max_item_wear: (number) | null + mfg_date: Date + model_id: Model['model_id'] + part_type_id: PartType['part_type_id'] + qty_avail: number + retail_price: number +} +export default BrandedPart; + +interface BrandedPart_InsertParameters { + branded_part_id: number & {readonly __brand?: 'branded_part_branded_part_id'} + /** + * @default 0 + */ + engine_block_family_id?: number + max_item_wear?: (number) | null + mfg_date: Date + model_id: Model['model_id'] + part_type_id: PartType['part_type_id'] + qty_avail: number + retail_price: number +} +export type {BrandedPart_InsertParameters} diff --git a/packages/database/src/__generated__/driver_class.ts b/packages/database/src/__generated__/driver_class.ts new file mode 100644 index 000000000..a69329f78 --- /dev/null +++ b/packages/database/src/__generated__/driver_class.ts @@ -0,0 +1,21 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: /rudeJZZtDrBYSXjgXr5S4CVYtvkdViVwr6GIhs0pflzGzXgzecKQWMu5xwCJjnceOeZlC+VzWGubFzI2+lIkQ== + */ + +/* eslint-disable */ +// tslint:disable + +interface DriverClass { + driver_class: (string) | null + driver_class_id: number & {readonly __brand?: 'driver_class_driver_class_id'} +} +export default DriverClass; + +interface DriverClass_InsertParameters { + driver_class?: (string) | null + driver_class_id: number & {readonly __brand?: 'driver_class_driver_class_id'} +} +export type {DriverClass_InsertParameters} diff --git a/packages/database/src/__generated__/index.ts b/packages/database/src/__generated__/index.ts new file mode 100644 index 000000000..ebe0a8fc6 --- /dev/null +++ b/packages/database/src/__generated__/index.ts @@ -0,0 +1,118 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: vxwlgkHcVcRZFiTangk9H5WwLqrSWEy51UAfux9QlDfymxXNN3xR7TOK5QunZFk/8dPN8gpKona6QErjHlBLvA== + */ + +/* eslint-disable */ +// tslint:disable + +import AbstractPartType, {AbstractPartType_InsertParameters} from './abstract_part_type' +import AtdatabasesMigrationsApplied, {AtdatabasesMigrationsApplied_InsertParameters} from './atdatabases_migrations_applied' +import AtdatabasesMigrationsVersion, {AtdatabasesMigrationsVersion_InsertParameters} from './atdatabases_migrations_version' +import AttachmentPoint, {AttachmentPoint_InsertParameters} from './attachment_point' +import Brand, {Brand_InsertParameters} from './brand' +import BrandedPart, {BrandedPart_InsertParameters} from './branded_part' +import DriverClass, {DriverClass_InsertParameters} from './driver_class' +import Key, {Key_InsertParameters} from './key' +import Login, {Login_InsertParameters} from './login' +import Model, {Model_InsertParameters} from './model' +import Part, {Part_InsertParameters} from './part' +import PartGrade, {PartGrade_InsertParameters} from './part_grade' +import PartType, {PartType_InsertParameters} from './part_type' +import Player, {Player_InsertParameters} from './player' +import PlayerType, {PlayerType_InsertParameters} from './player_type' +import Profile, {Profile_InsertParameters} from './profile' +import PtSkin, {PtSkin_InsertParameters} from './pt_skin' +import SkinType, {SkinType_InsertParameters} from './skin_type' +import StockAssembly, {StockAssembly_InsertParameters} from './stock_assembly' +import StockVehicleAttributes, {StockVehicleAttributes_InsertParameters} from './stock_vehicle_attributes' +import SvaCarClass, {SvaCarClass_InsertParameters} from './sva_car_class' +import SvaModeRestriction, {SvaModeRestriction_InsertParameters} from './sva_mode_restriction' +import Vehicle, {Vehicle_InsertParameters} from './vehicle' +import Warehouse, {Warehouse_InsertParameters} from './warehouse' + +interface DatabaseSchema { + abstract_part_type: {record: AbstractPartType, insert: AbstractPartType_InsertParameters}; + atdatabases_migrations_applied: {record: AtdatabasesMigrationsApplied, insert: AtdatabasesMigrationsApplied_InsertParameters}; + atdatabases_migrations_version: {record: AtdatabasesMigrationsVersion, insert: AtdatabasesMigrationsVersion_InsertParameters}; + attachment_point: {record: AttachmentPoint, insert: AttachmentPoint_InsertParameters}; + brand: {record: Brand, insert: Brand_InsertParameters}; + branded_part: {record: BrandedPart, insert: BrandedPart_InsertParameters}; + driver_class: {record: DriverClass, insert: DriverClass_InsertParameters}; + key: {record: Key, insert: Key_InsertParameters}; + login: {record: Login, insert: Login_InsertParameters}; + model: {record: Model, insert: Model_InsertParameters}; + part: {record: Part, insert: Part_InsertParameters}; + part_grade: {record: PartGrade, insert: PartGrade_InsertParameters}; + part_type: {record: PartType, insert: PartType_InsertParameters}; + player: {record: Player, insert: Player_InsertParameters}; + player_type: {record: PlayerType, insert: PlayerType_InsertParameters}; + profile: {record: Profile, insert: Profile_InsertParameters}; + pt_skin: {record: PtSkin, insert: PtSkin_InsertParameters}; + skin_type: {record: SkinType, insert: SkinType_InsertParameters}; + stock_assembly: {record: StockAssembly, insert: StockAssembly_InsertParameters}; + stock_vehicle_attributes: {record: StockVehicleAttributes, insert: StockVehicleAttributes_InsertParameters}; + sva_car_class: {record: SvaCarClass, insert: SvaCarClass_InsertParameters}; + sva_mode_restriction: {record: SvaModeRestriction, insert: SvaModeRestriction_InsertParameters}; + vehicle: {record: Vehicle, insert: Vehicle_InsertParameters}; + warehouse: {record: Warehouse, insert: Warehouse_InsertParameters}; +} +export default DatabaseSchema; + +function serializeValue(_tableName: string, _columnName: string, value: unknown): unknown { + return value; +} +export {serializeValue} + +export type { + AbstractPartType, + AbstractPartType_InsertParameters, + AtdatabasesMigrationsApplied, + AtdatabasesMigrationsApplied_InsertParameters, + AtdatabasesMigrationsVersion, + AtdatabasesMigrationsVersion_InsertParameters, + AttachmentPoint, + AttachmentPoint_InsertParameters, + Brand, + Brand_InsertParameters, + BrandedPart, + BrandedPart_InsertParameters, + DriverClass, + DriverClass_InsertParameters, + Key, + Key_InsertParameters, + Login, + Login_InsertParameters, + Model, + Model_InsertParameters, + Part, + PartGrade, + PartGrade_InsertParameters, + PartType, + PartType_InsertParameters, + Part_InsertParameters, + Player, + PlayerType, + PlayerType_InsertParameters, + Player_InsertParameters, + Profile, + Profile_InsertParameters, + PtSkin, + PtSkin_InsertParameters, + SkinType, + SkinType_InsertParameters, + StockAssembly, + StockAssembly_InsertParameters, + StockVehicleAttributes, + StockVehicleAttributes_InsertParameters, + SvaCarClass, + SvaCarClass_InsertParameters, + SvaModeRestriction, + SvaModeRestriction_InsertParameters, + Vehicle, + Vehicle_InsertParameters, + Warehouse, + Warehouse_InsertParameters, +} diff --git a/packages/database/src/__generated__/key.ts b/packages/database/src/__generated__/key.ts new file mode 100644 index 000000000..df8fe75e9 --- /dev/null +++ b/packages/database/src/__generated__/key.ts @@ -0,0 +1,23 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: wgW746gZo7mof5uc2ai7LDQ1itqPc0/zYJtvjUJry8MpivFZUjS7WiUbKX3lPoYnAt873cAiDJCAv58CAn/6ag== + */ + +/* eslint-disable */ +// tslint:disable + +import Profile from './profile' + +interface Key { + profile_id: Profile['profile_id'] + session_key: string +} +export default Key; + +interface Key_InsertParameters { + profile_id: Profile['profile_id'] + session_key: string +} +export type {Key_InsertParameters} diff --git a/packages/database/src/__generated__/login.ts b/packages/database/src/__generated__/login.ts new file mode 100644 index 000000000..7d5ff4b79 --- /dev/null +++ b/packages/database/src/__generated__/login.ts @@ -0,0 +1,33 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: 2QhRIF5QcEQfsA954WH4A1F9qsXfxKnVpal+9mll0E4ca+DRjMppDopDbnwBmEv8SkKT0nnQXWrLw6pvis4gUQ== + */ + +/* eslint-disable */ +// tslint:disable + +import Player from './player' + +interface Login { + customer_id: Player['customer_id'] + /** + * @default 0 + */ + login_level: number + login_name: string & {readonly __brand?: 'login_login_name'} + password: string +} +export default Login; + +interface Login_InsertParameters { + customer_id: Player['customer_id'] + /** + * @default 0 + */ + login_level?: number + login_name: string & {readonly __brand?: 'login_login_name'} + password: string +} +export type {Login_InsertParameters} diff --git a/packages/database/src/__generated__/model.ts b/packages/database/src/__generated__/model.ts new file mode 100644 index 000000000..b750c1d1d --- /dev/null +++ b/packages/database/src/__generated__/model.ts @@ -0,0 +1,75 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: Qq9KWzMs7h2M97USxqjonfltR7XxApLJj5Pvd4uVFMSfGJOfu1D1g8DKiqqA/tJl1FHx4ioQk4VTEWuwTHbuig== + */ + +/* eslint-disable */ +// tslint:disable + +import Brand from './brand' + +interface Model { + b_extra_info: (string) | null + b_model: (string) | null + b_short_model: (string) | null + brand_id: Brand['brand_id'] + debug_sort_string: (string) | null + debug_string: (string) | null + e_extra_info: (string) | null + e_model: (string) | null + e_short_model: (string) | null + f_extra_info: (string) | null + f_model: (string) | null + f_short_model: (string) | null + g_extra_info: (string) | null + g_model: (string) | null + g_short_model: (string) | null + i_extra_info: (string) | null + i_model: (string) | null + i_short_model: (string) | null + j_extra_info: (string) | null + j_model: (string) | null + j_short_model: (string) | null + model_id: number & {readonly __brand?: 'model_model_id'} + s_extra_info: (string) | null + s_model: (string) | null + s_short_model: (string) | null + sw_extra_info: (string) | null + sw_model: (string) | null + sw_short_model: (string) | null +} +export default Model; + +interface Model_InsertParameters { + b_extra_info?: (string) | null + b_model?: (string) | null + b_short_model?: (string) | null + brand_id: Brand['brand_id'] + debug_sort_string?: (string) | null + debug_string?: (string) | null + e_extra_info?: (string) | null + e_model?: (string) | null + e_short_model?: (string) | null + f_extra_info?: (string) | null + f_model?: (string) | null + f_short_model?: (string) | null + g_extra_info?: (string) | null + g_model?: (string) | null + g_short_model?: (string) | null + i_extra_info?: (string) | null + i_model?: (string) | null + i_short_model?: (string) | null + j_extra_info?: (string) | null + j_model?: (string) | null + j_short_model?: (string) | null + model_id: number & {readonly __brand?: 'model_model_id'} + s_extra_info?: (string) | null + s_model?: (string) | null + s_short_model?: (string) | null + sw_extra_info?: (string) | null + sw_model?: (string) | null + sw_short_model?: (string) | null +} +export type {Model_InsertParameters} diff --git a/packages/database/src/__generated__/part.ts b/packages/database/src/__generated__/part.ts new file mode 100644 index 000000000..064fee839 --- /dev/null +++ b/packages/database/src/__generated__/part.ts @@ -0,0 +1,52 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: r6ugbodeJS+NyD2EV4tEiehaMPdc6JlFSQdwqPL8rhK6qnoLI+5Oqhnf70/4q7v27LqZj18o9u0QljUK+3gDfg== + */ + +/* eslint-disable */ +// tslint:disable + +import AttachmentPoint from './attachment_point' +import BrandedPart from './branded_part' + +interface Part { + attachment_point_id: (AttachmentPoint['attachment_point_id']) | null + branded_part_id: BrandedPart['branded_part_id'] + item_wear: number + owner_id: (number) | null + parent_part_id: (number) | null + part_id: number & {readonly __brand?: 'part_part_id'} + part_name: (string) | null + percent_damage: number + /** + * @default 0 + */ + repair_cost: (number) | null + /** + * @default 0 + */ + scrap_value: (number) | null +} +export default Part; + +interface Part_InsertParameters { + attachment_point_id?: (AttachmentPoint['attachment_point_id']) | null + branded_part_id: BrandedPart['branded_part_id'] + item_wear: number + owner_id?: (number) | null + parent_part_id?: (number) | null + part_id: number & {readonly __brand?: 'part_part_id'} + part_name?: (string) | null + percent_damage: number + /** + * @default 0 + */ + repair_cost?: (number) | null + /** + * @default 0 + */ + scrap_value?: (number) | null +} +export type {Part_InsertParameters} diff --git a/packages/database/src/__generated__/part_grade.ts b/packages/database/src/__generated__/part_grade.ts new file mode 100644 index 000000000..234af8cb7 --- /dev/null +++ b/packages/database/src/__generated__/part_grade.ts @@ -0,0 +1,27 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: llTnc44yDeEt4bCekTPJhS5xGIfL3IuJzgPaGSWsm0DRRZSILUEfEvpaLFnlNFe+ZUgYQgph9p/Sx5zW/rvryg== + */ + +/* eslint-disable */ +// tslint:disable + +interface PartGrade { + e_text: (string) | null + f_text: (string) | null + g_text: (string) | null + part_grade: (string) | null + part_grade_id: number & {readonly __brand?: 'part_grade_part_grade_id'} +} +export default PartGrade; + +interface PartGrade_InsertParameters { + e_text?: (string) | null + f_text?: (string) | null + g_text?: (string) | null + part_grade?: (string) | null + part_grade_id: number & {readonly __brand?: 'part_grade_part_grade_id'} +} +export type {PartGrade_InsertParameters} diff --git a/packages/database/src/__generated__/part_type.ts b/packages/database/src/__generated__/part_type.ts new file mode 100644 index 000000000..618139a55 --- /dev/null +++ b/packages/database/src/__generated__/part_type.ts @@ -0,0 +1,30 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: akkPgI94W/iY1RjP32yAxWZpasspO4ENv+U3xZIsQPr6rrdcY53EQhVW3N31GehKX5BabfVeIYvzAPQvRbIQ5Q== + */ + +/* eslint-disable */ +// tslint:disable + +import AbstractPartType from './abstract_part_type' +import PartGrade from './part_grade' + +interface PartType { + abstract_part_type_id: AbstractPartType['abstract_part_type_id'] + part_filename: (string) | null + part_grade_id: (PartGrade['part_grade_id']) | null + part_type: string + part_type_id: number & {readonly __brand?: 'part_type_part_type_id'} +} +export default PartType; + +interface PartType_InsertParameters { + abstract_part_type_id: AbstractPartType['abstract_part_type_id'] + part_filename?: (string) | null + part_grade_id?: (PartGrade['part_grade_id']) | null + part_type: string + part_type_id: number & {readonly __brand?: 'part_type_part_type_id'} +} +export type {PartType_InsertParameters} diff --git a/packages/database/src/__generated__/player.ts b/packages/database/src/__generated__/player.ts new file mode 100644 index 000000000..83371897c --- /dev/null +++ b/packages/database/src/__generated__/player.ts @@ -0,0 +1,282 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: gKn2soAeVAuhf3iovJDOurssIFodyk5OHPYCE9NgAM+k3DmAM70ATZUjes0HKRpBAhJLsmyFmUehysYOSriHHw== + */ + +/* eslint-disable */ +// tslint:disable + +import DriverClass from './driver_class' +import PlayerType from './player_type' + +interface Player { + address: (string) | null + bank_balance: number + /** + * @default 0 + */ + body_type: (number) | null + car_info_setting: (number) | null + car_num1: string + car_num2: string + car_num3: string + car_num4: string + car_num5: string + car_num6: string + /** + * @default 0 + */ + cars_lost: (number) | null + /** + * @default 0 + */ + cars_won: (number) | null + /** + * @default 0 + */ + challenge_races_completed: (number) | null + /** + * @default 0 + */ + challenge_races_run: (number) | null + /** + * @default 0 + */ + challenge_races_won: (number) | null + challenge_rung: (number) | null + challenge_score: (number) | null + current_race_id: (number) | null + customer_id: number + dl_number: (string) | null + drag_class: (DriverClass['driver_class_id']) | null + driver_style: number + /** + * @default 0 + */ + evaded_fuzz: (number) | null + /** + * @default 0 + */ + hair_color: (number) | null + /** + * @default 0 + */ + insurance_rating: (number) | null + /** + * @default 0 + */ + insurance_risk_points: (number) | null + is_logged_in: (number) | null + last_logged_in: (Date) | null + lp_code: number + lp_text: (string) | null + modified_classic_class: (DriverClass['driver_class_id']) | null + modified_muscle_class: (DriverClass['driver_class_id']) | null + num_cars_owned: number + /** + * @default 0 + */ + num_unread_mail: (number) | null + /** + * @default 0 + */ + offline_ai_car_bpt_id: (number) | null + /** + * @default 0 + */ + offline_ai_car_class: (number) | null + /** + * @default 0 + */ + offline_ai_skin_id: (number) | null + /** + * @default 0 + */ + offline_ai_state: (number) | null + offline_driver_attitude: (number) | null + offline_driver_skill: (number) | null + offline_driver_style: (number) | null + offline_grudge: (number) | null + offline_reputation: (number) | null + outlaw_class: (DriverClass['driver_class_id']) | null + /** + * @default 0 + */ + pants_color: (number) | null + persona: string + /** + * @default 0 + */ + pinks_won: (number) | null + player_id: number & {readonly __brand?: 'player_player_id'} + player_type_id: PlayerType['player_type_id'] + residence: (string) | null + sanctioned_score: (number) | null + /** + * @default 0 + */ + shirt_color: (number) | null + /** + * @default 0 + */ + skin_color: (number) | null + stock_classic_class: (number) | null + stock_muscle_class: (DriverClass['driver_class_id']) | null + times_logged_in: (number) | null + /** + * @default 0 + */ + total_races_completed: (number) | null + /** + * @default 0 + */ + total_races_run: (number) | null + /** + * @default 0 + */ + total_races_won: (number) | null + total_time_played: (number) | null + /** + * @default 0 + */ + total_winnings: (number) | null + vehicle_id: (number) | null +} +export default Player; + +interface Player_InsertParameters { + address?: (string) | null + bank_balance: number + /** + * @default 0 + */ + body_type?: (number) | null + car_info_setting?: (number) | null + car_num1: string + car_num2: string + car_num3: string + car_num4: string + car_num5: string + car_num6: string + /** + * @default 0 + */ + cars_lost?: (number) | null + /** + * @default 0 + */ + cars_won?: (number) | null + /** + * @default 0 + */ + challenge_races_completed?: (number) | null + /** + * @default 0 + */ + challenge_races_run?: (number) | null + /** + * @default 0 + */ + challenge_races_won?: (number) | null + challenge_rung?: (number) | null + challenge_score?: (number) | null + current_race_id?: (number) | null + customer_id: number + dl_number?: (string) | null + drag_class?: (DriverClass['driver_class_id']) | null + driver_style: number + /** + * @default 0 + */ + evaded_fuzz?: (number) | null + /** + * @default 0 + */ + hair_color?: (number) | null + /** + * @default 0 + */ + insurance_rating?: (number) | null + /** + * @default 0 + */ + insurance_risk_points?: (number) | null + is_logged_in?: (number) | null + last_logged_in?: (Date) | null + lp_code: number + lp_text?: (string) | null + modified_classic_class?: (DriverClass['driver_class_id']) | null + modified_muscle_class?: (DriverClass['driver_class_id']) | null + num_cars_owned: number + /** + * @default 0 + */ + num_unread_mail?: (number) | null + /** + * @default 0 + */ + offline_ai_car_bpt_id?: (number) | null + /** + * @default 0 + */ + offline_ai_car_class?: (number) | null + /** + * @default 0 + */ + offline_ai_skin_id?: (number) | null + /** + * @default 0 + */ + offline_ai_state?: (number) | null + offline_driver_attitude?: (number) | null + offline_driver_skill?: (number) | null + offline_driver_style?: (number) | null + offline_grudge?: (number) | null + offline_reputation?: (number) | null + outlaw_class?: (DriverClass['driver_class_id']) | null + /** + * @default 0 + */ + pants_color?: (number) | null + persona: string + /** + * @default 0 + */ + pinks_won?: (number) | null + player_id: number & {readonly __brand?: 'player_player_id'} + player_type_id: PlayerType['player_type_id'] + residence?: (string) | null + sanctioned_score?: (number) | null + /** + * @default 0 + */ + shirt_color?: (number) | null + /** + * @default 0 + */ + skin_color?: (number) | null + stock_classic_class?: (number) | null + stock_muscle_class?: (DriverClass['driver_class_id']) | null + times_logged_in?: (number) | null + /** + * @default 0 + */ + total_races_completed?: (number) | null + /** + * @default 0 + */ + total_races_run?: (number) | null + /** + * @default 0 + */ + total_races_won?: (number) | null + total_time_played?: (number) | null + /** + * @default 0 + */ + total_winnings?: (number) | null + vehicle_id?: (number) | null +} +export type {Player_InsertParameters} diff --git a/packages/database/src/__generated__/player_type.ts b/packages/database/src/__generated__/player_type.ts new file mode 100644 index 000000000..6d8ceb2f0 --- /dev/null +++ b/packages/database/src/__generated__/player_type.ts @@ -0,0 +1,21 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: Vn4sM7SA51T3U0kn74/QGtOKnsmDine+eesJkqom/sgJrJ45gWOsqMmzm/bx4TP6ut8x8SeBjRywUa7D8S3Kzg== + */ + +/* eslint-disable */ +// tslint:disable + +interface PlayerType { + player_type: string + player_type_id: number & {readonly __brand?: 'player_type_player_type_id'} +} +export default PlayerType; + +interface PlayerType_InsertParameters { + player_type: string + player_type_id: number & {readonly __brand?: 'player_type_player_type_id'} +} +export type {PlayerType_InsertParameters} diff --git a/packages/database/src/__generated__/profile.ts b/packages/database/src/__generated__/profile.ts new file mode 100644 index 000000000..636e5ecd4 --- /dev/null +++ b/packages/database/src/__generated__/profile.ts @@ -0,0 +1,113 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: cWy5E6rmsqYAjbb3s7l4A4U+62pKFdFWfooxs6rx6B0Ni3fTG5offgvrKqo5Ac0Dt+hX2hv/IETGAQkDutjQlw== + */ + +/* eslint-disable */ +// tslint:disable + +import Player from './player' + +interface Profile { + /** + * @default EXTRACT(epoch FROM now())::integer + */ + create_stamp: number + current_key: string + customer_id: Player['customer_id'] + /** + * @default false + */ + dnd: boolean + game_blob: string + /** + * @default EXTRACT(epoch FROM now())::integer + */ + game_purchase_stamp: number + game_serial_number: string + /** + * @default EXTRACT(epoch FROM now())::integer + */ + game_start_stamp: number + /** + * @default false + */ + is_online: boolean + /** + * @default EXTRACT(epoch FROM now())::integer + */ + last_login_stamp: number + /** + * @default 1 + */ + number_games: number + personal_blob: string + picture_blob: string + profile_id: number & {readonly __brand?: 'profile_profile_id'} + /** + * @default 0 + */ + profile_level: number + profile_name: string + /** + * @default 0 + */ + server_id: number + shard_id: number + time_in_game: number + time_online: number +} +export default Profile; + +interface Profile_InsertParameters { + /** + * @default EXTRACT(epoch FROM now())::integer + */ + create_stamp?: number + current_key: string + customer_id: Player['customer_id'] + /** + * @default false + */ + dnd?: boolean + game_blob: string + /** + * @default EXTRACT(epoch FROM now())::integer + */ + game_purchase_stamp?: number + game_serial_number: string + /** + * @default EXTRACT(epoch FROM now())::integer + */ + game_start_stamp?: number + /** + * @default false + */ + is_online?: boolean + /** + * @default EXTRACT(epoch FROM now())::integer + */ + last_login_stamp?: number + /** + * @default 1 + */ + number_games?: number + personal_blob: string + picture_blob: string + profile_id: number & {readonly __brand?: 'profile_profile_id'} + /** + * @default 0 + */ + profile_level?: number + profile_name: string + /** + * @default 0 + */ + server_id?: number + shard_id: number + time_in_game: number + time_online: number +} +export type {Profile_InsertParameters} diff --git a/packages/database/src/__generated__/pt_skin.ts b/packages/database/src/__generated__/pt_skin.ts new file mode 100644 index 000000000..edb1777e9 --- /dev/null +++ b/packages/database/src/__generated__/pt_skin.ts @@ -0,0 +1,156 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: 0TdVdR0Di4kkCqeXSWPevxew/lFqzaq7QWD9ti0m3cUx1KZd395xLCLnKHWkuRJ7ZhMVwS6YIGMmgvRjEbCH7Q== + */ + +/* eslint-disable */ +// tslint:disable + +import PartType from './part_type' +import SkinType from './skin_type' + +interface PtSkin { + b_skin: (string) | null + c0: (number) | null + c1: (number) | null + c2: (number) | null + c3: (number) | null + c4: (number) | null + c5: (number) | null + c6: (number) | null + c7: (number) | null + comment_text: (string) | null + creator_id: (number) | null + creator_name: (string) | null + /** + * @default 0 + */ + default_flag: (number) | null + e_skin: (string) | null + f_skin: (string) | null + g_skin: (string) | null + h0: (number) | null + h1: (number) | null + h2: (number) | null + h3: (number) | null + h4: (number) | null + h5: (number) | null + h6: (number) | null + h7: (number) | null + i_skin: (string) | null + j_skin: (string) | null + part_filename: (string) | null + part_type_id: (PartType['part_type_id']) | null + price: number + s0: (number) | null + s1: (number) | null + s2: (number) | null + s3: (number) | null + s4: (number) | null + s5: (number) | null + s6: (number) | null + s7: (number) | null + s_skin: (string) | null + skin_id: number & {readonly __brand?: 'pt_skin_skin_id'} + skin_type_id: (SkinType['skin_type_id']) | null + sw_skin: (string) | null + v0: (number) | null + v1: (number) | null + v2: (number) | null + v3: (number) | null + v4: (number) | null + v5: (number) | null + v6: (number) | null + v7: (number) | null + x0: (number) | null + x1: (number) | null + x2: (number) | null + x3: (number) | null + x4: (number) | null + x5: (number) | null + x6: (number) | null + x7: (number) | null + y0: (number) | null + y1: (number) | null + y2: (number) | null + y3: (number) | null + y4: (number) | null + y5: (number) | null + y6: (number) | null + y7: (number) | null +} +export default PtSkin; + +interface PtSkin_InsertParameters { + b_skin?: (string) | null + c0?: (number) | null + c1?: (number) | null + c2?: (number) | null + c3?: (number) | null + c4?: (number) | null + c5?: (number) | null + c6?: (number) | null + c7?: (number) | null + comment_text?: (string) | null + creator_id?: (number) | null + creator_name?: (string) | null + /** + * @default 0 + */ + default_flag?: (number) | null + e_skin?: (string) | null + f_skin?: (string) | null + g_skin?: (string) | null + h0?: (number) | null + h1?: (number) | null + h2?: (number) | null + h3?: (number) | null + h4?: (number) | null + h5?: (number) | null + h6?: (number) | null + h7?: (number) | null + i_skin?: (string) | null + j_skin?: (string) | null + part_filename?: (string) | null + part_type_id?: (PartType['part_type_id']) | null + price: number + s0?: (number) | null + s1?: (number) | null + s2?: (number) | null + s3?: (number) | null + s4?: (number) | null + s5?: (number) | null + s6?: (number) | null + s7?: (number) | null + s_skin?: (string) | null + skin_id: number & {readonly __brand?: 'pt_skin_skin_id'} + skin_type_id?: (SkinType['skin_type_id']) | null + sw_skin?: (string) | null + v0?: (number) | null + v1?: (number) | null + v2?: (number) | null + v3?: (number) | null + v4?: (number) | null + v5?: (number) | null + v6?: (number) | null + v7?: (number) | null + x0?: (number) | null + x1?: (number) | null + x2?: (number) | null + x3?: (number) | null + x4?: (number) | null + x5?: (number) | null + x6?: (number) | null + x7?: (number) | null + y0?: (number) | null + y1?: (number) | null + y2?: (number) | null + y3?: (number) | null + y4?: (number) | null + y5?: (number) | null + y6?: (number) | null + y7?: (number) | null +} +export type {PtSkin_InsertParameters} diff --git a/packages/database/src/__generated__/schema.json b/packages/database/src/__generated__/schema.json new file mode 100644 index 000000000..486f0d769 --- /dev/null +++ b/packages/database/src/__generated__/schema.json @@ -0,0 +1,2131 @@ +[ + { + "name": "abstract_part_type", + "columns": [ + { + "name": "abstract_part_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "baft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "block_family_compatibility", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "but", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "depends_on", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "eapt", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "eut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "faft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "fut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "gapt", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "garage_category", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "gut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "iaft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "iut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "jaft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "jut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "modified_rule", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "parent_abstract_part_type_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_filename", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_paired", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "repair_cost_modifier", + "isNullable": true, + "hasDefault": true, + "typeId": 1700, + "typeName": "NUMERIC" + }, + { + "name": "saft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "schematic_picname1", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "schematic_picname2", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "scrap_value_modifier", + "isNullable": true, + "hasDefault": true, + "typeId": 1700, + "typeName": "NUMERIC" + }, + { + "name": "sut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "sw_aft", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "swut", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + } + ] + }, + { + "name": "atdatabases_migrations_applied", + "columns": [ + { + "name": "applied_at", + "isNullable": false, + "hasDefault": false, + "typeId": 1184, + "typeName": "TIMESTAMPTZ" + }, + { + "name": "id", + "isNullable": false, + "hasDefault": true, + "typeId": 20, + "typeName": "BIGINT" + }, + { + "name": "ignored_error", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "index", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "name", + "isNullable": false, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + }, + { + "name": "obsolete", + "isNullable": false, + "hasDefault": false, + "typeId": 16, + "typeName": "BOOL" + }, + { + "name": "script", + "isNullable": false, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + } + ] + }, + { + "name": "atdatabases_migrations_version", + "columns": [ + { + "name": "id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "version", + "isNullable": true, + "hasDefault": false, + "typeId": 25, + "typeName": "TEXT" + } + ] + }, + { + "name": "attachment_point", + "columns": [ + { + "name": "attachment_point", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "attachment_point_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "brand", + "columns": [ + { + "name": "brand", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "brand_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "is_stock", + "isNullable": true, + "hasDefault": true, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "pic_name", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + } + ] + }, + { + "name": "branded_part", + "columns": [ + { + "name": "branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "engine_block_family_id", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "max_item_wear", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "mfg_date", + "isNullable": false, + "hasDefault": false, + "typeId": 1114, + "typeName": "TIMESTAMP" + }, + { + "name": "model_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "qty_avail", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "retail_price", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "driver_class", + "columns": [ + { + "name": "driver_class", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "driver_class_id", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + } + ] + }, + { + "name": "key", + "columns": [ + { + "name": "profile_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "session_key", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + } + ] + }, + { + "name": "login", + "columns": [ + { + "name": "customer_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "login_level", + "isNullable": false, + "hasDefault": true, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "login_name", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "password", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + } + ] + }, + { + "name": "model", + "columns": [ + { + "name": "b_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "b_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "b_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "brand_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "debug_sort_string", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "debug_string", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "e_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "e_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "e_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "f_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "f_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "f_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "g_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "g_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "g_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "i_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "i_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "i_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "j_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "j_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "j_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "model_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "s_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "s_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "s_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sw_extra_info", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sw_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sw_short_model", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + } + ] + }, + { + "name": "part", + "columns": [ + { + "name": "attachment_point_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "item_wear", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "owner_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "parent_part_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_name", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "percent_damage", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "repair_cost", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "scrap_value", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "part_grade", + "columns": [ + { + "name": "e_text", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "f_text", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "g_text", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_grade", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_grade_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "part_type", + "columns": [ + { + "name": "abstract_part_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_filename", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_grade_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "part_type", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "player", + "columns": [ + { + "name": "address", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "bank_balance", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "body_type", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "car_info_setting", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "car_num1", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "car_num2", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "car_num3", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "car_num4", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "car_num5", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "car_num6", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "cars_lost", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "cars_won", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "challenge_races_completed", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "challenge_races_run", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "challenge_races_won", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "challenge_rung", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "challenge_score", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "current_race_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "customer_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "dl_number", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "drag_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "driver_style", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "evaded_fuzz", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "hair_color", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "insurance_rating", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "insurance_risk_points", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "is_logged_in", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "last_logged_in", + "isNullable": true, + "hasDefault": false, + "typeId": 1114, + "typeName": "TIMESTAMP" + }, + { + "name": "lp_code", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "lp_text", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "modified_classic_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "modified_muscle_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "num_cars_owned", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "num_unread_mail", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_ai_car_bpt_id", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_ai_car_class", + "isNullable": true, + "hasDefault": true, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "offline_ai_skin_id", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_ai_state", + "isNullable": true, + "hasDefault": true, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "offline_driver_attitude", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_driver_skill", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_driver_style", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_grudge", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "offline_reputation", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "outlaw_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "pants_color", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "persona", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "pinks_won", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "player_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "player_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "residence", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sanctioned_score", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "shirt_color", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "skin_color", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "stock_classic_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "stock_muscle_class", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "times_logged_in", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "total_races_completed", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "total_races_run", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "total_races_won", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "total_time_played", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "total_winnings", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "vehicle_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "player_type", + "columns": [ + { + "name": "player_type", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "player_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "profile", + "columns": [ + { + "name": "create_stamp", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "current_key", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "customer_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "dnd", + "isNullable": false, + "hasDefault": true, + "typeId": 16, + "typeName": "BOOL" + }, + { + "name": "game_blob", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "game_purchase_stamp", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "game_serial_number", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "game_start_stamp", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "is_online", + "isNullable": false, + "hasDefault": true, + "typeId": 16, + "typeName": "BOOL" + }, + { + "name": "last_login_stamp", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "number_games", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "personal_blob", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "picture_blob", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "profile_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "profile_level", + "isNullable": false, + "hasDefault": true, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "profile_name", + "isNullable": false, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "server_id", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "shard_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "time_in_game", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "time_online", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "pt_skin", + "columns": [ + { + "name": "b_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "c0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "c7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "comment_text", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "creator_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "creator_name", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "default_flag", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "e_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "f_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "g_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "h0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "h7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "i_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "j_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_filename", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "part_type_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "price", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "s0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "s_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "skin_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "skin_type_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "sw_skin", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "v0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "v7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "x7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y0", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y1", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y2", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y3", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y4", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y5", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y6", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "y7", + "isNullable": true, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + } + ] + }, + { + "name": "skin_type", + "columns": [ + { + "name": "skin_type", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "skin_type_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "stock_assembly", + "columns": [ + { + "name": "attachment_point_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "child_branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "config_default", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "parent_branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "physics_default", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + } + ] + }, + { + "name": "stock_vehicle_attributes", + "columns": [ + { + "name": "ai_restriction_class", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "car_class", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "mode_restriction", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "retail_price", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "sponsor", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "track_id", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "vin_branded_part_id", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "vin_crc", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "sva_car_class", + "columns": [ + { + "name": "description", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sva_car_class", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "sva_mode_restriction", + "columns": [ + { + "name": "description", + "isNullable": true, + "hasDefault": false, + "typeId": 1043, + "typeName": "VARCHAR" + }, + { + "name": "sva_mode_restriction", + "isNullable": false, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "vehicle", + "columns": [ + { + "name": "class", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "damage_cached", + "isNullable": true, + "hasDefault": true, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "damage_info", + "isNullable": true, + "hasDefault": false, + "typeId": 17, + "typeName": "BYTEA" + }, + { + "name": "flags", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "info_setting", + "isNullable": false, + "hasDefault": false, + "typeId": 21, + "typeName": "SMALLINT" + }, + { + "name": "skin_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "vehicle_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + }, + { + "name": "warehouse", + "columns": [ + { + "name": "branded_part_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "player_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "qty_avail", + "isNullable": true, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + }, + { + "name": "skin_id", + "isNullable": false, + "hasDefault": false, + "typeId": 23, + "typeName": "INTEGER" + } + ] + } +] diff --git a/packages/database/src/__generated__/skin_type.ts b/packages/database/src/__generated__/skin_type.ts new file mode 100644 index 000000000..ccbe22afe --- /dev/null +++ b/packages/database/src/__generated__/skin_type.ts @@ -0,0 +1,21 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: 0Y6j1hEBv9fFPPMUwE+dfDeQCI3GQ8v/xmiDD1EuaveC0FbiFG9tqgrPaJT/fNJzXdD0vwLwA7atS6SbNZ7L+w== + */ + +/* eslint-disable */ +// tslint:disable + +interface SkinType { + skin_type: (string) | null + skin_type_id: number & {readonly __brand?: 'skin_type_skin_type_id'} +} +export default SkinType; + +interface SkinType_InsertParameters { + skin_type?: (string) | null + skin_type_id: number & {readonly __brand?: 'skin_type_skin_type_id'} +} +export type {SkinType_InsertParameters} diff --git a/packages/database/src/__generated__/stock_assembly.ts b/packages/database/src/__generated__/stock_assembly.ts new file mode 100644 index 000000000..7c001c570 --- /dev/null +++ b/packages/database/src/__generated__/stock_assembly.ts @@ -0,0 +1,30 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: +1JxIzPDXtM0DrvWN4w5APwLGqnqNZa4uYMzC+D6iU9tPaBjaz55bapwAFUlmW1kqUgKJt3cCWJFY4sqgl89tA== + */ + +/* eslint-disable */ +// tslint:disable + +import AttachmentPoint from './attachment_point' +import BrandedPart from './branded_part' + +interface StockAssembly { + attachment_point_id: AttachmentPoint['attachment_point_id'] + child_branded_part_id: BrandedPart['branded_part_id'] + config_default: number + parent_branded_part_id: BrandedPart['branded_part_id'] + physics_default: number +} +export default StockAssembly; + +interface StockAssembly_InsertParameters { + attachment_point_id: AttachmentPoint['attachment_point_id'] + child_branded_part_id: BrandedPart['branded_part_id'] + config_default: number + parent_branded_part_id: BrandedPart['branded_part_id'] + physics_default: number +} +export type {StockAssembly_InsertParameters} diff --git a/packages/database/src/__generated__/stock_vehicle_attributes.ts b/packages/database/src/__generated__/stock_vehicle_attributes.ts new file mode 100644 index 000000000..6969f6b30 --- /dev/null +++ b/packages/database/src/__generated__/stock_vehicle_attributes.ts @@ -0,0 +1,57 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: eItxTTFjYW2AtKXc9YEk6zvsf1iP3TDsn/HvjbY3az8itICqa5H5p7WmuRh2uTVPeVHZtIRQ+HnboKRUmqHKdQ== + */ + +/* eslint-disable */ +// tslint:disable + +import BrandedPart from './branded_part' +import SvaCarClass from './sva_car_class' +import SvaModeRestriction from './sva_mode_restriction' + +interface StockVehicleAttributes { + ai_restriction_class: (number) | null + branded_part_id: BrandedPart['branded_part_id'] + car_class: (SvaCarClass['sva_car_class']) | null + mode_restriction: (SvaModeRestriction['sva_mode_restriction']) | null + /** + * @default 1000 + */ + retail_price: (number) | null + sponsor: (number) | null + /** + * @default 0 + */ + track_id: (number) | null + vin_branded_part_id: (BrandedPart['branded_part_id']) | null + /** + * @default 0 + */ + vin_crc: number +} +export default StockVehicleAttributes; + +interface StockVehicleAttributes_InsertParameters { + ai_restriction_class?: (number) | null + branded_part_id: BrandedPart['branded_part_id'] + car_class?: (SvaCarClass['sva_car_class']) | null + mode_restriction?: (SvaModeRestriction['sva_mode_restriction']) | null + /** + * @default 1000 + */ + retail_price?: (number) | null + sponsor?: (number) | null + /** + * @default 0 + */ + track_id?: (number) | null + vin_branded_part_id?: (BrandedPart['branded_part_id']) | null + /** + * @default 0 + */ + vin_crc?: number +} +export type {StockVehicleAttributes_InsertParameters} diff --git a/packages/database/src/__generated__/sva_car_class.ts b/packages/database/src/__generated__/sva_car_class.ts new file mode 100644 index 000000000..967b4246c --- /dev/null +++ b/packages/database/src/__generated__/sva_car_class.ts @@ -0,0 +1,27 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: Suo841IcTQeyyq7L+fPx9Tv+rUka791XOdAslmSWP7UJjw8IVSvTE2kE6aZEgG9TfwG7DaCRvrFrAVQZfHUBrw== + */ + +/* eslint-disable */ +// tslint:disable + +interface SvaCarClass { + description: (string) | null + /** + * @default 0 + */ + sva_car_class: number & {readonly __brand?: 'sva_car_class_sva_car_class'} +} +export default SvaCarClass; + +interface SvaCarClass_InsertParameters { + description?: (string) | null + /** + * @default 0 + */ + sva_car_class?: number & {readonly __brand?: 'sva_car_class_sva_car_class'} +} +export type {SvaCarClass_InsertParameters} diff --git a/packages/database/src/__generated__/sva_mode_restriction.ts b/packages/database/src/__generated__/sva_mode_restriction.ts new file mode 100644 index 000000000..f158d4d60 --- /dev/null +++ b/packages/database/src/__generated__/sva_mode_restriction.ts @@ -0,0 +1,27 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: jbNe73+qP3lZjMsdVB/t++M77bH6cRqj/wn8mV1Js8vMz7z4YSUn0TiJGKXG7LiVujgTHU4JwifPYc/8PFy4QA== + */ + +/* eslint-disable */ +// tslint:disable + +interface SvaModeRestriction { + description: (string) | null + /** + * @default 0 + */ + sva_mode_restriction: number & {readonly __brand?: 'sva_mode_restriction_sva_mode_restriction'} +} +export default SvaModeRestriction; + +interface SvaModeRestriction_InsertParameters { + description?: (string) | null + /** + * @default 0 + */ + sva_mode_restriction?: number & {readonly __brand?: 'sva_mode_restriction_sva_mode_restriction'} +} +export type {SvaModeRestriction_InsertParameters} diff --git a/packages/database/src/__generated__/vehicle.ts b/packages/database/src/__generated__/vehicle.ts new file mode 100644 index 000000000..c799bdec2 --- /dev/null +++ b/packages/database/src/__generated__/vehicle.ts @@ -0,0 +1,40 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: erArmswP79+tT9kT7eo5CKZx8NL8IdmGOJ5mZBGIHWFnMLrwIJ+Sx5QJkgVJZlfPUSMYC4C4qPbsbbFEYSaMdQ== + */ + +/* eslint-disable */ +// tslint:disable + +import Part from './part' +import PtSkin from './pt_skin' + +interface Vehicle { + class: number + /** + * @default 0 + */ + damage_cached: (number) | null + damage_info: (Buffer) | null + flags: number + info_setting: number + skin_id: PtSkin['skin_id'] + vehicle_id: Part['part_id'] +} +export default Vehicle; + +interface Vehicle_InsertParameters { + class: number + /** + * @default 0 + */ + damage_cached?: (number) | null + damage_info?: (Buffer) | null + flags: number + info_setting: number + skin_id: PtSkin['skin_id'] + vehicle_id: Part['part_id'] +} +export type {Vehicle_InsertParameters} diff --git a/packages/database/src/__generated__/warehouse.ts b/packages/database/src/__generated__/warehouse.ts new file mode 100644 index 000000000..487ad514f --- /dev/null +++ b/packages/database/src/__generated__/warehouse.ts @@ -0,0 +1,25 @@ +/** + * !!! This file is autogenerated do not edit by hand !!! + * + * Generated by: @databases/pg-schema-print-types + * Checksum: XrOV3lTPYPS3btYlHuGZ0/mA/Tuj6CmNJE7ni+9dgYOjjKLKyNJG8NxmZ+/PG1R//a6U5DJR+ldmZ47r3E60Nw== + */ + +/* eslint-disable */ +// tslint:disable + +interface Warehouse { + branded_part_id: number & {readonly __brand?: 'warehouse_branded_part_id'} + player_id: number & {readonly __brand?: 'warehouse_player_id'} + qty_avail: (number) | null + skin_id: number & {readonly __brand?: 'warehouse_skin_id'} +} +export default Warehouse; + +interface Warehouse_InsertParameters { + branded_part_id: number & {readonly __brand?: 'warehouse_branded_part_id'} + player_id: number & {readonly __brand?: 'warehouse_player_id'} + qty_avail?: (number) | null + skin_id: number & {readonly __brand?: 'warehouse_skin_id'} +} +export type {Warehouse_InsertParameters} diff --git a/packages/database/src/functions/createNewCar.ts b/packages/database/src/functions/createNewCar.ts new file mode 100644 index 000000000..84a5e907a --- /dev/null +++ b/packages/database/src/functions/createNewCar.ts @@ -0,0 +1,300 @@ +import { eq } from 'drizzle-orm'; +import { getDatabase } from 'rusty-motors-database'; +import { + brandedPart as brandedPartSchema, + part as partSchema, + player as playerSchema, + stockAssembly as stockAssemblySchema, + stockVehicleAttributes as stockVehicleAttributesSchema, + tunables as tunablesSchema, + warehouse as warehouseSchema, +} from 'rusty-motors-schema'; +import { getServerLogger } from 'rusty-motors-shared'; +import { transferPartAssembly } from './transferPartAssembly'; +/** + * Create a new car + * + * This function creates a new car for a player. + * + * The car is created using a branded part, a skin, and a trade-in part. + * The car is added to the player's lot and the trade-in part is removed from the player's lot. + * The player's account is debited for the cost of the car and the trade-in value is added to the player's account. + * The car is removed from the wholesaler's lot. + * The transaction is committed if all operations are successful. + * If any operation fails, the transaction is rolled back and an error is thrown. + * + * @param {number} lotOwnerId + * @param {number} brandedPartId + * @param {number} skinId + * @param {number} playerId + * @param {number} tradeInId + * @returns {Promise} The new car's ID + * @throws {Error} If the lot owner ID is not found + * @throws {Error} If the branded part ID is not found + * @throws {Error} If the skin ID is not found + * @throws {Error} If the player ID is not found + * @throws {Error} If the trade-in ID is not found + * @throws {Error} If the car is out of stock + * @throws {Error} If the trade-in is not owned by the player + * @throws {Error} If the trade-in value cannot be determined + * @throws {Error} If the trade-in lot is not found + * @throws {Error} If the trade-in can not be scrapped + * @throws {Error} If the trade-in value can not be added to the player's account + * @throws {Error} If the trade-in cannot be removed from the player's lot + * @throws {Error} If the player does not have enough money to buy the car + * @throws {Error} If the car cannot be removed from the wholesaler's lot + * @throws {Error} If the car cannot be added to the player's lot + * @throws {Error} If the part cannot be created + * @throws {Error} If the vehicle cannot be created + * @throws {Error} If the player does not have enough room in their lot + * @throws {Error} If the sale cannot be recorded + */ +export async function createNewCar( + lotOwnerId: number, + brandedPartId: number, + skinId: number, + playerId: number, + tradeInId: number +): Promise { + const log = getServerLogger(); + log.setName('createNewCar'); + + log.debug(`Creating new car for player ${playerId}`); + let currentAbstractCarId = 0; + let currentPartId = 0; + let currentParentPartId = 0; + let currentBrandedPartId = 0; + let currentAttachmentPointId = 0; + let currentMaxItemWear = 0; + let currentRetailPrice = 0; + let scrapyardLotId = 0; + let tradeInValue = 0; + let cost = 0; + let rc = 0; + let dealOfTheDayBrandedPartId = 0; + let dealOfTheDayDiscount = 0; + let ownerID = 0; + let retailPrice = 0; + let maxItemWear = 0; + let tradeInPartCount = 0; + let carPartCount = 0; + let currectPartCounter = 0; + let carClass = 0; + + type record = { + partId: number; + parentPartId: number; + brandedPartId: number; + attachmentPointId: number; + abstractPartTypeId: number; + parentAbstractPartTypeId: number; + maxItemWear: number; + retailPrice: number; + }; + + const partRecords: record[] = []; + + const db = getDatabase(); + + const parts = await db + .select() + .from(stockAssemblySchema) + .where(eq(brandedPartSchema.brandedPartId, brandedPartId)); + + if (parts.length === 0) { + throw Error(`Branded part ${brandedPartId} not found`); + } + + await db.transaction(async (tx) => { + log.debug('Transaction started'); + + let tradeInValue = 0; + let scrapyardLotId = 0; + let dealOfTheDayBrandedPartId: number | null = null; + let dealOfTheDayDiscount = 0; + let ownerID = 0; + let retailPrice = 0; + let maxItemWear = 0; + let tradeInPartCount = 0; + let carPartCount = 0; + + dealOfTheDayBrandedPartId = await tx + .select({ + brandedPartId: warehouseSchema.brandedPartId, + }) + .from(warehouseSchema) + .where(eq(warehouseSchema.playerId, lotOwnerId)) + .limit(1) + .then((result) => { + return result[0]?.brandedPartId ?? null; + }); + + if (!dealOfTheDayBrandedPartId) { + log.debug('Deal of the day not found'); + } + + const lotExists: boolean = await tx + .select({ + playerID: warehouseSchema.playerId, + }) + .from(warehouseSchema) + .where(eq(warehouseSchema.playerId, lotOwnerId)) + .limit(1) + .then((result) => { + return !!result[0]; + }); + + if (!lotExists) { + tx.rollback(); + throw new Error(`Lot owner ${lotOwnerId} not found`); + } + + if (tradeInId) { + const validTradeIn = await tx + .select({ + ownerID: partSchema.ownerId, + }) + .from(partSchema) + .where(eq(partSchema.partId, tradeInId)) + .limit(1) + .then((result) => { + return result[0]?.ownerID === playerId; + }); + + if (!validTradeIn) { + tx.rollback(); + throw new Error( + `Trade-in ${tradeInId} not owned by player ${playerId}` + ); + } + + tradeInValue = await tx + .select({ + scrapValue: partSchema.scrapValue, + }) + .from(partSchema) + .where(eq(partSchema.partId, tradeInId)) + .limit(1) + .then((result) => { + return result[0]?.scrapValue ?? 0; + }); + + if (!tradeInValue) { + tx.rollback(); + throw new Error( + `Trade-in value not found for part ${tradeInId}` + ); + } + + const scrapyardLotFound = await tx + .select({ + playerID: warehouseSchema.playerId, + }) + .from(warehouseSchema) + .where(eq(warehouseSchema.playerId, scrapyardLotId)) + .then((result) => { + return !!result[0]; + }); + + if (!scrapyardLotFound) { + tx.rollback(); + throw new Error(`Scrapyard lot ${scrapyardLotId} not found`); + } + + try { + const resultOfScrap = await transferPartAssembly( + tradeInId, + scrapyardLotId + ); + } catch (error) { + log.error(`Error scrapping trade-in ${tradeInId}: ${error}`); + tx.rollback(); + throw error; + } + + // Get the owner + + const newOwner = await tx + .select() + .from(playerSchema) + .where(eq(playerSchema.playerId, playerId)) + .limit(1) + .then((result) => { + return result[0]; + }); + + if (!newOwner) { + log.error(`Player ${playerId} not found`); + tx.rollback(); + throw new Error(`Player ${playerId} not found`); + } + + const oldBankBalance = newOwner.bankBalance; + + if (oldBankBalance === null) { + log.error(`Error getting bank balance for player ${playerId}`); + tx.rollback(); + throw new Error( + `Error getting bank balance for player ${playerId}` + ); + } + + if (tradeInValue > 0) { + const newbankBalance = oldBankBalance + tradeInValue; + try { + await tx + .update(playerSchema) + .set({ + bankBalance: newbankBalance, + }) + .where(eq(playerSchema.playerId, playerId)); + } catch (error) { + log.error( + `Error adding trade-in value to player ${playerId}: ${error}` + ); + tx.rollback(); + throw new Error( + `Error adding trade-in value to player ${playerId}: ${error}` + ); + } + } + + // Old car trade-in complete + } + + const result = await tx + .select({ + carClass: stockVehicleAttributesSchema.carClass, + retailPrice: stockVehicleAttributesSchema.retailPrice, + }) + .from(stockVehicleAttributesSchema) + .where( + eq(stockVehicleAttributesSchema.brandedPartId, brandedPartId) + ) + .limit(1); + + if (typeof result[0] === 'undefined') { + tx.rollback(); + throw new Error(`Car ${brandedPartId} out of stock`); + } + + carClass = result[0].carClass; + retailPrice = result[0].retailPrice; + + if (dealOfTheDayBrandedPartId === brandedPartId) { + dealOfTheDayDiscount = await tx + .select({ + discount: tunablesSchema.dealOfTheDayDiscount, + }) + .from(tunablesSchema) + .limit(1) + .then((result) => { + return result[0]?.discount ?? 0; + }); + } + + log.debug('Transaction committed'); + }); + log.resetName(); + return Promise.resolve(0); +} diff --git a/packages/database/src/functions/getAbstractPartTypeId.ts b/packages/database/src/functions/getAbstractPartTypeId.ts new file mode 100644 index 000000000..730a07d95 --- /dev/null +++ b/packages/database/src/functions/getAbstractPartTypeId.ts @@ -0,0 +1,53 @@ +import { eq } from 'drizzle-orm'; +import { getDatabase } from 'rusty-motors-database'; +import { + brandedPart as brandedPartSchema, + part as partSchema, + partType as partTypeSchema, +} from 'rusty-motors-schema'; +import { getServerLogger } from 'rusty-motors-shared'; + +/** + * Get the abstract part type id from the partId + * + * @param partId The part id + * @returns The abstract part type id + * @throws {Error} If the part ID is not found + * @throws {Error} If the abstract part type ID is not found + */ +export async function getAbstractPartTypeId(partId: number): Promise { + const log = getServerLogger(); + log.setName('getAbstractPartTypeId'); + + log.debug(`Getting abstract part type ID for part ${partId}`); + + const db = getDatabase(); + + const abstractPartTypeId = await db + .select() + .from(partSchema) + .leftJoin( + brandedPartSchema, + eq(partSchema.brandedPartId, brandedPartSchema.brandedPartId) + ) + .leftJoin( + partTypeSchema, + eq(brandedPartSchema.partTypeId, partTypeSchema.partTypeId) + ) + .where(eq(partSchema.partId, partId)) + .limit(1) + .then((rows) => { + if (rows.length === 0) { + throw new Error(`Part ${partId} not found`); + } + + return rows[0]?.part_type?.abstractPartTypeId; + }); + + if (typeof abstractPartTypeId === 'undefined') { + log.error(`Abstract part type ID not found for part ${partId}`); + throw new Error(`Abstract part type ID not found for part ${partId}`); + } + + return abstractPartTypeId; +} diff --git a/packages/database/src/functions/getWarehouseInventory.ts b/packages/database/src/functions/getWarehouseInventory.ts new file mode 100644 index 000000000..566989f49 --- /dev/null +++ b/packages/database/src/functions/getWarehouseInventory.ts @@ -0,0 +1,73 @@ +import { db, WarehouseSchema, getTuneables, sql } from 'rusty-motors-database'; +import { getServerLogger } from 'rusty-motors-shared'; + +export type WarehouseInventory = { + inventory: { + brandedPartId: number; + retailPrice: number | null; + isDealOfTheDay: number; + }[]; + dealOfTheDayDiscount: number; +}; + +export async function getWarehouseInventory( + warehouseId: number, + brandId: number +): Promise { + const log = getServerLogger(); + log.setName('getWarehouseInventory'); + + log.debug( + `Getting warehouse inventory for part ${brandId} in warehouse ${warehouseId}` + ); + + let inventoryCars: { + brandedPartId: number; + retailPrice: number | null; + isDealOfTheDay: number; + }[] = []; + + const tunables = getTuneables(); + + const dealOfTheDayDiscount = tunables.getDealOfTheDayDiscount(); + const dealOfTheDayBrandedPartId = tunables.getDealOfTheDayBrandedPartId(); + + + if (dealOfTheDayDiscount < 1) { + log.warn('Deal of the day not found'); + } + + if (brandId > 0) { + inventoryCars = await db.query(sql` + SELECT + brandedPartId: warehouseSchema.brandedPartId, + retailPrice: stockVehicleAttributesSchema.retailPrice, + isDealOfTheDay: warehouseSchema.isDealOfTheDay, + FROM warehouse w + LEFT JOIN branded_part bp ON w.brandedPartId = bp.brandedPartId + LEFT JOIN model m ON bp.modelId = m.modelId + LEFT JOIN stock_vehicle_attributes sva ON w.brandedPartId = sva.brandedPartId + WHERE w.playerId = ${warehouseId} AND m.brandId = ${brandId} + `); + } else { + inventoryCars = await db.query(sql` + SELECT + brandedPartId: warehouseSchema.brandedPartId, + retailPrice: stockVehicleAttributesSchema.retailPrice, + isDealOfTheDay: warehouseSchema.isDealOfTheDay, + FROM warehouse w + LEFT JOIN branded_part bp ON w.brandedPartId = bp.brandedPartId + LEFT JOIN model m ON bp.modelId = m.modelId + LEFT JOIN stock_vehicle_attributes sva ON w.brandedPartId = sva.brandedPartId + WHERE w.playerId = ${warehouseId} + `); + } + + const inventory = { + inventory: inventoryCars, + dealOfTheDayDiscount: dealOfTheDayDiscount ?? 0, + }; + + log.resetName(); + return inventory; +} diff --git a/packages/database/src/functions/transferPartAssembly.ts b/packages/database/src/functions/transferPartAssembly.ts new file mode 100644 index 000000000..85e7cd1b0 --- /dev/null +++ b/packages/database/src/functions/transferPartAssembly.ts @@ -0,0 +1,162 @@ +import { eq } from 'drizzle-orm'; +import { getDatabase } from 'rusty-motors-database'; +import { + part as partSchema, + player as playerSchema, + vehicle as vehicleSchema, +} from 'rusty-motors-schema'; +import { getServerLogger } from 'rusty-motors-shared'; +import { getAbstractPartTypeId } from './getAbstractPartTypeId'; + +const ABSTRACT_PART_TYPE_ID_CAR = 101; + +/** + * Transfer a part assembly + * + * This function transfers a part assembly from one owner to another, including all child parts. + * + * This function does NOT use a transaction. + * + * @param {number} partId + * @param {number} newOwnerId + * + * @returns {Promise} + * @throws {Error} If the part ID is not found + * @throws {Error} If the new owner ID is not found + * @throws {Error} If the part cannot be transferred + */ +export async function transferPartAssembly( + partId: number, + newOwnerId: number +): Promise { + const log = getServerLogger(); + const db = getDatabase(); + log.setName('transferPartAssembly'); + + log.debug( + `Transferring part assembly ${partId} to new owner ${newOwnerId}` + ); + + const topPart = await db + .select() + .from(partSchema) + .where(eq(partSchema.partId, partId)) + .limit(1) + .then((rows) => rows[0]); + + if (typeof topPart === 'undefined') { + log.error(`Part ${partId} not found`); + throw new Error(`Part ${partId} not found`); + } + + if (topPart.ownerId === null) { + log.error(`Part ${partId} has no owner`); + throw new Error(`Part ${partId} has no owner`); + } + + if (topPart.ownerId === newOwnerId) { + log.error(`Part ${partId} is already owned by ${newOwnerId}`); + throw new Error(`Part ${partId} is already owned by ${newOwnerId}`); + } + + const newOwnerExists = await db + .select() + .from(playerSchema) + .where(eq(playerSchema.playerId, newOwnerId)) + .limit(1) + .then((rows) => rows[0] !== undefined); + + if (!newOwnerExists) { + log.error(`Owner ${newOwnerId} not found`); + throw new Error(`Owner ${newOwnerId} not found`); + } + + const children = await db + .select() + .from(partSchema) + .where(eq(partSchema.parentPartId, partId)) + .then((rows) => rows); + + if (children.length === 0) { + log.error(`Part ${partId} has no children`); + throw new Error(`Part ${partId} has no children`); + } + + try { + // If the part is a car, update the owner ID in the vehicle table + const isPartACar = await getAbstractPartTypeId( + topPart.brandedPartId + ).then( + (abstractPartTypeId) => + abstractPartTypeId === ABSTRACT_PART_TYPE_ID_CAR + ); + + if (isPartACar) { + const car = await db + .select() + .from(vehicleSchema) + .where(eq(vehicleSchema.vehicleId, partId)) + .limit(1) + .then((rows) => rows[0]); + + if (typeof car === 'undefined') { + log.error(`Vehicle ${partId} not found`); + throw Error(`Vehicle ${partId} not found`); + } + + // Remove the vehicle from the old owner's lot + const oldOwner = await db + .select() + .from(playerSchema) + .where(eq(playerSchema.playerId, topPart.ownerId)) + .limit(1) + .then((rows) => rows[0]); + + if (typeof oldOwner === 'undefined') { + log.error(`Owner ${topPart.ownerId} not found`); + throw Error(`Owner ${topPart.ownerId} not found`); + } + + if (oldOwner.numCarsOwned > 0) { + oldOwner.numCarsOwned--; + try { + await db + .update(playerSchema) + .set(oldOwner) + .where(eq(playerSchema.playerId, topPart.ownerId)); + } catch (error) { + log.error( + `Error updating old owner ${topPart.ownerId}: ${String( + error + )}` + ); + throw new Error( + `Error updating old owner ${topPart.ownerId}: ${String( + error + )}` + ); + } + } else { + log.error(`Owner ${topPart.ownerId} has no cars`); + throw Error(`Owner ${topPart.ownerId} has no cars`); + } + } + + // Transfer the children + + for (const child of children) { + await transferPartAssembly(child.partId, newOwnerId); + } + + // Update the parent part's owner ID + await db + .update(partSchema) + .set({ ownerId: newOwnerId }) + .where(eq(partSchema.partId, partId)); + } catch (error) { + log.error(`Error transferring part ${partId}: ${String(error)}`); + throw new Error(`Error transferring part ${partId}: ${String(error)}`); + } + + log.debug(`Part assembly ${partId} transferred to new owner ${newOwnerId}`); +} diff --git a/packages/database/src/seeders/index.ts b/packages/database/src/seeders/index.ts new file mode 100644 index 000000000..631c9761d --- /dev/null +++ b/packages/database/src/seeders/index.ts @@ -0,0 +1,198 @@ +const playerCsvHeader = [ + "player_id", + "customer_id", + "player_type_id", + "sanctioned_score", + "challenge_score", + "last_logged_in", + "times_logged_in", + "bank_balance", + "num_cars_owned", + "is_logged_in", + "driver_style", + "lp_code", + "lp_text", + "car_num_1", + "car_num_2", + "car_num_3", + "car_num_4", + "car_num_5", + "car_num_6", + "dl_number", + "persona", + "address", + "residence", + "vehicle_id", + "current_race_id", + "offline_driver_skill", + "offline_grudge", + "offline_reputation", + "total_time_played", + "car_info_setting", + "stock_classic_class", + "stock_muscle_class", + "modified_classic_class", + "modified_muscle_class", + "outlaw_class", + "drag_class", + "challenge_rung", + "offline_ai_car_class", + "offline_ai_skin_id", + "offline_ai_car_bpt_id", + "offline_ai_state", + "bodytype", + "skin_color", + "hair_color", + "shirt_color", + "pants_color", + "offline_driver_style", + "offline_driver_attitude", + "evaded_fuzz", + "pinks_won", + "num_unread_mail", + "total_races_run", + "total_races_won", + "total_races_completed", + "total_winnings", + "insurance_risk_points", + "insurance_rating", + "challenge_races_run", + "challenge_races_won", + "challenge_races_completed", + "cars_lost", + "cars_won", +]; + +const playerCsvRow = [ + [ + 6, + 0, + 1, + 0, + 0, + new Date(0), + 0, + 999999, + 0, + 0, + 0, + 0, + null, + 0, + 0, + 0, + 0, + 0, + 0, + "xxx", + "All Factory Ford", + "1240 A Street", + "ABCDEFGHIJKLMNOPQRST", + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + ], +]; + +export function csvRowToPlayer(row: (string | number | Date | null)[]): typeof playerSchema.$inferSelect { + return { + playerId: row[0] as number, + customerId: row[1] as number, + playerTypeId: row[2] as number, + sanctionedScore: row[3] as number, + challengeScore: row[4] as number, + lastLoggedIn: row[5] as Date, + timesLoggedIn: row[6] as number, + bankBalance: row[7] as number, + numCarsOwned: row[8] as number, + isLoggedIn: row[9] as number, + driverStyle: row[10] as number, + lpCode: row[11] as number, + lpText: row[12] as string | null, + carNum1: row[13] as string, + carNum2: row[14] as string, + carNum3: row[15] as string, + carNum4: row[16] as string, + carNum5: row[17] as string, + carNum6: row[18] as string, + dlNumber: row[19] as string, + persona: row[20] as string, + address: row[21] as string, + residence: row[22] as string, + vehicleId: row[23] as number | null, + currentRaceId: row[24] as number | null, + offlineDriverSkill: row[25] as number | null, + offlineGrudge: row[26] as number | null, + offlineReputation: row[27] as number | null, + totalTimePlayed: row[28] as number | null, + carInfoSetting: row[29] as number | null, + stockClassicClass: row[30] as number | null, + stockMuscleClass: row[31] as number | null, + modifiedClassicClass: row[32] as number | null, + modifiedMuscleClass: row[33] as number | null, + outlawClass: row[34] as number | null, + dragClass: row[35] as number | null, + challengeRung: row[36] as number | null, + offlineAiCarClass: row[37] as number | null, + offlineAiSkinId: row[38] as number | null, + offlineAiCarBptId: row[39] as number | null, + offlineAiState: row[40] as number | null, + bodytype: row[41] as number | null, + skinColor: row[42] as number | null, + hairColor: row[43] as number | null, + shirtColor: row[44] as number | null, + pantsColor: row[45] as number | null, + offlineDriverStyle: row[46] as number | null, + offlineDriverAttitude: row[47] as number | null, + evadedFuzz: row[48] as number | null, + pinksWon: row[49] as number | null, + numUnreadMail: row[50] as number | null, + totalRacesRun: row[51] as number | null, + totalRacesWon: row[52] as number | null, + totalRacesCompleted: row[53] as number | null, + totalWinnings: row[54] as number | null, + insuranceRiskPoints: row[55] as number | null, + insuranceRating: row[56] as number | null, + challengeRacesRun: row[57] as number | null, + challengeRacesWon: row[58] as number | null, + challengeRacesCompleted: row[59] as number | null, + carsLost: row[60] as number | null, + carsWon: row[61] as number | null, + }; +} + +for (const row of playerCsvRow) { + if (row.length !== playerCsvHeader.length) { + throw new Error(`Row length does not match header length: got ${row.length}, expected ${playerCsvHeader.length}`); + } + + const player = [csvRowToPlayer(row.map((value, index) => { + if (typeof value === "undefined") { + throw new Error(`Undefined value at index ${playerCsvHeader[index]}`); + } + + return value; + }))]; +} diff --git a/packages/database/src/services/database.ts b/packages/database/src/services/database.ts new file mode 100644 index 000000000..880610fda --- /dev/null +++ b/packages/database/src/services/database.ts @@ -0,0 +1,36 @@ +import createConnectionPool, { sql } from '@databases/pg'; +import tables from '@databases/pg-typed'; +import type DatabaseSchema from '../__generated__/index.js'; +const DatabaseSchema = await import('../__generated__/schema.json'); + +export { sql }; + +export const db = createConnectionPool(); + +// You can list whatever tables you actually have here: +export const { + abstract_part_type: AbstractPartTypeSchema, + attachment_point: AttachmentPointSchema, + brand: BrandSchema, + branded_part: BrandedPartSchema, + driver_class: DriverClassSchema, + model: ModelSchema, + part: PartSchema, + part_grade: PartGradeSchema, + part_type: PartTypeSchema, + player: PlayerSchema, + player_type: PlayerTypeSchema, + pt_skin: PlayerTypeSkinSchema, + skin_type: SkinTypeSchema, + stock_assembly: StockAssemblySchema, + stock_vehicle_attributes: StockVehicleAttributesSchema, + sva_car_class: StockVehicleAttributesCarClassSchema, + sva_mode_restriction: StockVehicleAttributesModeRestrictionSchema, + vehicle: VehicleSchema, + warehouse: WarehouseSchema, + login: LoginSchema, + profile: ProfileSchema, +} = tables({ + databaseSchema: DatabaseSchema.default, +}); +export type { DatabaseSchema }; diff --git a/packages/database/src/services/tunables.ts b/packages/database/src/services/tunables.ts new file mode 100644 index 000000000..088eac8af --- /dev/null +++ b/packages/database/src/services/tunables.ts @@ -0,0 +1,578 @@ +class Tunables { + private static instance: Tunables; + private clubCreationFee: number; + private clubCreationMinimumLevel: number; + private clubOfficerMinimumLevel: number; + private racePPDefeatedOpponent: number; + private racePPPlaceLost: number; + private racePenaltyPerRank: number; + private raceBonusPerRank: number; + private raceBonusPerMileSponsored: number; + private raceBonusPerMileOpen: number; + private levelsTunelog: number; + private levelsSlope: number; + private levelsOffset: number; + private maxEZStreetLevel: number; + private clubWaitPeriodBetweenClubs: number; + private turfwarCaptionBonus: number; + private turfwarMemberBonus: number; + private topDogBonus: number; + private rankAdvancementBonus: number; + private ttCashRewardFirst: number; + private ttCashRewardSecond: number; + private ttCashRewardThird: number; + private ttPointsRewardFirst: number; + private ttPointsRewardSecond: number; + private ttPointsRewardThird: number; + private universalRepairCostModifier: number; + private universalScrapValueModifier: number; + private adCost1Day: number; + private adCost2Days: number; + private adCost3Days: number; + private adCost4Days: number; + private adCost5Days: number; + private adCost6Days: number; + private adCost7Days: number; + private tradeInModifier: number; + private simStreetMaxWager: number; + private pointAward1stPlace: number; + private pointAward2ndPlace: number; + private pointAward3rdPlace: number; + private pointAward4thPlace: number; + private pointAward5thPlace: number; + private pointAward6thPlace: number; + private arcadeRacePointModifier: number; + private mcotsPoolingFrequency: number; + private starterCash: number; + private enableCheatEmails: number; + private salaryPerLevel: number; + private clubMaxMembers: number; + private clubRegistrationFee: number; + private clubReRegistrationFee: number; + private classifiedAdBillRate: number; + private classifiedAdMaxDays: number; + private classifiedAdMaxSize: number; + private papAwardPercentage: number; + private dealOfTheDayBrandedPartId: number; + private dealOfTheDayDiscount: number; + + private constructor() { + this.clubCreationFee = 5000; + this.clubCreationMinimumLevel = 10; + this.clubOfficerMinimumLevel = 10; + this.racePPDefeatedOpponent = 5; + this.racePPPlaceLost = 1; + this.racePenaltyPerRank = 5; + this.raceBonusPerRank = 5; + this.raceBonusPerMileSponsored = 1; + this.raceBonusPerMileOpen = 1; + this.levelsTunelog = 100; + this.levelsSlope = 1; + this.levelsOffset = 0; + this.maxEZStreetLevel = 100; + this.clubWaitPeriodBetweenClubs = 7; + this.turfwarCaptionBonus = 500; + this.turfwarMemberBonus = 100; + this.topDogBonus = 1000; + this.rankAdvancementBonus = 100; + this.ttCashRewardFirst = 1000; + this.ttCashRewardSecond = 500; + this.ttCashRewardThird = 250; + this.ttPointsRewardFirst = 100; + this.ttPointsRewardSecond = 50; + this.ttPointsRewardThird = 25; + this.universalRepairCostModifier = 100; + this.universalScrapValueModifier = 100; + this.adCost1Day = 100; + this.adCost2Days = 200; + this.adCost3Days = 300; + this.adCost4Days = 400; + this.adCost5Days = 500; + this.adCost6Days = 600; + this.adCost7Days = 700; + this.tradeInModifier = 100; + this.simStreetMaxWager = 100; + this.pointAward1stPlace = 100; + this.pointAward2ndPlace = 75; + this.pointAward3rdPlace = 50; + this.pointAward4thPlace = 25; + this.pointAward5thPlace = 10; + this.pointAward6thPlace = 5; + this.arcadeRacePointModifier = 100; + this.mcotsPoolingFrequency = 100; + this.starterCash = 1000; + this.enableCheatEmails = 1; + this.salaryPerLevel = 100; + this.clubMaxMembers = 10; + this.clubRegistrationFee = 1000; + this.clubReRegistrationFee = 500; + this.classifiedAdBillRate = 100; + this.classifiedAdMaxDays = 7; + this.classifiedAdMaxSize = 100; + this.papAwardPercentage = 10; + this.dealOfTheDayBrandedPartId = 0; + this.dealOfTheDayDiscount = 0; + } + + public static getInstance(): Tunables { + if (!Tunables.instance) { + Tunables.instance = new Tunables(); + } + + return Tunables.instance; + } + + public getClubCreationFee(): number { + return this.clubCreationFee; + } + + public getClubCreationMinimumLevel(): number { + return this.clubCreationMinimumLevel; + } + + public getClubOfficerMinimumLevel(): number { + return this.clubOfficerMinimumLevel; + } + + public getRacePPDefeatedOpponent(): number { + return this.racePPDefeatedOpponent; + } + + public getRacePPPlaceLost(): number { + return this.racePPPlaceLost; + } + + public getRacePenaltyPerRank(): number { + return this.racePenaltyPerRank; + } + + public getRaceBonusPerRank(): number { + return this.raceBonusPerRank; + } + + public getRaceBonusPerMileSponsored(): number { + return this.raceBonusPerMileSponsored; + } + + public getRaceBonusPerMileOpen(): number { + return this.raceBonusPerMileOpen; + } + + public getLevelsTunelog(): number { + return this.levelsTunelog; + } + + public getLevelsSlope(): number { + return this.levelsSlope; + } + + public getLevelsOffset(): number { + return this.levelsOffset; + } + + public getMaxEZStreetLevel(): number { + return this.maxEZStreetLevel; + } + + public getClubWaitPeriodBetweenClubs(): number { + return this.clubWaitPeriodBetweenClubs; + } + + public getTurfwarCaptionBonus(): number { + return this.turfwarCaptionBonus; + } + + public getTurfwarMemberBonus(): number { + return this.turfwarMemberBonus; + } + + public getTopDogBonus(): number { + return this.topDogBonus; + } + + public getRankAdvancementBonus(): number { + return this.rankAdvancementBonus; + } + + public getTtCashRewardFirst(): number { + return this.ttCashRewardFirst; + } + + public getTtCashRewardSecond(): number { + return this.ttCashRewardSecond; + } + + public getTtCashRewardThird(): number { + return this.ttCashRewardThird; + } + + public getTtPointsRewardFirst(): number { + return this.ttPointsRewardFirst; + } + + public getTtPointsRewardSecond(): number { + return this.ttPointsRewardSecond; + } + + public getTtPointsRewardThird(): number { + return this.ttPointsRewardThird; + } + + public getUniversalRepairCostModifier(): number { + return this.universalRepairCostModifier; + } + + public getUniversalScrapValueModifier(): number { + return this.universalScrapValueModifier; + } + + public getAdCost1Day(): number { + return this.adCost1Day; + } + + public getAdCost2Days(): number { + return this.adCost2Days; + } + + public getAdCost3Days(): number { + return this.adCost3Days; + } + + public getAdCost4Days(): number { + return this.adCost4Days; + } + + public getAdCost5Days(): number { + return this.adCost5Days; + } + + public getAdCost6Days(): number { + return this.adCost6Days; + } + + public getAdCost7Days(): number { + return this.adCost7Days; + } + + public getTradeInModifier(): number { + return this.tradeInModifier; + } + + public getSimStreetMaxWager(): number { + return this.simStreetMaxWager; + } + + public getPointAward1stPlace(): number { + return this.pointAward1stPlace; + } + + public getPointAward2ndPlace(): number { + return this.pointAward2ndPlace; + } + + public getPointAward3rdPlace(): number { + return this.pointAward3rdPlace; + } + + public getPointAward4thPlace(): number { + return this.pointAward4thPlace; + } + + public getPointAward5thPlace(): number { + return this.pointAward5thPlace; + } + + public getPointAward6thPlace(): number { + return this.pointAward6thPlace; + } + + public getArcadeRacePointModifier(): number { + return this.arcadeRacePointModifier; + } + + public getMcotsPoolingFrequency(): number { + return this.mcotsPoolingFrequency; + } + + public getStarterCash(): number { + return this.starterCash; + } + + public getEnableCheatEmails(): number { + return this.enableCheatEmails; + } + + public getSalaryPerLevel(): number { + return this.salaryPerLevel; + } + + public getClubMaxMembers(): number { + return this.clubMaxMembers; + } + + public getClubRegistrationFee(): number { + return this.clubRegistrationFee; + } + + public getClubReRegistrationFee(): number { + return this.clubReRegistrationFee; + } + + public getClassifiedAdBillRate(): number { + return this.classifiedAdBillRate; + } + + public getClassifiedAdMaxDays(): number { + return this.classifiedAdMaxDays; + } + + public getClassifiedAdMaxSize(): number { + return this.classifiedAdMaxSize; + } + + public getPapAwardPercentage(): number { + return this.papAwardPercentage; + } + + public getDealOfTheDayBrandedPartId(): number { + return this.dealOfTheDayBrandedPartId; + } + + public getDealOfTheDayDiscount(): number { + return this.dealOfTheDayDiscount; + } + + public setClubCreationFee(clubCreationFee: number): void { + this.clubCreationFee = clubCreationFee; + } + + public setClubCreationMinimumLevel(clubCreationMinimumLevel: number): void { + this.clubCreationMinimumLevel = clubCreationMinimumLevel; + } + + public setClubOfficerMinimumLevel(clubOfficerMinimumLevel: number): void { + this.clubOfficerMinimumLevel = clubOfficerMinimumLevel; + } + + public setRacePPDefeatedOpponent(racePPDefeatedOpponent: number): void { + this.racePPDefeatedOpponent = racePPDefeatedOpponent; + } + + public setRacePPPlaceLost(racePPPlaceLost: number): void { + this.racePPPlaceLost = racePPPlaceLost; + } + + public setRacePenaltyPerRank(racePenaltyPerRank: number): void { + this.racePenaltyPerRank = racePenaltyPerRank; + } + + public setRaceBonusPerRank(raceBonusPerRank: number): void { + this; + } + + public setRaceBonusPerMileSponsored( + raceBonusPerMileSponsored: number + ): void { + this.raceBonusPerMileSponsored = raceBonusPerMileSponsored; + } + + public setRaceBonusPerMileOpen(raceBonusPerMileOpen: number): void { + this.raceBonusPerMileOpen = raceBonusPerMileOpen; + } + + public setLevelsTunelog(levelsTunelog: number): void { + this.levelsTunelog = levelsTunelog; + } + + public setLevelsSlope(levelsSlope: number): void { + this.levelsSlope = levelsSlope; + } + + public setLevelsOffset(levelsOffset: number): void { + this.levelsOffset = levelsOffset; + } + + public setMaxEZStreetLevel(maxEZStreetLevel: number): void { + this.maxEZStreetLevel = maxEZStreetLevel; + } + + public setClubWaitPeriodBetweenClubs( + clubWaitPeriodBetweenClubs: number + ): void { + this.clubWaitPeriodBetweenClubs = clubWaitPeriodBetweenClubs; + } + + public setTurfwarCaptionBonus(turfwarCaptionBonus: number): void { + this.turfwarCaptionBonus = turfwarCaptionBonus; + } + + public setTurfwarMemberBonus(turfwarMemberBonus: number): void { + this.turfwarMemberBonus = turfwarMemberBonus; + } + + public setTopDogBonus(topDogBonus: number): void { + this.topDogBonus = topDogBonus; + } + + public setRankAdvancementBonus(rankAdvancementBonus: number): void { + this.rankAdvancementBonus = rankAdvancementBonus; + } + + public setTtCashRewardFirst(ttCashRewardFirst: number): void { + this.ttCashRewardFirst = ttCashRewardFirst; + } + + public setTtCashRewardSecond(ttCashRewardSecond: number): void { + this.ttCashRewardSecond = ttCashRewardSecond; + } + + public setTtCashRewardThird(ttCashRewardThird: number): void { + this.ttCashRewardThird = ttCashRewardThird; + } + + public setTtPointsRewardFirst(ttPointsRewardFirst: number): void { + this.ttPointsRewardFirst = ttPointsRewardFirst; + } + + public setTtPointsRewardSecond(ttPointsRewardSecond: number): void { + this.ttPointsRewardSecond = ttPointsRewardSecond; + } + + public setTtPointsRewardThird(ttPointsRewardThird: number): void { + this.ttPointsRewardThird = ttPointsRewardThird; + } + + public setUniversalRepairCostModifier( + universalRepairCostModifier: number + ): void { + this.universalRepairCostModifier = universalRepairCostModifier; + } + + public setUniversalScrapValueModifier( + universalScrapValueModifier: number + ): void { + this.universalScrapValueModifier = universalScrapValueModifier; + } + + public setAdCost1Day(adCost1Day: number): void { + this.adCost1Day = adCost1Day; + } + + public setAdCost2Days(adCost2Days: number): void { + this.adCost2Days = adCost2Days; + } + + public setAdCost3Days(adCost3Days: number): void { + this.adCost3Days = adCost3Days; + } + + public setAdCost4Days(adCost4Days: number): void { + this.adCost4Days = adCost4Days; + } + + public setAdCost5Days(adCost5Days: number): void { + this.adCost5Days = adCost5Days; + } + + public setAdCost6Days(adCost6Days: number): void { + this.adCost6Days = adCost6Days; + } + + public setAdCost7Days(adCost7Days: number): void { + this.adCost7Days = adCost7Days; + } + + public setTradeInModifier(tradeInModifier: number): void { + this.tradeInModifier = tradeInModifier; + } + + public setSimStreetMaxWager(simStreetMaxWager: number): void { + this.simStreetMaxWager = simStreetMaxWager; + } + + public setPointAward1stPlace(pointAward1stPlace: number): void { + this.pointAward1stPlace = pointAward1stPlace; + } + + public setPointAward2ndPlace(pointAward2ndPlace: number): void { + this.pointAward2ndPlace = pointAward2ndPlace; + } + + public setPointAward3rdPlace(pointAward3rdPlace: number): void { + this.pointAward3rdPlace = pointAward3rdPlace; + } + + public setPointAward4thPlace(pointAward4thPlace: number): void { + this.pointAward4thPlace = pointAward4thPlace; + } + + public setPointAward5thPlace(pointAward5thPlace: number): void { + this.pointAward5thPlace = pointAward5thPlace; + } + + public setPointAward6thPlace(pointAward6thPlace: number): void { + this.pointAward6thPlace = pointAward6thPlace; + } + + public setArcadeRacePointModifier(arcadeRacePointModifier: number): void { + this.arcadeRacePointModifier = arcadeRacePointModifier; + } + + public setMcotsPoolingFrequency(mcotsPoolingFrequency: number): void { + this.mcotsPoolingFrequency = mcotsPoolingFrequency; + } + + public setStarterCash(starterCash: number): void { + this.starterCash = starterCash; + } + + public setEnableCheatEmails(enableCheatEmails: number): void { + this.enableCheatEmails = enableCheatEmails; + } + + public setSalaryPerLevel(salaryPerLevel: number): void { + this.salaryPerLevel = salaryPerLevel; + } + + public setClubMaxMembers(clubMaxMembers: number): void { + this.clubMaxMembers = clubMaxMembers; + } + + public setClubRegistrationFee(clubRegistrationFee: number): void { + this.clubRegistrationFee = clubRegistrationFee; + } + + public setClubReRegistrationFee(clubReRegistrationFee: number): void { + this.clubReRegistrationFee = clubReRegistrationFee; + } + + public setClassifiedAdBillRate(classifiedAdBillRate: number): void { + this.classifiedAdBillRate = classifiedAdBillRate; + } + + public setClassifiedAdMaxDays(classifiedAdMaxDays: number): void { + this.classifiedAdMaxDays = classifiedAdMaxDays; + } + + public setClassifiedAdMaxSize(classifiedAdMaxSize: number): void { + this.classifiedAdMaxSize = classifiedAdMaxSize; + } + + public setPapAwardPercentage(papAwardPercentage: number): void { + this.papAwardPercentage = papAwardPercentage; + } + + public setDealOfTheDayBrandedPartId( + dealOfTheDayBrandedPartId: number + ): void { + this.dealOfTheDayBrandedPartId = dealOfTheDayBrandedPartId; + } + + public setDealOfTheDayDiscount(dealOfTheDayDiscount: number): void { + this.dealOfTheDayDiscount = dealOfTheDayDiscount; + } +} + +export function getTunables(): Tunables { + return Tunables.getInstance(); +} diff --git a/packages/database/test/Database.test.ts b/packages/database/test/Database.test.ts index db7351c2b..e89386b47 100644 --- a/packages/database/test/Database.test.ts +++ b/packages/database/test/Database.test.ts @@ -1,72 +1,66 @@ -import { describe, expect, it } from "vitest"; -import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; -import { Database } from "../src/DatabaseManager.js"; +import { describe, it, expect } from "vitest"; +import { + fetchSessionKeyByCustomerId, + fetchSessionKeyByConnectionId, + updateUser, +} from "rusty-motors-database"; + + + describe("Database", () => { - it("returns the same instance", () => { - // arrange - const log = getServerLogger({}); - // act - const instance1 = Database.getInstance(log); - const instance2 = Database.getInstance(log); - // assert - expect(instance1).toEqual(instance2); - }); + describe("fetchSessionKeyByCustomerId", () => { + it("throws when session key is not found", async () => { + // arrange + + const customerId = 1234; + // act + try { + await fetchSessionKeyByCustomerId(customerId); + } catch (error) { + // assert + expect(error).toEqual( + new Error( + `Session key not found for customer ${customerId}`, + ), + ); + } + }); + }); + + describe("fetchSessionKeyByConnectionId", () => { + it("throws when session key is not found", async () => { + // arrange - describe("fetchSessionKeyByCustomerId", () => { - it("throws when session key is not found", async () => { - // arrange - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const customerId = 1234; - // act - try { - await instance.fetchSessionKeyByCustomerId(customerId); - } catch (error) { - // assert - expect(error).toEqual( - new ServerError(`Session key not found for customer ${customerId}`), - ); - } - }); - }); + const connectionId = "1234"; + // act + try { + await fetchSessionKeyByConnectionId(connectionId); + } catch (error) { + // assert + expect(error).toEqual( + new Error( + `Session key not found for connection ${connectionId}`, + ), + ); + } + }); + }); - describe("fetchSessionKeyByConnectionId", () => { - it("throws when session key is not found", async () => { - // arrange - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const connectionId = "1234"; - // act - try { - await instance.fetchSessionKeyByConnectionId(connectionId); - } catch (error) { - // assert - expect(error).toEqual( - new ServerError( - `Session key not found for connection ${connectionId}`, - ), - ); - } - }); - }); + describe("updateUser", () => { + it("returns successfully when passed a valid user record", () => { + // arrange - describe("updateUser", () => { - it("returns successfully when passed a valid user record", async () => { - // arrange - const log = getServerLogger({}); - const instance = Database.getInstance(log); - const userRecord = { - contextId: "1234", - customerId: 1234, - userId: 1234, - userData: Buffer.from("1234"), - }; - // act + assert - expect(() => { - instance.updateUser(userRecord); - }).not.toThrow(); - }); - }); + const userRecord = { + contextId: "1234", + customerId: 1234, + userId: 1234, + userData: Buffer.from("1234"), + }; + // act + assert + expect(async () => { + await updateUser(userRecord); + }).not.toThrow(); + }); + }); }); diff --git a/packages/database/vite.config.ts b/packages/database/vite.config.ts index 01911fd2b..fb851b55a 100644 --- a/packages/database/vite.config.ts +++ b/packages/database/vite.config.ts @@ -1,22 +1,22 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ - test: { - coverage: { - enabled: true, - all: true, - exclude: [ - "src/**/*.spec.ts", - "src/**/*.test.ts", - "bin/**/*.ts", - "ecosystem.config.js", - "migrate.ts", - "packages/**/*.d.ts", - ], - reporter: ["lcov", "text", "cobertura"], - }, - reporters: ["junit", "default", "hanging-process"], - outputFile: "mcos.junit.xml", - pool: "forks", - }, + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0006e4afb..ddb581e50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,10 @@ importers: dependencies: '@adminjs/sequelize': specifier: ^4.1.1 - version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3) + version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0)) + '@databases/pg': + specifier: ^5.5.0 + version: 5.5.0(typescript@5.5.4) '@fastify/sensible': specifier: ^5.5.0 version: 5.6.0 @@ -35,9 +38,12 @@ importers: rusty-motors-gateway: specifier: link:packages/gateway version: link:packages/gateway + rusty-motors-nps: + specifier: link:packages/nps + version: link:packages/nps sequelize: specifier: ^6.35.2 - version: 6.37.3 + version: 6.37.3(pg@8.12.0) sqlite: specifier: ^5.1.1 version: 5.1.1 @@ -48,6 +54,12 @@ importers: '@biomejs/biome': specifier: 1.8.3 version: 1.8.3 + '@databases/pg-migrations': + specifier: ^5.0.3 + version: 5.0.3(typescript@5.5.4) + '@databases/pg-test': + specifier: ^3.1.2 + version: 3.1.2(typescript@5.5.4) '@sentry/cli': specifier: ^2.23.1 version: 2.33.1 @@ -157,6 +169,9 @@ importers: pg-hstore: specifier: ^2.3.4 version: 2.3.4 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.16.1) packages/gateway: dependencies: @@ -937,6 +952,9 @@ packages: '@databases/lock@2.1.0': resolution: {integrity: sha512-ReWnFE5qeCuO2SA5h5fDh/hE/vMolA+Epe6xkAQP1FL2nhnsTCYwN2JACk/kWctR4OQoh0njBjPZ0yfIptclcA==} + '@databases/migrations-base@3.0.1': + resolution: {integrity: sha512-CutCQ1AjsEWqSuXInD8KwaZYa3/InYGFu3uZ/2pu0Ku4MHRab14+sKNXLk/dxHaJLplngLtCraBo8rL7/21Vhg==} + '@databases/pg-bulk@1.2.0': resolution: {integrity: sha512-GdzwFIllgOtuKbro4r6QBe0+4LipaUwb8+N7+z9QP+wg3XozGLnojnMFQlBrrc70jycw4aCM1O30w4vYtVlR/Q==} peerDependencies: @@ -954,6 +972,10 @@ packages: '@databases/pg-errors@1.0.0': resolution: {integrity: sha512-Yz3exbptZwOn4ZD/MSwY6z++XVyOFsMh5DERvSw3awRwJFnfdaqdeiIxxX0MVjM6KPihF0xxp8lPO7vTc5ydpw==} + '@databases/pg-migrations@5.0.3': + resolution: {integrity: sha512-mUKbVYiACRZJOhE96Y5Fr2IIJ2iBNPVM6L3LgBypH9zIQMOLixGpJ6ZS0oabtNIFJhjncXl5FVEtYaa8x5KkoA==} + hasBin: true + '@databases/pg-schema-cli@4.4.0': resolution: {integrity: sha512-pwLEjFrPl8Gk+7KmSbHHW9kYnUIWN9/V8DCb9Gwee7hXRkZeEZg9thdprG/ngxIdf983MfHyA/8np78IyNyhqg==} hasBin: true @@ -966,6 +988,10 @@ packages: peerDependencies: '@databases/pg-schema-introspect': '*' + '@databases/pg-test@3.1.2': + resolution: {integrity: sha512-vd4+GxsBUcqmmPg2+Ovz8yhD4dtoyxKq/4S1n0XaraWaESaNyRLTnGvJcxbdtWTXv8dx9lfoBHmJaqc1jmJG8g==} + hasBin: true + '@databases/pg-typed@4.4.1': resolution: {integrity: sha512-7UU7RzVKsB3WUfDm3rMI0x0lw79oNtzGQLTG5tVrpSlUxvHBRaZWm4F6kiov3Wo/HVxtQA+d9trGHcvfGOh+dw==} peerDependencies: @@ -997,6 +1023,9 @@ packages: '@databases/validate-unicode@1.0.0': resolution: {integrity: sha512-dLKqxGcymeVwEb/6c44KjOnzaAafFf0Wxa8xcfEjx/qOl3rdijsKYBAtIGhtVtOlpPf/PFKfgTuFurSPn/3B/g==} + '@databases/with-container@2.1.1': + resolution: {integrity: sha512-iHsOn/6ElWuGpcytgNh9ZAvFd78G0ikOMWj0DtMTB4fXVqRA5uYZpLpLv/fvwL895xT7VTbVA6HV3YoY0yuQUg==} + '@emotion/babel-plugin@11.12.0': resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} @@ -2273,6 +2302,9 @@ packages: '@types/connect@3.4.36': resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + '@types/cross-spawn@6.0.6': + resolution: {integrity: sha512-fXRhhUkG4H3TQk5dBhQ7m/JDdSNHKwR2BBia62lhwEIq9xGiQKLxd6LymNhn47SjXhsUEPmxi+PKw2OkW4LLjA==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} @@ -2473,6 +2505,10 @@ packages: add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + address@1.2.2: + resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} + engines: {node: '>= 10.0.0'} + adminjs@7.8.11: resolution: {integrity: sha512-ytrNi1fUOXgMEnGTnsQrAbR1DFJC75SaR3zWUr+SeemriRv89j7jfk4IFXiyXAd+satsRA+v+pTsizJ3ZuC6rQ==} engines: {node: '>=16.0.0'} @@ -2544,12 +2580,19 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} @@ -2574,6 +2617,10 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + avvio@8.4.0: resolution: {integrity: sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA==} @@ -2783,6 +2830,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -2911,6 +2962,10 @@ packages: cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -2966,6 +3021,10 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + deep-equal@2.2.3: + resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} + engines: {node: '>= 0.4'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -2980,6 +3039,10 @@ packages: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3000,6 +3063,11 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + detect-port@1.6.1: + resolution: {integrity: sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==} + engines: {node: '>= 4.0.0'} + hasBin: true + diff-sequences@29.6.3: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3070,6 +3138,9 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + esbuild@0.19.12: resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} engines: {node: '>=12'} @@ -3294,6 +3365,9 @@ packages: debug: optional: true + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -3317,6 +3391,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + funtypes@4.2.0: resolution: {integrity: sha512-DvOtjiKvkeuXGV0O8LQh9quUP3bSOTEQPGv537Sao8kDq2rDbg48UsSJ7wlBLPzR2Mn0pV7cyAiq5pYG1oUyCQ==} @@ -3426,6 +3503,9 @@ packages: resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} engines: {node: '>=0.10.0'} + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3445,6 +3525,10 @@ packages: resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -3544,6 +3628,10 @@ packages: resolution: {integrity: sha512-riK/iQB2ctwkpWYgjjWIRv3MBLt2gzb2Sj0JNQNbyTXgyXsLWcDPJ5WS5ZDTCx7BRFnJsARtYh+58fjP5M2Y0Q==} engines: {node: '>=18'} + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + interrogator@2.0.1: resolution: {integrity: sha512-HPilaDW0ZSPEKhhj6NcklQi7jhYyad1r8l6tS9hYCxvVnlrrJAUMZ7GuGa5PFK3RmquLSk+iml2geBJjC+Yc9g==} @@ -3551,17 +3639,40 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + is-core-module@2.15.0: resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} engines: {node: '>= 0.4'} + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3590,9 +3701,17 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -3619,10 +3738,30 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + is-stream@3.0.0: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} @@ -3635,9 +3774,20 @@ packages: resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} engines: {node: '>=12'} + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -3974,6 +4124,9 @@ packages: mlly@1.7.1: resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + modern-spawn@1.0.0: + resolution: {integrity: sha512-VYCaPqxfHcbUndhf3ucm8ntIPqTbVDgcF5QRtZyB4AUYVx+y5ZfU5wRBiYyjzPW6vLvOHm3mdW/X9boZPnSLlQ==} + modify-values@1.0.1: resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} engines: {node: '>=0.10.0'} @@ -3994,6 +4147,9 @@ packages: resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -4005,6 +4161,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + node-abi@3.67.0: resolution: {integrity: sha512-bLn/fU/ALVBE9wj+p4Y21ZJWYFjUXLXPi/IewyLZkx3ApxKDNBWCKdReeKOtD8dWpOdDCeMyLh6ZewzcLsG2Nw==} engines: {node: '>=10'} @@ -4040,6 +4199,18 @@ packages: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + obuf@1.1.2: resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} @@ -4157,6 +4328,10 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -4301,6 +4476,10 @@ packages: resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==} engines: {node: '>=10'} + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -4653,6 +4832,10 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} engines: {node: '>=4'} @@ -4833,6 +5016,10 @@ packages: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -4843,10 +5030,18 @@ packages: shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -4953,6 +5148,10 @@ packages: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5024,6 +5223,11 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + supports-color@2.0.0: resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} engines: {node: '>=0.8.0'} @@ -5058,6 +5262,13 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} @@ -5129,6 +5340,9 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -5151,6 +5365,9 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + type-assertions@1.1.0: + resolution: {integrity: sha512-LJ5h6n63vxS8fSdfTPqIc6IrbCo9X3g6Se+wSikCGsqaAI3ajN0iputclNG07wdWfBoQZIrpASjBQo5BeVNrAg==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -5374,6 +5591,21 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -5517,11 +5749,11 @@ snapshots: - react-is - supports-color - '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3)': + '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0))': dependencies: adminjs: 7.8.11(@types/react@18.3.4) escape-regexp: 0.0.1 - sequelize: 6.37.3 + sequelize: 6.37.3(pg@8.12.0) '@ampproject/remapping@2.3.0': dependencies: @@ -6437,6 +6669,16 @@ snapshots: dependencies: '@databases/queue': 1.0.1 + '@databases/migrations-base@3.0.1': + dependencies: + assert-never: 1.3.0 + chalk: 4.1.2 + deep-equal: 2.2.3 + interrogator: 2.0.1 + is-interactive: 1.0.0 + parameter-reducers: 2.1.0 + semver: 7.6.3 + '@databases/pg-bulk@1.2.0(@databases/pg@5.5.0(typescript@5.5.4))': dependencies: '@databases/pg': 5.5.0(typescript@5.5.4) @@ -6454,6 +6696,22 @@ snapshots: '@databases/pg-errors@1.0.0': {} + '@databases/pg-migrations@5.0.3(typescript@5.5.4)': + dependencies: + '@databases/migrations-base': 3.0.1 + '@databases/pg': 5.5.0(typescript@5.5.4) + '@databases/pg-config': 3.2.0(typescript@5.5.4) + assert-never: 1.3.0 + chalk: 4.1.2 + interrogator: 2.0.1 + is-interactive: 1.0.0 + parameter-reducers: 2.1.0 + semver: 7.6.3 + sucrase: 3.35.0 + transitivePeerDependencies: + - pg-native + - typescript + '@databases/pg-schema-cli@4.4.0(typescript@5.5.4)': dependencies: '@databases/pg-config': 3.2.0(typescript@5.5.4) @@ -6484,6 +6742,20 @@ snapshots: transitivePeerDependencies: - typescript + '@databases/pg-test@3.1.2(typescript@5.5.4)': + dependencies: + '@databases/pg-config': 3.2.0(typescript@5.5.4) + '@databases/with-container': 2.1.1 + '@types/cross-spawn': 6.0.6 + cross-spawn: 6.0.5 + modern-spawn: 1.0.0 + ms: 2.1.2 + parameter-reducers: 2.1.0 + type-assertions: 1.1.0 + transitivePeerDependencies: + - supports-color + - typescript + '@databases/pg-typed@4.4.1(@databases/pg@5.5.0(typescript@5.5.4))': dependencies: '@databases/pg': 5.5.0(typescript@5.5.4) @@ -6537,6 +6809,15 @@ snapshots: '@databases/validate-unicode@1.0.0': {} + '@databases/with-container@2.1.1': + dependencies: + '@types/cross-spawn': 6.0.6 + cross-spawn: 6.0.5 + detect-port: 1.6.1 + modern-spawn: 1.0.0 + transitivePeerDependencies: + - supports-color + '@emotion/babel-plugin@11.12.0': dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) @@ -7715,6 +7996,10 @@ snapshots: dependencies: '@types/node': 20.16.1 + '@types/cross-spawn@6.0.6': + dependencies: + '@types/node': 20.16.1 + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 @@ -7969,6 +8254,8 @@ snapshots: add-stream@1.0.0: {} + address@1.2.2: {} + adminjs@7.8.11(@types/react@18.3.4): dependencies: '@adminjs/design-system': 4.1.1(@babel/core@7.25.2)(@types/react@18.3.4)(prop-types@15.8.1)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) @@ -8079,10 +8366,17 @@ snapshots: ansi-styles@6.2.1: {} + any-promise@1.3.0: {} + arg@4.1.3: {} argparse@2.0.1: {} + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + array-ify@1.0.0: {} array-union@2.1.0: {} @@ -8097,6 +8391,10 @@ snapshots: atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + avvio@8.4.0: dependencies: '@fastify/error': 3.4.1 @@ -8336,6 +8634,8 @@ snapshots: commander@2.20.3: {} + commander@4.1.1: {} + common-tags@1.8.2: {} commondir@1.0.1: {} @@ -8507,6 +8807,14 @@ snapshots: transitivePeerDependencies: - encoding + cross-spawn@6.0.5: + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -8556,6 +8864,27 @@ snapshots: dependencies: type-detect: 4.1.0 + deep-equal@2.2.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.4 + is-arguments: 1.1.1 + is-array-buffer: 3.0.4 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + isarray: 2.0.5 + object-is: 1.1.6 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + side-channel: 1.0.6 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -8570,6 +8899,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.0.1 + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + delayed-stream@1.0.0: {} depd@2.0.0: {} @@ -8580,6 +8915,13 @@ snapshots: detect-newline@3.1.0: {} + detect-port@1.6.1: + dependencies: + address: 1.2.2 + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + diff-sequences@29.6.3: {} diff@4.0.2: {} @@ -8638,6 +8980,18 @@ snapshots: es-errors@1.3.0: {} + es-get-iterator@1.1.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.3 + is-set: 2.0.3 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + esbuild@0.19.12: optionalDependencies: '@esbuild/aix-ppc64': 0.19.12 @@ -8963,6 +9317,10 @@ snapshots: follow-redirects@1.15.6: {} + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.3 @@ -8983,6 +9341,8 @@ snapshots: function-bind@1.1.2: {} + functions-have-names@1.2.3: {} + funtypes@4.2.0: {} gensync@1.0.0-beta.2: {} @@ -9110,6 +9470,8 @@ snapshots: dependencies: ansi-regex: 2.1.1 + has-bigints@1.0.2: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -9122,6 +9484,10 @@ snapshots: has-symbols@1.0.3: {} + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -9237,22 +9603,53 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + interrogator@2.0.1: dependencies: inquirer: 9.3.6 ipaddr.js@1.9.1: {} + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + is-arrayish@0.2.1: {} + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 + is-callable@1.2.7: {} + is-core-module@2.15.0: dependencies: hasown: 2.0.2 + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -9271,8 +9668,14 @@ snapshots: is-interactive@2.0.0: {} + is-map@2.0.3: {} + is-module@1.0.0: {} + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + is-number@7.0.0: {} is-obj@2.0.0: {} @@ -9291,8 +9694,27 @@ snapshots: dependencies: '@types/estree': 1.0.5 + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + is-stream@3.0.0: {} + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 @@ -9301,8 +9723,17 @@ snapshots: is-unicode-supported@1.3.0: {} + is-weakmap@2.0.2: {} + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + isarray@1.0.0: {} + isarray@2.0.5: {} + isexe@2.0.0: {} isobject@3.0.1: {} @@ -9655,6 +10086,10 @@ snapshots: pkg-types: 1.1.3 ufo: 1.5.4 + modern-spawn@1.0.0: + dependencies: + cross-spawn: 7.0.3 + modify-values@1.0.1: {} module-details-from-path@1.0.3: {} @@ -9669,12 +10104,20 @@ snapshots: mute-stream@1.0.0: {} + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.7: {} natural-compare@1.4.0: {} neo-async@2.6.2: {} + nice-try@1.0.5: {} + node-abi@3.67.0: dependencies: semver: 7.6.3 @@ -9707,6 +10150,20 @@ snapshots: object-inspect@1.13.2: {} + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + obuf@1.1.2: {} on-exit-leak-free@2.1.2: {} @@ -9835,6 +10292,8 @@ snapshots: path-is-absolute@1.0.1: {} + path-key@2.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -9995,6 +10454,8 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 + possible-typed-array-names@1.0.0: {} + postcss-value-parser@4.2.0: {} postcss@8.4.41: @@ -10401,6 +10862,13 @@ snapshots: dependencies: '@babel/runtime': 7.25.0 + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + regexpu-core@5.3.2: dependencies: '@babel/regjsgen': 0.8.0 @@ -10543,7 +11011,7 @@ snapshots: sequelize-pool@7.1.0: {} - sequelize@6.37.3: + sequelize@6.37.3(pg@8.12.0): dependencies: '@types/debug': 4.1.12 '@types/validator': 13.12.0 @@ -10561,6 +11029,8 @@ snapshots: uuid: 8.3.2 validator: 13.12.0 wkx: 0.5.0 + optionalDependencies: + pg: 8.12.0 transitivePeerDependencies: - supports-color @@ -10575,6 +11045,13 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -10583,10 +11060,16 @@ snapshots: shallowequal@1.1.0: {} + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 + shebang-regex@1.0.0: {} + shebang-regex@3.0.0: {} shimmer@1.2.1: {} @@ -10692,6 +11175,10 @@ snapshots: dependencies: bl: 5.1.0 + stop-iteration-iterator@1.0.0: + dependencies: + internal-slot: 1.0.7 + string-argv@0.3.2: {} string-width@4.2.3: @@ -10784,6 +11271,16 @@ snapshots: stylis@4.2.0: {} + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + supports-color@2.0.0: {} supports-color@5.5.0: @@ -10813,6 +11310,14 @@ snapshots: text-table@0.2.0: {} + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + thread-stream@2.7.0: dependencies: real-require: 0.2.0 @@ -10870,6 +11375,8 @@ snapshots: dependencies: typescript: 5.5.4 + ts-interface-checker@0.1.13: {} + ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -10897,6 +11404,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + type-assertions@1.1.0: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -11088,6 +11597,33 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 From 98fd4ba35a0da187cae71ea23295ba5413f1f039 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 06:19:29 -0400 Subject: [PATCH 36/84] refactor: Update account service to use rusty-motors-database package This commit updates the account service to use the `rusty-motors-database` package instead of the local `../../database/src/services/database` import. This change improves code organization and ensures consistency with other parts of the codebase. --- packages/nps/services/account.ts | 63 +++++++++++++++++++------------ packages/nps/test/account.test.ts | 55 +++++++++++++++++++++++++++ 2 files changed, 94 insertions(+), 24 deletions(-) create mode 100644 packages/nps/test/account.test.ts diff --git a/packages/nps/services/account.ts b/packages/nps/services/account.ts index 1c9891b9d..7a6dd44c4 100644 --- a/packages/nps/services/account.ts +++ b/packages/nps/services/account.ts @@ -1,44 +1,59 @@ import { LoginSchema, db } from "rusty-motors-database"; import { getServerLogger } from "rusty-motors-shared"; -import type { DatabaseSchema } from "../../database/src/services/database"; +import type { DatabaseSchema } from "rusty-motors-database"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function populateGameUsers(): Promise { - await LoginSchema(db).insertOrIgnore({ - customer_id: 1, - login_name: "admin", - password: "admin", - login_level: 1, - }); + await LoginSchema(db).insertOrIgnore({ + customer_id: 1, + login_name: "admin", + password: "admin", + login_level: 1, + }); } +/** + * Retrieves a user from the database based on the provided username and password. + * + * @param username - The username of the user to retrieve. + * @param password - The password of the user to retrieve. + * @returns A Promise that resolves to the user record from the database, or null if the user is not found. + */ export async function getUser( - username: string, - password: string, + username: string, + password: string, ): Promise { - log.setName("getUser"); - log.debug(`Getting user: ${username}, password: ${"*".repeat(password.length)}`); + log.debug( + `Getting user: ${username}, password: ${"*".repeat(password.length)}`, + ); - const userAccount = await LoginSchema(db).findOne({ - login_name: username, - password, - }); + const userAccount = await LoginSchema(db).findOne({ + login_name: username, + password, + }); - if (!userAccount) { - log.warn(`User ${username} not found`); - } + if (!userAccount) { + log.warn(`User ${username} not found`); + } - return userAccount; + return userAccount; } +/** + * Checks if the user is a super user. + * + * @param username - The username of the user. + * @param password - The password of the user. + * @returns A promise that resolves to a boolean indicating if the user is a super user. + */ export async function isSuperUser( - username: string, - password: string, + username: string, + password: string, ): Promise { - const user = await getUser(username, password); - return user ? user.login_level === 1 : false; + const user = await getUser(username, password); + return user ? user.login_level === 1 : false; } // Path: packages/nps/services/account.ts diff --git a/packages/nps/test/account.test.ts b/packages/nps/test/account.test.ts new file mode 100644 index 000000000..cb99ba062 --- /dev/null +++ b/packages/nps/test/account.test.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from "vitest"; +import { getUser, isSuperUser, populateGameUsers } from "../services/account.js"; + +describe("getUser", () => { + it("returns the user record if found", async () => { + // arrange + const username = "admin"; + const password = "admin"; + populateGameUsers() + + // act + const result = await getUser(username, password); + + // assert + expect(result).not.toBeNull(); + expect(result?.login_name).toBe(username); + expect(result?.password).toBe(password); + }); + + it("returns null if the user is not found", async () => { + // arrange + const username = "nonexistent"; + const password = "password"; + + // act + const result = await getUser(username, password); + + // assert + expect(result).toBeNull(); + }); + + it("returns true if the user is a super user", async () => { + // arrange + const username = "admin"; + const password = "admin"; + + // act + const result = await isSuperUser(username, password); + + // assert + expect(result).toBe(true); + }); + + it("returns false if the user is not a super user", async () => { + // arrange + const username = "regularuser"; + const password = "password"; + + // act + const result = await isSuperUser(username, password); + + // assert + expect(result).toBe(false); + }); +}); From b8f6b324f4787dc55e04faeb216a556be1ee2cbc Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 06:25:09 -0400 Subject: [PATCH 37/84] refactor: Update Makefile to export environment variables from .env file This commit modifies the Makefile to export environment variables from the .env file. This change is made to ensure that the environment variables are set before running tests and other commands that require them. The inclusion of the .env file is disabled for now to prevent the makefile from failing if the file is not present. --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 087693399..fa71c3433 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,13 @@ -include .env +# This will read from .env file and export all the variables +# to the environment. This is useful for running the tests +# and other commands that require the environment variables +# to be set. +# +# Warning: This will cause the makefile to fail if the .env +# file is not present. This is the desired behavior as we +# want to make sure that the environment variables are set +# before running the tests. +# include .env // Disabled for now all: @npm install From a090432c8c5bd1a1484239ce1fd828f7c233c47b Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 06:30:03 -0400 Subject: [PATCH 38/84] refactor: Update Makefile to export environment variables from .env file --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index fa71c3433..474a32d72 100644 --- a/Makefile +++ b/Makefile @@ -20,6 +20,7 @@ certs: test: @export DATABASE_URL=$$(npx pg-test start) + @echo "Testing with DATABASE_URL=$$DATABASE_URL" @pnpm migrate @pnpm test @npx pg-test stop From 50d268ae5a8631406fd98cb3616dc0efdd123a8c Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 07:05:15 -0400 Subject: [PATCH 39/84] refactor: Update Makefile to start postgres server for tests This commit modifies the Makefile to start a postgres server in the background and run the tests against it. The server will be stopped after the tests are done. This change improves the testing process by ensuring that the tests are run against a real database environment. The use of `$$` to escape the `$` character is necessary because the command is being run in a subshell. The DATABASE_URL environment variable is set using the `npx pg-test start` command. The Makefile also includes commands to migrate the database and run the tests using the `pnpm` package manager. --- Makefile | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 474a32d72..724d13114 100644 --- a/Makefile +++ b/Makefile @@ -19,10 +19,17 @@ certs: @echo "certs regenerated. remember to update pub.key for all clients" test: - @export DATABASE_URL=$$(npx pg-test start) - @echo "Testing with DATABASE_URL=$$DATABASE_URL" - @pnpm migrate - @pnpm test +# This will start a postgres server in the background and run the tests +# against it. The server will be stopped after the tests are done. +# +# Note the use of `$$` to escape the `$` character. This is required +# because the command is being run in a subshell. That the command +# is being run in a subshell is why we can't use `export` to set the +# DATABASE_URL environment variable. + @DATABASE_URL=$$(npx pg-test start) && \ + echo "Testing with DATABASE_URL=$$DATABASE_URL" && \ + pnpm migrate && \ + pnpm test @npx pg-test stop From 2e14e8a8c692992243f63eaef97a0a5789b38adc Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 07:51:34 -0400 Subject: [PATCH 40/84] refactor: Update Makefile to start postgres server for tests --- Makefile | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 724d13114..7f011e6b4 100644 --- a/Makefile +++ b/Makefile @@ -28,14 +28,14 @@ test: # DATABASE_URL environment variable. @DATABASE_URL=$$(npx pg-test start) && \ echo "Testing with DATABASE_URL=$$DATABASE_URL" && \ - pnpm migrate && \ - pnpm test + DATABASE_URL=$$DATABASE_URL pnpm migrate && \ + DATABASE_URL=$$DATABASE_URL pnpm test @npx pg-test stop start: - @EXTERNAL_HOST=mcouniverse.com PRIVATE_KEY_FILE=data/private_key.pem CERTIFICATE_FILE=data/mcouniverse.crt PUBLIC_KEY_FILE=data/pub.key LOG_LEVEL=trace npm run start:dev + @pnpx tsx --openssl-legacy-provider --env-file=.env server.ts prod_node: docker-compose --file docker-compose.yml up -d --build From 6a8ea9ec5f57ad06f7789419d3628548e801da28 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 07:53:13 -0400 Subject: [PATCH 41/84] refactor: switch to using actual database --- package.json | 2 +- packages/database/index.ts | 12 ++++++------ .../database/src/functions/getWarehouseInventory.ts | 7 +++---- packages/database/src/services/database.ts | 2 +- packages/database/tsconfig.json | 7 +++++++ packages/lobby/src/handlers/_setMyUserData.ts | 6 ++---- .../lobby/src/handlers/requestConnectGameServer.ts | 6 ++---- packages/login/src/index.ts | 4 ---- packages/login/src/internal.ts | 5 ++--- packages/shared/index.ts | 1 - packages/transactions/src/clientConnect.ts | 6 ++---- pnpm-lock.yaml | 3 +++ 12 files changed, 29 insertions(+), 32 deletions(-) create mode 100644 packages/database/tsconfig.json diff --git a/package.json b/package.json index 4d64d5a18..7019e740a 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "format:all": "pnpm run -r --stream format", "test": "npm run test:all", "test:all": "pnpm run -r --stream test", - "start:dev": "tsx --openssl-legacy-provider server.ts", "types:db": "npm --workspace rusty-motors-database run types:db", "migrate": "pg-migrations apply --directory migrations " }, @@ -39,6 +38,7 @@ "pino": "^8.17.1", "rusty-motors-gateway": "link:packages/gateway", "rusty-motors-nps": "link:packages/nps", + "rusty-motors-shared": "link:packages/shared", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" diff --git a/packages/database/index.ts b/packages/database/index.ts index 96ed8db19..1eca36f14 100644 --- a/packages/database/index.ts +++ b/packages/database/index.ts @@ -3,11 +3,11 @@ export { fetchSessionKeyByCustomerId, updateSessionKey, updateUser, -} from './src/DatabaseManager.js'; -export { getWarehouseInventory } from './src/functions/getWarehouseInventory.js'; -export type { WarehouseInventory } from './src/functions/getWarehouseInventory.js'; -export * from './src/services/database.js'; -import * as DatabaseSchema from './src/__generated__/schema.json'; +} from "./src/DatabaseManager.js"; +export { getWarehouseInventory } from "./src/functions/getWarehouseInventory.js"; +export type { WarehouseInventory } from "./src/functions/getWarehouseInventory.js"; +export * from "./src/services/database.js"; +import * as DatabaseSchema from "./src/__generated__/schema.json"; export { DatabaseSchema as databaseSchema }; export { DatabaseSchema }; -export { getTunables as getTuneables } from './src/services/tunables.js'; +export { getTunables as getTuneables } from "./src/services/tunables.js"; diff --git a/packages/database/src/functions/getWarehouseInventory.ts b/packages/database/src/functions/getWarehouseInventory.ts index 566989f49..cd69400f2 100644 --- a/packages/database/src/functions/getWarehouseInventory.ts +++ b/packages/database/src/functions/getWarehouseInventory.ts @@ -1,5 +1,5 @@ -import { db, WarehouseSchema, getTuneables, sql } from 'rusty-motors-database'; -import { getServerLogger } from 'rusty-motors-shared'; +import { db, WarehouseSchema, getTuneables, sql } from '../../index.js'; +import { getServerLogger } from '../../../shared/log.js'; export type WarehouseInventory = { inventory: { @@ -14,8 +14,7 @@ export async function getWarehouseInventory( warehouseId: number, brandId: number ): Promise { - const log = getServerLogger(); - log.setName('getWarehouseInventory'); + const log = getServerLogger({ name: 'getWarehouseInventory' }); log.debug( `Getting warehouse inventory for part ${brandId} in warehouse ${warehouseId}` diff --git a/packages/database/src/services/database.ts b/packages/database/src/services/database.ts index 880610fda..0f72992d7 100644 --- a/packages/database/src/services/database.ts +++ b/packages/database/src/services/database.ts @@ -5,7 +5,7 @@ const DatabaseSchema = await import('../__generated__/schema.json'); export { sql }; -export const db = createConnectionPool(); +export const db = createConnectionPool(process.env['DATABASE_URL']); // You can list whatever tables you actually have here: export const { diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json new file mode 100644 index 000000000..f128d2132 --- /dev/null +++ b/packages/database/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + } +} \ No newline at end of file diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 4972c02c0..1d7099107 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -1,9 +1,9 @@ -import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "../../../shared/log.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { UserInfo } from "../UserInfoMessage.js"; +import { updateUser } from "../../../database/index.js"; export async function _setMyUserData({ connectionId, @@ -27,11 +27,9 @@ export async function _setMyUserData({ log.debug(`User ID: ${incomingMessage._userId}`); - // Get the database instance - const db = getDatabaseServer(); // Update the user's data - db.updateUser({ + updateUser({ userId: incomingMessage._userId, userData: incomingMessage._userData, }); diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index bb6ff783d..425ce9a2b 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -1,4 +1,3 @@ -import { getDatabaseServer } from "../../../database/src/DatabaseManager.js"; import { getPersonasByPersonaId } from "../../../persona/src/getPersonasByPersonaId.js"; import { getServerLogger } from "../../../shared/log.js"; import { LoginInfoMessage } from "../LoginInfoMessage.js"; @@ -16,6 +15,7 @@ import { import { ServerError } from "../../../shared/errors/ServerError.js"; import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; import { UserInfoMessage } from "../UserInfoMessage.js"; +import { fetchSessionKeyByCustomerId } from "../../../database/index.js"; /** * Convert to zero padded hex @@ -79,9 +79,7 @@ export async function _npsRequestGameConnectServer({ if (!existingEncryption) { // Set the encryption keys on the lobby connection - const databaseManager = getDatabaseServer({ log }); - const keys = await databaseManager - .fetchSessionKeyByCustomerId(customerId) + const keys = await fetchSessionKeyByCustomerId(customerId) .catch((/** @type {unknown} */ error: unknown) => { throw new ServerError( `Unable to fetch session key for customerId ${customerId.toString()}: ${String( diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index f38861d38..38d86c3f5 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { DatabaseManager } from "../../interfaces/index.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; @@ -25,7 +24,6 @@ import { handleLoginData } from "./internal.js"; * Please use {@link LoginServer.getInstance()} */ export class LoginServer { - databaseManager: DatabaseManager; _log: any; static _instance: LoginServer | undefined; /** @@ -36,7 +34,6 @@ export class LoginServer { * @memberof LoginServer */ constructor({ - database = getDatabaseServer(), log = getServerLogger({ module: "LoginServer", }), @@ -44,7 +41,6 @@ export class LoginServer { database: import("../../interfaces/index.js").DatabaseManager; log?: import("pino").Logger; }) { - this.databaseManager = database; this._log = log; LoginServer._instance = this; } diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index 1a905a221..ad99eb58a 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "../../shared/log.js"; @@ -22,6 +21,7 @@ import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; import { NPSUserStatus } from "./NPSUserStatus.js"; +import { updateSessionKey } from "../../database/index.js"; /** @type {import("../../interfaces/index.js").UserRecordMini[]} */ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ @@ -101,8 +101,7 @@ async function login({ // Save sessionkey in database under customerId log.debug("Preparing to update session key in db"); - await getDatabaseServer() - .updateSessionKey( + await updateSessionKey( userRecord.customerId, sessionKey ?? "", contextId, diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 77e248773..f014c3216 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -5,7 +5,6 @@ export { Configuration, getServerConfiguration } from "./Configuration.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; -export type * from "./src/types.js"; export interface KeypressEvent { sequence: string; diff --git a/packages/transactions/src/clientConnect.ts b/packages/transactions/src/clientConnect.ts index 6ff479f73..c8d2572ff 100644 --- a/packages/transactions/src/clientConnect.ts +++ b/packages/transactions/src/clientConnect.ts @@ -1,4 +1,3 @@ -import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { createCommandEncryptionPair, createDataEncryptionPair, @@ -15,6 +14,7 @@ import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericReply } from "./GenericReplyMessage.js"; import { TClientConnectMessage } from "./TClientConnectMessage.js"; import { MessageHandlerArgs, MessageHandlerResult } from "./handlers.js"; +import { fetchSessionKeyByCustomerId } from "../../database/index.js"; /** * @param {MessageHandlerArgs} args @@ -54,9 +54,7 @@ export async function clientConnect({ log.debug(`Looking up the session key for ${customerId}...`); - result = await getDatabaseServer({ - log, - }).fetchSessionKeyByCustomerId(customerId); + result = await fetchSessionKeyByCustomerId(customerId); log.debug(`Session key found for ${customerId}`); const newCommandEncryptionPair = createCommandEncryptionPair( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ddb581e50..ee9ffc2e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,9 @@ importers: rusty-motors-nps: specifier: link:packages/nps version: link:packages/nps + rusty-motors-shared: + specifier: link:packages/shared + version: link:packages/shared sequelize: specifier: ^6.35.2 version: 6.37.3(pg@8.12.0) From c31271ee86906033819a3ae3570c59ecbbe8a8bd Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 08:11:30 -0400 Subject: [PATCH 42/84] refactor: Convert logLevel to lowercase in Configuration class --- packages/shared/Configuration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/shared/Configuration.ts b/packages/shared/Configuration.ts index e86247800..57d870b0e 100644 --- a/packages/shared/Configuration.ts +++ b/packages/shared/Configuration.ts @@ -47,7 +47,7 @@ export class Configuration { this.host = host; - this.logLevel = logLevel; + this.logLevel = logLevel.toLowerCase(); Configuration.instance = this; } catch (error) { logger.fatal(`Error in core server: ${String(error)}`); From 2fb70badace76c2f1d9c77f70069068efdf7e106 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 08:31:31 -0400 Subject: [PATCH 43/84] refactor: Update devDependencies in package.json files This commit updates the devDependencies in multiple package.json files to include the "@vitest/coverage-v8" package with version 2 and the "vitest" package with version "^2.0.5". This change ensures that the devDependencies are up to date and compatible with the latest stable versions of these packages. --- package.json | 8 +- packages/cli/package.json | 3 +- packages/database/package.json | 9 +- packages/gateway/package.json | 6 +- packages/mcots/package.json | 6 +- packages/nps/package.json | 6 +- packages/patch/package.json | 6 +- packages/shard/package.json | 7 +- packages/shared-packets/package.json | 6 +- packages/shared/package.json | 6 +- packages/transactions/package.json | 12 +- pnpm-lock.yaml | 408 ++++++++++++++------------- 12 files changed, 260 insertions(+), 223 deletions(-) diff --git a/package.json b/package.json index 7019e740a..20fe8fd18 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,11 @@ "fastify": "^4.25.1", "moment": "^2.29.4", "pino": "^8.17.1", + "rusty-motors-database": "link:packages/database", "rusty-motors-gateway": "link:packages/gateway", "rusty-motors-nps": "link:packages/nps", "rusty-motors-shared": "link:packages/shared", + "rusty-motors-shared-packets": "link:packages/shared-packets", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" @@ -51,12 +53,12 @@ "@tsconfig/node-lts": "^20.1.0", "@tsconfig/node20": "^20.1.2", "@types/chai": "4.3.11", - "@types/node": "^20.10.5", + "@types/node": "^22.5.0", "@types/sinon": "17.0.2", "@types/sinon-chai": "3.2.12", "@typescript-eslint/eslint-plugin": "^6.15.0", "@typescript-eslint/parser": "^6.15.0", - "@vitest/coverage-v8": "^1.1.0", + "@vitest/coverage-v8": "^2.0.5", "eslint": "^8.56.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "5.1.1", @@ -70,7 +72,7 @@ "tsx": "4.7.0", "typescript": "^5.3.3", "typescript-eslint-language-service": "^5.0.5", - "vitest": "^1.1.0" + "vitest": "^2.0.5" }, "c8": { "all": true, diff --git a/packages/cli/package.json b/packages/cli/package.json index 8a4bf912d..d9b5f7711 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -18,7 +18,8 @@ "author": "", "license": "AGPL-3.0", "devDependencies": { - "@vitest/coverage-v8": "1.6.0" + "@vitest/coverage-v8": "2.0.5", + "vitest": "^2.0.5" }, "dependencies": { "rusty-motors-shared": "^1.0.0", diff --git a/packages/database/package.json b/packages/database/package.json index 69ffaf927..198b8c533 100644 --- a/packages/database/package.json +++ b/packages/database/package.json @@ -25,11 +25,14 @@ "@sentry/node": "^8.0.0", "@types/pg": "^8.11.6", "pg": "^8.11.5", - "pg-hstore": "^2.3.4", - "vitest": "^1.6.0" + "pg-hstore": "^2.3.4" }, "directories": { "test": "test" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/gateway/package.json b/packages/gateway/package.json index d452d968a..c85021a12 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -26,5 +26,9 @@ "directories": { "test": "test" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/mcots/package.json b/packages/mcots/package.json index a12c609ab..a0760522e 100644 --- a/packages/mcots/package.json +++ b/packages/mcots/package.json @@ -21,5 +21,9 @@ "@sentry/node": "^8.0.0", "short-unique-id": "^5.0.3" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/nps/package.json b/packages/nps/package.json index 2a3a115a4..e6ca971be 100644 --- a/packages/nps/package.json +++ b/packages/nps/package.json @@ -21,5 +21,9 @@ "@sentry/node": "^8.0.0", "short-unique-id": "^5.0.3" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/patch/package.json b/packages/patch/package.json index 7cf18538f..8bff13ba1 100644 --- a/packages/patch/package.json +++ b/packages/patch/package.json @@ -20,5 +20,9 @@ "directories": { "test": "test" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/shard/package.json b/packages/shard/package.json index f71df4894..00586044f 100644 --- a/packages/shard/package.json +++ b/packages/shard/package.json @@ -18,10 +18,11 @@ "keywords": [], "author": "", "license": "AGPL-3.0", - "dependencies": { - "vitest": "^1.6.0" - }, "directories": { "test": "test" + }, + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" } } diff --git a/packages/shared-packets/package.json b/packages/shared-packets/package.json index 7d4aadb9b..2299a00eb 100644 --- a/packages/shared-packets/package.json +++ b/packages/shared-packets/package.json @@ -18,5 +18,9 @@ "keywords": [], "author": "", "license": "AGPL-3.0", - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/shared/package.json b/packages/shared/package.json index cea67010c..8ae5cb4f1 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -29,5 +29,9 @@ "directories": { "test": "test" }, - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/packages/transactions/package.json b/packages/transactions/package.json index 338419f87..0756208b1 100644 --- a/packages/transactions/package.json +++ b/packages/transactions/package.json @@ -1,5 +1,5 @@ { - "name": "rusty-motors-transactions", + "name": "rusty-motors-transactions", "version": "1.0.0", "exports": { ".": { @@ -15,8 +15,12 @@ "test": "echo \"Error: no test specified\" && exit 0", "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" }, - "keywords": [], - "author": "", + "keywords": [], + "author": "", "license": "AGPL-3.0", - "description": "" + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee9ffc2e9..89979ebe3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: dependencies: '@adminjs/sequelize': specifier: ^4.1.1 - version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0)) + version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3) '@databases/pg': specifier: ^5.5.0 version: 5.5.0(typescript@5.5.4) @@ -35,6 +35,9 @@ importers: pino: specifier: ^8.17.1 version: 8.21.0 + rusty-motors-database: + specifier: link:packages/database + version: link:packages/database rusty-motors-gateway: specifier: link:packages/gateway version: link:packages/gateway @@ -44,15 +47,18 @@ importers: rusty-motors-shared: specifier: link:packages/shared version: link:packages/shared + rusty-motors-shared-packets: + specifier: link:packages/shared-packets + version: link:packages/shared-packets sequelize: specifier: ^6.35.2 - version: 6.37.3(pg@8.12.0) + version: 6.37.3 sqlite: specifier: ^5.1.1 version: 5.1.1 ts-node: specifier: 10.9.2 - version: 10.9.2(@types/node@20.16.1)(typescript@5.5.4) + version: 10.9.2(@types/node@22.5.0)(typescript@5.5.4) devDependencies: '@biomejs/biome': specifier: 1.8.3 @@ -76,8 +82,8 @@ importers: specifier: 4.3.11 version: 4.3.11 '@types/node': - specifier: ^20.10.5 - version: 20.16.1 + specifier: ^22.5.0 + version: 22.5.0 '@types/sinon': specifier: 17.0.2 version: 17.0.2 @@ -91,8 +97,8 @@ importers: specifier: ^6.15.0 version: 6.21.0(eslint@8.57.0)(typescript@5.5.4) '@vitest/coverage-v8': - specifier: ^1.1.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.16.1)) + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) eslint: specifier: ^8.56.0 version: 8.57.0 @@ -133,8 +139,8 @@ importers: specifier: ^5.0.5 version: 5.0.5(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) vitest: - specifier: ^1.1.0 - version: 1.6.0(@types/node@20.16.1) + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/cli: dependencies: @@ -146,8 +152,11 @@ importers: version: link:../shared-packets devDependencies: '@vitest/coverage-v8': - specifier: 1.6.0 - version: 1.6.0(vitest@1.6.0(@types/node@20.16.1)) + specifier: 2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/database: dependencies: @@ -172,9 +181,13 @@ importers: pg-hstore: specifier: ^2.3.4 version: 2.3.4 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/gateway: dependencies: @@ -187,6 +200,13 @@ importers: fastify: specifier: ^4.25.2 version: 4.28.1 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/mcots: dependencies: @@ -196,6 +216,13 @@ importers: short-unique-id: specifier: ^5.0.3 version: 5.2.0 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/nps: dependencies: @@ -205,14 +232,31 @@ importers: short-unique-id: specifier: ^5.0.3 version: 5.2.0 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) - packages/patch: {} + packages/patch: + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/shard: - dependencies: + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) vitest: - specifier: ^1.6.0 - version: 1.6.0(@types/node@20.16.1) + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages/shared: dependencies: @@ -225,10 +269,31 @@ importers: pino-pretty: specifier: ^11.0.0 version: 11.2.2 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) - packages/shared-packets: {} + packages/shared-packets: + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) - packages/transactions: {} + packages/transactions: + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) packages: @@ -2341,6 +2406,9 @@ packages: '@types/node@20.16.1': resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==} + '@types/node@22.5.0': + resolution: {integrity: sha512-DkFrJOe+rfdHTqqMg0bSNlGlQ85hSoh2TPzZyhHsXnMtligRWpxUySiyw8FY14ITt24HVCiQPWxS3KO/QlGmWg==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -2450,25 +2518,28 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@1.6.0': - resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + '@vitest/coverage-v8@2.0.5': + resolution: {integrity: sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==} peerDependencies: - vitest: 1.6.0 + vitest: 2.0.5 + + '@vitest/expect@2.0.5': + resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/pretty-format@2.0.5': + resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.5': + resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.5': + resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.5': + resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.5': + resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} @@ -2610,8 +2681,9 @@ packages: assert-never@1.3.0: resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2735,9 +2807,9 @@ packages: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -2758,8 +2830,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} cjs-module-lexer@1.3.1: resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} @@ -2854,9 +2927,6 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} @@ -3020,8 +3090,8 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-equal@2.2.3: @@ -3071,10 +3141,6 @@ packages: engines: {node: '>= 4.0.0'} hasBin: true - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -3824,9 +3890,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -3927,10 +3990,6 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -3991,8 +4050,8 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -4124,9 +4183,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - modern-spawn@1.0.0: resolution: {integrity: sha512-VYCaPqxfHcbUndhf3ucm8ntIPqTbVDgcF5QRtZyB4AUYVx+y5ZfU5wRBiYyjzPW6vLvOHm3mdW/X9boZPnSLlQ==} @@ -4273,10 +4329,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -4361,8 +4413,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pg-cloudflare@1.1.1: resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} @@ -4468,9 +4521,6 @@ packages: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} - pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -5209,9 +5259,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - styled-components@5.3.9: resolution: {integrity: sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==} engines: {node: '>=10'} @@ -5251,9 +5298,9 @@ packages: resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} engines: {node: ^14.18.0 || >=16.0.0} - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@7.0.1: + resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} + engines: {node: '>=18'} text-extensions@1.9.0: resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} @@ -5296,12 +5343,16 @@ packages: tinymce@6.8.4: resolution: {integrity: sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + tinypool@1.0.1: + resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} + engines: {node: ^18.0.0 || >=20.0.0} + + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} tippy.js@6.3.7: @@ -5375,10 +5426,6 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -5421,9 +5468,6 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uglify-js@3.19.2: resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} @@ -5508,8 +5552,8 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.5: + resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -5544,15 +5588,15 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.5: + resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.5 + '@vitest/ui': 2.0.5 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5695,10 +5739,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -5752,11 +5792,11 @@ snapshots: - react-is - supports-color - '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0))': + '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3)': dependencies: adminjs: 7.8.11(@types/react@18.3.4) escape-regexp: 0.0.1 - sequelize: 6.37.3(pg@8.12.0) + sequelize: 6.37.3 '@ampproject/remapping@2.3.0': dependencies: @@ -8037,6 +8077,10 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.5.0': + dependencies: + undici-types: 6.19.8 + '@types/normalize-package-data@2.4.4': {} '@types/parse-json@4.0.2': {} @@ -8177,7 +8221,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.16.1))': + '@vitest/coverage-v8@2.0.5(vitest@2.0.5(@types/node@22.5.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -8188,42 +8232,45 @@ snapshots: istanbul-reports: 3.1.7 magic-string: 0.30.11 magicast: 0.3.4 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 - test-exclude: 6.0.0 - vitest: 1.6.0(@types/node@20.16.1) + test-exclude: 7.0.1 + tinyrainbow: 1.2.0 + vitest: 2.0.5(@types/node@22.5.0) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.5': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.5.0 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/pretty-format@2.0.5': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + tinyrainbow: 1.2.0 + + '@vitest/runner@2.0.5': + dependencies: + '@vitest/utils': 2.0.5 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.5': dependencies: + '@vitest/pretty-format': 2.0.5 magic-string: 0.30.11 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.5': dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 - '@vitest/utils@1.6.0': + '@vitest/utils@2.0.5': dependencies: - diff-sequences: 29.6.3 + '@vitest/pretty-format': 2.0.5 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 JSONStream@1.3.5: dependencies: @@ -8388,7 +8435,7 @@ snapshots: assert-never@1.3.0: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -8537,15 +8584,13 @@ snapshots: dependencies: lodash: 4.17.21 - chai@4.5.0: + chai@5.1.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 chalk@1.1.3: dependencies: @@ -8570,9 +8615,7 @@ snapshots: chardet@0.7.0: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} cjs-module-lexer@1.3.1: {} @@ -8657,8 +8700,6 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 - confbox@0.1.7: {} - conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 @@ -8863,9 +8904,7 @@ snapshots: decamelize@1.2.0: {} - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 + deep-eql@5.0.2: {} deep-equal@2.2.3: dependencies: @@ -8925,8 +8964,6 @@ snapshots: transitivePeerDependencies: - supports-color - diff-sequences@29.6.3: {} - diff@4.0.2: {} dir-glob@3.0.1: @@ -9772,8 +9809,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -9890,11 +9925,6 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 - local-pkg@0.5.0: - dependencies: - mlly: 1.7.1 - pkg-types: 1.1.3 - locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -9956,7 +9986,7 @@ snapshots: dependencies: js-tokens: 4.0.0 - loupe@2.3.7: + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -10082,13 +10112,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.1: - dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.1.3 - ufo: 1.5.4 - modern-spawn@1.0.0: dependencies: cross-spawn: 7.0.3 @@ -10245,10 +10268,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.1.1 - p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -10316,7 +10335,7 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} pg-cloudflare@1.1.1: optional: true @@ -10445,12 +10464,6 @@ snapshots: dependencies: find-up: 3.0.0 - pkg-types@1.1.3: - dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 - pluralize@8.0.0: {} polished@4.3.1: @@ -11014,7 +11027,7 @@ snapshots: sequelize-pool@7.1.0: {} - sequelize@6.37.3(pg@8.12.0): + sequelize@6.37.3: dependencies: '@types/debug': 4.1.12 '@types/validator': 13.12.0 @@ -11032,8 +11045,6 @@ snapshots: uuid: 8.3.2 validator: 13.12.0 wkx: 0.5.0 - optionalDependencies: - pg: 8.12.0 transitivePeerDependencies: - supports-color @@ -11234,10 +11245,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) @@ -11301,11 +11308,11 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.6.3 - test-exclude@6.0.0: + test-exclude@7.0.1: dependencies: '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 + glob: 10.4.5 + minimatch: 9.0.5 text-extensions@1.9.0: {} @@ -11346,9 +11353,11 @@ snapshots: tinymce@6.8.4: {} - tinypool@0.8.4: {} + tinypool@1.0.1: {} + + tinyrainbow@1.2.0: {} - tinyspy@2.2.1: {} + tinyspy@3.0.0: {} tippy.js@6.3.7: dependencies: @@ -11380,14 +11389,14 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-node@10.9.2(@types/node@20.16.1)(typescript@5.5.4): + ts-node@10.9.2(@types/node@22.5.0)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.16.1 + '@types/node': 22.5.0 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -11413,8 +11422,6 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.1.0: {} - type-fest@0.18.1: {} type-fest@0.20.2: {} @@ -11442,8 +11449,6 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.5.4: {} - uglify-js@3.19.2: optional: true @@ -11507,13 +11512,13 @@ snapshots: vary@1.1.2: {} - vite-node@1.6.0(@types/node@20.16.1): + vite-node@2.0.5(@types/node@22.5.0): dependencies: cac: 6.7.14 debug: 4.3.6(supports-color@5.5.0) pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.4.2(@types/node@20.16.1) + tinyrainbow: 1.2.0 + vite: 5.4.2(@types/node@22.5.0) transitivePeerDependencies: - '@types/node' - less @@ -11525,39 +11530,38 @@ snapshots: - supports-color - terser - vite@5.4.2(@types/node@20.16.1): + vite@5.4.2(@types/node@22.5.0): dependencies: esbuild: 0.21.5 postcss: 8.4.41 rollup: 4.21.0 optionalDependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 fsevents: 2.3.3 - vitest@1.6.0(@types/node@20.16.1): + vitest@2.0.5(@types/node@22.5.0): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 - chai: 4.5.0 + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.5 + '@vitest/pretty-format': 2.0.5 + '@vitest/runner': 2.0.5 + '@vitest/snapshot': 2.0.5 + '@vitest/spy': 2.0.5 + '@vitest/utils': 2.0.5 + chai: 5.1.1 debug: 4.3.6(supports-color@5.5.0) execa: 8.0.1 - local-pkg: 0.5.0 magic-string: 0.30.11 pathe: 1.1.2 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.9.0 - tinypool: 0.8.4 - vite: 5.4.2(@types/node@20.16.1) - vite-node: 1.6.0(@types/node@20.16.1) + tinypool: 1.0.1 + tinyrainbow: 1.2.0 + vite: 5.4.2(@types/node@22.5.0) + vite-node: 2.0.5(@types/node@22.5.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.16.1 + '@types/node': 22.5.0 transitivePeerDependencies: - less - lightningcss @@ -11705,6 +11709,4 @@ snapshots: yocto-queue@0.1.0: {} - yocto-queue@1.1.1: {} - yoctocolors-cjs@2.1.2: {} From 2d133da14f2ab74194006f8c801a1fe78a62cc13 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 11:14:09 -0400 Subject: [PATCH 44/84] refactor: Add utility functions for number comparison This commit adds utility functions for number comparison, including functions to check if a number is zero, if a value is undefined, if one number is less than another, if one number is less than or equal to another, if one number is greater than another, if one number is greater than or equal to another, if both numbers are zero, if both values are undefined, if both values are set, and if only one of the values is set. These utility functions improve code readability and maintainability by providing clear and reusable logic for number comparison operations. --- packages/nps/src/utils/pureCompare.ts | 68 +++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/packages/nps/src/utils/pureCompare.ts b/packages/nps/src/utils/pureCompare.ts index 82c3742e2..c6ad7f5d2 100644 --- a/packages/nps/src/utils/pureCompare.ts +++ b/packages/nps/src/utils/pureCompare.ts @@ -1,46 +1,114 @@ +/** + * Checks if a given number is zero. + * + * @param n - The number to check. + * @returns `true` if the number is zero, `false` otherwise. + */ export function isZero(n: number): boolean { // Return true if n is zero return n === 0; } +/** + * Checks if a value is undefined. + * + * @param n - The value to check. + * @returns `true` if the value is undefined, `false` otherwise. + */ export function isUndefined(n: unknown): boolean { // Return true if n is undefined return typeof n === "undefined"; } +/** + * Compares two numbers and returns true if the first number is less than the second number. + * + * @param a - The first number to compare. + * @param b - The second number to compare. + * @returns True if `a` is less than `b`, otherwise false. + */ export function lessThan(a: number, b: number): boolean { // Return true if a < b return a < b; } +/** + * Checks if the first number is less than or equal to the second number. + * + * @param a - The first number. + * @param b - The second number. + * @returns `true` if `a` is less than or equal to `b`, `false` otherwise. + */ export function lessThanOrEqual(a: number, b: number): boolean { // Return true if a <= b return a <= b; } +/** + * Checks if the first number is greater than the second number. + * + * @param a - The first number. + * @param b - The second number. + * @returns `true` if `a` is greater than `b`, `false` otherwise. + */ export function greaterThan(a: number, b: number): boolean { // Return true if a > b return a > b; } +/** + * Checks if the first number is greater than or equal to the second number. + * + * @param a - The first number to compare. + * @param b - The second number to compare. + * @returns `true` if `a` is greater than or equal to `b`, `false` otherwise. + */ export function greaterThanOrEqual(a: number, b: number): boolean { // Return true if a >= b return a >= b; } +/** + * Checks if both numbers are zero. + * + * @param a - The first number. + * @param b - The second number. + * @returns True if both numbers are zero, false otherwise. + */ export function areBothZero(a: number, b: number): boolean { // Return true if both a and b are zero return isZero(a) && isZero(b); } +/** + * Checks if both values are undefined. + * + * @param a - The first value to compare. + * @param b - The second value to compare. + * @returns True if both values are undefined, false otherwise. + */ export function areBothUndefined(a: unknown, b: unknown): boolean { // Return true if both a and b are undefined return typeof a === "undefined" && typeof b === "undefined"; } +/** + * Checks if both values are set. + * + * @param a - The first value to check. + * @param b - The second value to check. + * @returns True if both values are set, false otherwise. + */ export function areBothSet(a: unknown, b: unknown): boolean { // Return true if both a and b are set return !isUndefined(a) && !isUndefined(b); } +/** + * Checks if only one of the two values is set. + * + * @param a - The first value to compare. + * @param b - The second value to compare. + * @returns True if only one of the values is set, false otherwise. + */ export function isOnlyOneSet(a: unknown, b: unknown): boolean { // Return true if only one of a and b is set return !areBothSet(a, b) && (!isUndefined(a) || !isUndefined(b)); From 6ed801dc50bb26cf38415529718b7493e26cf81d Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 11:14:20 -0400 Subject: [PATCH 45/84] refactor: Add utility functions for number comparison --- packages/nps/src/utils/pureCompare.test.ts | 125 +++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 packages/nps/src/utils/pureCompare.test.ts diff --git a/packages/nps/src/utils/pureCompare.test.ts b/packages/nps/src/utils/pureCompare.test.ts new file mode 100644 index 000000000..e7e318e3a --- /dev/null +++ b/packages/nps/src/utils/pureCompare.test.ts @@ -0,0 +1,125 @@ +import { describe, expect, it } from "vitest"; +import { + isZero, + isUndefined, + lessThan, + lessThanOrEqual, + greaterThan, + greaterThanOrEqual, + areBothZero, + areBothUndefined, + areBothSet, + isOnlyOneSet, +} from "../utils/pureCompare"; + +describe("isZero", () => { + it("returns true if the number is zero", () => { + expect(isZero(0)).toBe(true); + }); + + it("returns false if the number is not zero", () => { + expect(isZero(5)).toBe(false); + }); +}); + +describe("isUndefined", () => { + it("returns true if the value is undefined", () => { + expect(isUndefined(undefined)).toBe(true); + }); + + it("returns false if the value is not undefined", () => { + expect(isUndefined(5)).toBe(false); + }); +}); + +describe("lessThan", () => { + it("returns true if the first number is less than the second number", () => { + expect(lessThan(2, 5)).toBe(true); + }); + + it("returns false if the first number is greater than or equal to the second number", () => { + expect(lessThan(5, 2)).toBe(false); + expect(lessThan(5, 5)).toBe(false); + }); +}); + +describe("lessThanOrEqual", () => { + it("returns true if the first number is less than or equal to the second number", () => { + expect(lessThanOrEqual(2, 5)).toBe(true); + expect(lessThanOrEqual(5, 5)).toBe(true); + }); + + it("returns false if the first number is greater than the second number", () => { + expect(lessThanOrEqual(5, 2)).toBe(false); + }); +}); + +describe("greaterThan", () => { + it("returns true if the first number is greater than the second number", () => { + expect(greaterThan(5, 2)).toBe(true); + }); + + it("returns false if the first number is less than or equal to the second number", () => { + expect(greaterThan(2, 5)).toBe(false); + expect(greaterThan(5, 5)).toBe(false); + }); +}); + +describe("greaterThanOrEqual", () => { + it("returns true if the first number is greater than or equal to the second number", () => { + expect(greaterThanOrEqual(5, 2)).toBe(true); + expect(greaterThanOrEqual(5, 5)).toBe(true); + }); + + it("returns false if the first number is less than the second number", () => { + expect(greaterThanOrEqual(2, 5)).toBe(false); + }); +}); + +describe("areBothZero", () => { + it("returns true if both numbers are zero", () => { + expect(areBothZero(0, 0)).toBe(true); + }); + + it("returns false if at least one of the numbers is not zero", () => { + expect(areBothZero(0, 5)).toBe(false); + expect(areBothZero(5, 0)).toBe(false); + expect(areBothZero(5, 5)).toBe(false); + }); +}); + +describe("areBothUndefined", () => { + it("returns true if both values are undefined", () => { + expect(areBothUndefined(undefined, undefined)).toBe(true); + }); + + it("returns false if at least one of the values is not undefined", () => { + expect(areBothUndefined(undefined, 5)).toBe(false); + expect(areBothUndefined(5, undefined)).toBe(false); + expect(areBothUndefined(5, 5)).toBe(false); + }); +}); + +describe("areBothSet", () => { + it("returns true if both values are set", () => { + expect(areBothSet(5, 10)).toBe(true); + }); + + it("returns false if at least one of the values is not set", () => { + expect(areBothSet(undefined, 10)).toBe(false); + expect(areBothSet(5, undefined)).toBe(false); + expect(areBothSet(undefined, undefined)).toBe(false); + }); +}); + +describe("isOnlyOneSet", () => { + it("returns true if only one of the values is set", () => { + expect(isOnlyOneSet(5, undefined)).toBe(true); + expect(isOnlyOneSet(undefined, 10)).toBe(true); + }); + + it("returns false if both values are set or both values are not set", () => { + expect(isOnlyOneSet(5, 10)).toBe(false); + expect(isOnlyOneSet(undefined, undefined)).toBe(false); + }); +}); From d2a7b77268580e1ad436aff4a2a2899505ecf6a4 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 11:16:59 -0400 Subject: [PATCH 46/84] refactor: Update test file import path in pureCompare.test.ts --- packages/nps/{src/utils => test}/pureCompare.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/nps/{src/utils => test}/pureCompare.test.ts (99%) diff --git a/packages/nps/src/utils/pureCompare.test.ts b/packages/nps/test/pureCompare.test.ts similarity index 99% rename from packages/nps/src/utils/pureCompare.test.ts rename to packages/nps/test/pureCompare.test.ts index e7e318e3a..b5948a156 100644 --- a/packages/nps/src/utils/pureCompare.test.ts +++ b/packages/nps/test/pureCompare.test.ts @@ -10,7 +10,7 @@ import { areBothUndefined, areBothSet, isOnlyOneSet, -} from "../utils/pureCompare"; +} from "../src/utils/pureCompare"; describe("isZero", () => { it("returns true if the number is zero", () => { From 7cad266e8230cd7a719298ed0763b778a4577ce1 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 11:26:12 -0400 Subject: [PATCH 47/84] refactor: Add utility functions for number comparison --- packages/nps/src/utils/pureGet.ts | 52 ++++++++++++++- packages/nps/test/pureGet.test.ts | 105 ++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 packages/nps/test/pureGet.test.ts diff --git a/packages/nps/src/utils/pureGet.ts b/packages/nps/src/utils/pureGet.ts index a82f9202d..6548144e6 100644 --- a/packages/nps/src/utils/pureGet.ts +++ b/packages/nps/src/utils/pureGet.ts @@ -1,10 +1,26 @@ import { greaterThanOrEqual } from "./pureCompare.js"; +/** + * Retrieves a word from a buffer at the specified offset. + * + * @param bytes - The buffer containing the word. + * @param offset - The offset at which to retrieve the word. + * @param isLE - Indicates whether the word is in little-endian format. + * @returns The word retrieved from the buffer. + */ export function getWord(bytes: Buffer, offset: number, isLE: boolean): number { // Get the word at the offset return isLE ? bytes.readUInt16LE(offset) : bytes.readUInt16BE(offset); } +/** + * Retrieves a dword from the given buffer at the specified offset. + * + * @param bytes - The buffer containing the dword. + * @param offset - The offset at which the dword is located. + * @param isLE - Indicates whether the buffer is in little-endian format. + * @returns The retrieved dword. + */ export function getDWord(bytes: Buffer, offset: number, isLE: boolean): number { // Get the dword at the offset return isLE ? bytes.readUInt32LE(offset) : bytes.readUInt32BE(offset); @@ -23,12 +39,27 @@ export function getNBytes(bytes: Buffer, n: number): Buffer { return bytes.subarray(0, cutLength); } +/** + * Converts a buffer of bytes to a hexadecimal string representation. + * If the number of hex characters is odd, a leading zero is added. + * + * @param bytes - The buffer of bytes to convert. + * @returns The hexadecimal string representation of the buffer. + */ export function getAsHex(bytes: Buffer): string { - return bytes.length % 2 === 0 - ? bytes.toString("hex") - : bytes.toString("hex") + "0"; + // Convert the buffer to a hexadecimal string + const hex = bytes.toString("hex"); + return hex.length % 2 === 0 ? hex : `0${hex}`; } +/** + * Retrieves a string from a buffer based on the given offset and length. + * + * @param bytes - The buffer containing the string. + * @param offset - The starting position of the string in the buffer. + * @param isLE - A boolean indicating whether the buffer is in little-endian format. + * @returns The extracted string. + */ export function getLenString( bytes: Buffer, offset: number, @@ -41,6 +72,14 @@ export function getLenString( return bytes.subarray(offset + 2, offset + 2 + strLen).toString("utf8"); } +/** + * Retrieves a blob from a buffer based on the given offset and length. + * + * @param bytes - The buffer containing the blob. + * @param offset - The starting offset of the blob in the buffer. + * @param isLE - A boolean indicating whether the buffer is in little-endian format. + * @returns The extracted blob as a new buffer. + */ export function getLenBlob( bytes: Buffer, offset: number, @@ -53,6 +92,13 @@ export function getLenBlob( return bytes.subarray(offset + 2, offset + 2 + blobLen); } +/** + * Retrieves a 2-byte boolean value from the specified buffer at the given offset. + * + * @param bytes - The buffer containing the boolean value. + * @param offset - The offset at which the boolean value is located in the buffer. + * @returns The boolean value retrieved from the buffer. + */ export function getShortBool(bytes: Buffer, offset: number): boolean { // Get a 2 byte boolean return bytes.readUInt16LE(offset) === 1; diff --git a/packages/nps/test/pureGet.test.ts b/packages/nps/test/pureGet.test.ts new file mode 100644 index 000000000..8b9c65594 --- /dev/null +++ b/packages/nps/test/pureGet.test.ts @@ -0,0 +1,105 @@ +import { describe, expect, it } from "vitest"; +import { + getWord, + getDWord, + getNBytes, + getAsHex, + getLenString, + getLenBlob, + getShortBool, +} from "../src/utils/pureGet"; + +describe("getWord", () => { + it("returns the word at the specified offset in little-endian format", () => { + const bytes = Buffer.from([0x01, 0x00, 0x02, 0x00]); + expect(getWord(bytes, 0, true)).toBe(1); + expect(getWord(bytes, 2, true)).toBe(2); + }); + + it("returns the word at the specified offset in big-endian format", () => { + const bytes = Buffer.from([0x00, 0x01, 0x00, 0x02]); + expect(getWord(bytes, 0, false)).toBe(1); + expect(getWord(bytes, 2, false)).toBe(2); + }); +}); + +describe("getDWord", () => { + it("returns the dword at the specified offset in little-endian format", () => { + const bytes = Buffer.from([ + 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, + ]); + expect(getDWord(bytes, 0, true)).toBe(1); + expect(getDWord(bytes, 4, true)).toBe(2); + }); + + it("returns the dword at the specified offset in big-endian format", () => { + const bytes = Buffer.from([ + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, + ]); + expect(getDWord(bytes, 0, false)).toBe(1); + expect(getDWord(bytes, 4, false)).toBe(2); + }); +}); + +describe("getNBytes", () => { + it("returns the first n bytes of a buffer", () => { + const bytes = Buffer.from([0x01, 0x02, 0x03, 0x04]); + expect(getNBytes(bytes, 2)).toEqual(Buffer.from([0x01, 0x02])); + expect(getNBytes(bytes, 4)).toEqual( + Buffer.from([0x01, 0x02, 0x03, 0x04]), + ); + expect(getNBytes(bytes, 6)).toEqual( + Buffer.from([0x01, 0x02, 0x03, 0x04]), + ); + }); +}); + +describe("getAsHex", () => { + it("returns the hexadecimal string representation of a buffer", () => { + const bytes1 = Buffer.from([0x01, 0x02, 0x03]); + const bytes2 = Buffer.from([0x01, 0x02, 0x03, 0x04]); + expect(getAsHex(bytes1)).toBe("010203"); + expect(getAsHex(bytes2)).toBe("01020304"); + }); + + it("adds a leading zero if the length of the hexadecimal string is odd", () => { + const bytes = Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05]); + expect(getAsHex(bytes)).toBe("0102030405"); + }); +}); + +describe("getLenString", () => { + it("returns the string from a buffer based on the given offset and length in little-endian format", () => { + const bytes = Buffer.from([0x05, 0x00, 0x48, 0x65, 0x6c, 0x6c, 0x6f]); + expect(getLenString(bytes, 0, true)).toBe("Hello"); + }); + + it("returns the string from a buffer based on the given offset and length in big-endian format", () => { + const bytes = Buffer.from([0x00, 0x05, 0x48, 0x65, 0x6c, 0x6c, 0x6f]); + expect(getLenString(bytes, 0, false)).toBe("Hello"); + }); +}); + +describe("getLenBlob", () => { + it("returns the blob from a buffer based on the given offset and length in little-endian format", () => { + const bytes = Buffer.from([0x05, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05]); + expect(getLenBlob(bytes, 0, true)).toEqual( + Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05]), + ); + }); + + it("returns the blob from a buffer based on the given offset and length in big-endian format", () => { + const bytes = Buffer.from([0x00, 0x05, 0x01, 0x02, 0x03, 0x04, 0x05]); + expect(getLenBlob(bytes, 0, false)).toEqual( + Buffer.from([0x01, 0x02, 0x03, 0x04, 0x05]), + ); + }); +}); + +describe("getShortBool", () => { + it("returns the 2-byte boolean value from the specified buffer at the given offset", () => { + const bytes = Buffer.from([0x01, 0x00, 0x00, 0x00]); + expect(getShortBool(bytes, 0)).toBe(true); + expect(getShortBool(bytes, 2)).toBe(false); + }); +}); From c009d2cb4d2254cc8373c4198d51c2299b7db9bc Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 18:19:01 -0400 Subject: [PATCH 48/84] refactor: Exclude generated files from code coverage reports This commit updates the Vite configuration file to exclude generated files in the "__generated__" directory from the code coverage reports. By excluding these files, the code coverage reports will provide a more accurate representation of the actual codebase. This change improves the reliability and usefulness of the code coverage metrics. --- packages/database/vite.config.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/database/vite.config.ts b/packages/database/vite.config.ts index fb851b55a..b462fdf70 100644 --- a/packages/database/vite.config.ts +++ b/packages/database/vite.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ "ecosystem.config.js", "migrate.ts", "packages/**/*.d.ts", + "*/**/__generated__/*" ], reporter: ["lcov", "text", "cobertura"], }, From 655e99e567609deee972e82d9cf018035a3fadb8 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 18:27:07 -0400 Subject: [PATCH 49/84] refactor: Add McosEncryptionPair to shared exports --- packages/shared/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared/index.ts b/packages/shared/index.ts index f014c3216..26ea14f69 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -2,6 +2,7 @@ export { SubThread } from "./SubThread.js"; export { NetworkMessage } from "./src/NetworkMessage.js"; export { ServerLogger, getServerLogger } from "./log.js"; export { Configuration, getServerConfiguration } from "./Configuration.js"; +export { McosEncryptionPair } from "./State.ts"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; From 21cec841efe6451a91d236bc7652a17c1dd99968 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 19:22:52 -0400 Subject: [PATCH 50/84] refactor: Update tsconfig files for new packages This commit adds new tsconfig files for the following packages: cli, gateway, lobby, login, mcots, nps, patch, persona, shard. These files extend the base tsconfig and include specific source files for each package. This change ensures that each package has its own separate compilation context and can be built independently. It improves the modularity and maintainability of the codebase. --- jsconfig-old.json | 13 ------------- packages/cli/tsconfig.json | 11 +++++++++++ packages/database/tsconfig.json | 6 +++++- packages/gateway/tsconfig.json | 11 +++++++++++ packages/lobby/tsconfig.json | 11 +++++++++++ packages/login/tsconfig.json | 11 +++++++++++ packages/mcots/tsconfig.json | 11 +++++++++++ packages/nps/tsconfig.json | 11 +++++++++++ packages/patch/tsconfig.json | 11 +++++++++++ packages/persona/tsconfig.json | 11 +++++++++++ packages/shard/tsconfig.json | 11 +++++++++++ packages/shared-packets/tsconfig.json | 12 ++++++++---- packages/shared/tsconfig.json | 6 +++++- packages/transactions/tsconfig.json | 9 ++++----- tsconfig.base.json | 6 +++++- 15 files changed, 126 insertions(+), 25 deletions(-) delete mode 100644 jsconfig-old.json create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/gateway/tsconfig.json create mode 100644 packages/lobby/tsconfig.json create mode 100644 packages/login/tsconfig.json create mode 100644 packages/mcots/tsconfig.json create mode 100644 packages/nps/tsconfig.json create mode 100644 packages/patch/tsconfig.json create mode 100644 packages/persona/tsconfig.json create mode 100644 packages/shard/tsconfig.json diff --git a/jsconfig-old.json b/jsconfig-old.json deleted file mode 100644 index bfaa42147..000000000 --- a/jsconfig-old.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "@tsconfig/node20/tsconfig.json", - "compilerOptions": { - "strict": true, - "module": "NodeNext", - "noEmit": true, - "allowJs": true, - "checkJs": true, - "noErrorTruncation": true - }, - "exclude": ["node_modules", "**/node_modules/*"], - "include": ["src/**/*", "packages/**/*", "test/**/*", "server.js"] -} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index f128d2132..a26c2f180 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -3,5 +3,9 @@ "compilerOptions": { "incremental": true, "composite": true - } + }, + "include": [ + "index.ts", + "src" + ] } \ No newline at end of file diff --git a/packages/gateway/tsconfig.json b/packages/gateway/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/gateway/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/lobby/tsconfig.json b/packages/lobby/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/lobby/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/login/tsconfig.json b/packages/login/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/login/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/mcots/tsconfig.json b/packages/mcots/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/mcots/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/nps/tsconfig.json b/packages/nps/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/nps/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/patch/tsconfig.json b/packages/patch/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/patch/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/persona/tsconfig.json b/packages/persona/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/persona/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/shard/tsconfig.json b/packages/shard/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/shard/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/shared-packets/tsconfig.json b/packages/shared-packets/tsconfig.json index 4b0695a95..a26c2f180 100644 --- a/packages/shared-packets/tsconfig.json +++ b/packages/shared-packets/tsconfig.json @@ -1,7 +1,11 @@ { "extends": "../../tsconfig.base.json", - "compilerOptions": { + "compilerOptions": { "incremental": true, - "composite": true - } -} + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json index 4b0695a95..88433edf7 100644 --- a/packages/shared/tsconfig.json +++ b/packages/shared/tsconfig.json @@ -3,5 +3,9 @@ "compilerOptions": { "incremental": true, "composite": true - } + }, + "include": [ + "index.ts", + "src" + ] } diff --git a/packages/transactions/tsconfig.json b/packages/transactions/tsconfig.json index 5a7fd161b..751b5710c 100644 --- a/packages/transactions/tsconfig.json +++ b/packages/transactions/tsconfig.json @@ -4,9 +4,8 @@ "incremental": true, "composite": true }, - "references": [ - { - "path": "../shared-packets" - } - ] + "include": [ + "index.ts", + "src" + ] } \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index e28e57199..3159f30da 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1,8 +1,12 @@ { "compilerOptions": { "incremental": true, - "target": "es2016", + "target": "ES2022", "module": "NodeNext", + "lib": [ + "ES2022" + ], + "moduleResolution": "NodeNext", "noImplicitOverride": true, "noImplicitAny": true, "strictNullChecks": true, From 7729d6887c0ba545be8a003438d51fcaa28f8f91 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 19:29:47 -0400 Subject: [PATCH 51/84] refactor: Update import paths for shared log module --- .../src/functions/getWarehouseInventory.ts | 4 +- packages/database/src/models/Player.ts | 4 +- packages/gateway/src/GatewayServer.ts | 4 +- packages/gateway/src/index.ts | 2 +- packages/lobby/src/handlers/_setMyUserData.ts | 2 +- .../lobby/src/handlers/encryptedCommand.ts | 2 +- .../src/handlers/handleGetMiniUserList.ts | 2 +- .../src/handlers/handleSendMiniRiffList.ts | 2 +- .../lobby/src/handlers/handleTrackingPing.ts | 2 +- packages/lobby/src/handlers/heartbeat.js | 42 ++-- .../src/handlers/requestConnectGameServer.ts | 2 +- packages/lobby/src/internal.ts | 2 +- packages/login/src/index.ts | 2 +- packages/login/src/internal.ts | 2 +- packages/login/test/LoginServer.test.ts | 2 +- packages/patch/src/PatchServer.ts | 2 +- packages/patch/test/PatchServer.test.ts | 2 +- packages/persona/src/_gameLogout.ts | 2 +- packages/persona/src/_getFirstBuddy.ts | 2 +- packages/persona/src/_selectGamePersona.ts | 2 +- .../src/handlers/validatePersonaName.ts | 2 +- packages/persona/src/internal.ts | 2 +- packages/shared/SubThread.ts | 70 +++---- packages/shared/errors/ServerError.ts | 180 +++++++++--------- packages/shared/index.ts | 2 +- packages/shared/{ => src}/log.ts | 2 +- packages/transactions/src/internal.ts | 2 +- .../test/_getPlayerRaceHistory.test.ts | 2 +- .../transactions/test/clientConnect.test.ts | 2 +- packages/transactions/test/getLobbies.test.ts | 2 +- packages/transactions/test/login.test.ts | 2 +- .../transactions/test/trackingPing.test.ts | 2 +- server.ts | 2 +- 33 files changed, 179 insertions(+), 179 deletions(-) rename packages/shared/{ => src}/log.ts (96%) diff --git a/packages/database/src/functions/getWarehouseInventory.ts b/packages/database/src/functions/getWarehouseInventory.ts index cd69400f2..6426d655d 100644 --- a/packages/database/src/functions/getWarehouseInventory.ts +++ b/packages/database/src/functions/getWarehouseInventory.ts @@ -1,5 +1,5 @@ -import { db, WarehouseSchema, getTuneables, sql } from '../../index.js'; -import { getServerLogger } from '../../../shared/log.js'; +import { db, WarehouseSchema, getTuneables, sql } from "../../index.js"; +import { getServerLogger } from "rusty-motors-shared"; export type WarehouseInventory = { inventory: { diff --git a/packages/database/src/models/Player.ts b/packages/database/src/models/Player.ts index 5e6a5ac6e..d2b2cc455 100644 --- a/packages/database/src/models/Player.ts +++ b/packages/database/src/models/Player.ts @@ -1,5 +1,5 @@ -import { ServerError } from "../../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { ServerError } from "rusty-motors-shared"; +import { SerializedBuffer } from "rusty-motors-shared"; export class PlayerModel extends SerializedBuffer { override serialize(): Buffer { diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 61ad35038..377fd367e 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -1,7 +1,7 @@ import { Socket, createServer as createSocketServer } from "node:net"; import FastifySensible from "@fastify/sensible"; import fastify from "fastify"; -import { Logger } from "pino"; +import type { Logger } from "pino"; import { ConsoleThread } from "../../cli/ConsoleThread.js"; import { receiveLobbyData } from "../../lobby/src/internal.js"; import { receiveLoginData } from "../../login/src/index.js"; @@ -16,7 +16,7 @@ import { fetchStateFromDatabase, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { receiveTransactionsData } from "../../transactions/src/internal.js"; import { onSocketConnection } from "./index.js"; import { addWebRoutes } from "./web.js"; diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 471ed42e4..78c2a9a7f 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -24,7 +24,7 @@ import { wrapSocket, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; import { Logger } from "pino"; diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 1d7099107..96607b3fd 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -1,6 +1,6 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { UserInfo } from "../UserInfoMessage.js"; import { updateUser } from "../../../database/index.js"; diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index 2e01cd234..b0c059d5d 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -5,7 +5,7 @@ import { updateEncryption, } from "../../../shared/State.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { MessageBuffer } from "../../../shared/MessageBuffer.js"; import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index 3bff16086..0271f30d5 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -1,6 +1,6 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { GameMessage } from "../../../shared/GameMessage.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { serializeString } from "../../../shared/serializeString.js"; diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index 4163a6ca4..a912145b7 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -1,6 +1,6 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { GameMessage } from "../../../shared/GameMessage.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { serializeString } from "../../../shared/serializeString.js"; diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index 7426b7418..d98cfba4f 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -1,5 +1,5 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; export async function handleTrackingPing({ diff --git a/packages/lobby/src/handlers/heartbeat.js b/packages/lobby/src/handlers/heartbeat.js index 2f4dc4897..605e85330 100644 --- a/packages/lobby/src/handlers/heartbeat.js +++ b/packages/lobby/src/handlers/heartbeat.js @@ -1,7 +1,7 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { - NPSMessage, - SerializedBuffer, + NPSMessage, + SerializedBuffer, } from "../../../shared/messageFactory.js"; /** @@ -15,26 +15,26 @@ import { * }>} */ export async function _npsHeartbeat({ - connectionId, - // @ts-ignore - message, // eslint-disable-line no-unused-vars - log = getServerLogger({ - module: "_npsHeartbeat", - }), + connectionId, + // @ts-ignore + message, // eslint-disable-line no-unused-vars + log = getServerLogger({ + module: "_npsHeartbeat", + }), }) { - const packetContent = Buffer.alloc(8); - const packetResult = new NPSMessage(); - packetResult._header.id = 0x127; - packetResult.setBuffer(packetContent); + const packetContent = Buffer.alloc(8); + const packetResult = new NPSMessage(); + packetResult._header.id = 0x127; + packetResult.setBuffer(packetContent); - log.debug("Dumping packet..."); - log.debug(packetResult.toString()); + log.debug("Dumping packet..."); + log.debug(packetResult.toString()); - const outboundMessage = new SerializedBuffer(); - outboundMessage._doDeserialize(packetResult.serialize()); + const outboundMessage = new SerializedBuffer(); + outboundMessage._doDeserialize(packetResult.serialize()); - return { - connectionId, - messages: [outboundMessage], - }; + return { + connectionId, + messages: [outboundMessage], + }; } diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index 425ce9a2b..e2883be5a 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -1,5 +1,5 @@ import { getPersonasByPersonaId } from "../../../persona/src/getPersonasByPersonaId.js"; -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { LoginInfoMessage } from "../LoginInfoMessage.js"; import { diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index ba75b5f1b..050bf0535 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -16,7 +16,7 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index 38d86c3f5..36abceb71 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -16,7 +16,7 @@ import { DatabaseManager } from "../../interfaces/index.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { handleLoginData } from "./internal.js"; diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index ad99eb58a..a809bf4ca 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -16,7 +16,7 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; diff --git a/packages/login/test/LoginServer.test.ts b/packages/login/test/LoginServer.test.ts index 4bc92083f..b5a88559d 100644 --- a/packages/login/test/LoginServer.test.ts +++ b/packages/login/test/LoginServer.test.ts @@ -4,7 +4,7 @@ import { mockPino, unmockPino, } from "../../../test/factoryMocks.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { LoginServer } from "../src/index.js"; describe("LoginServer", () => { diff --git a/packages/patch/src/PatchServer.ts b/packages/patch/src/PatchServer.ts index 86da6e3fc..d695b3f37 100644 --- a/packages/patch/src/PatchServer.ts +++ b/packages/patch/src/PatchServer.ts @@ -1,6 +1,6 @@ import { Buffer } from "node:buffer"; import { IncomingMessage, ServerResponse } from "node:http"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; export const CastanetResponse = { body: Buffer.from([ diff --git a/packages/patch/test/PatchServer.test.ts b/packages/patch/test/PatchServer.test.ts index 5207a8786..f288b730b 100644 --- a/packages/patch/test/PatchServer.test.ts +++ b/packages/patch/test/PatchServer.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from "vitest"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { CastanetResponse, PatchServer } from "../src/PatchServer.js"; describe("PatchServer", () => { diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index 559ffee86..6805516ed 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index 2ebdf9eba..83ea26c04 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index b90cd2509..659ddd11c 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 77522bf3b..187f039dc 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { RawMessage } from "../../../shared/src/RawMessage.js"; diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index 3e0ef8ad1..b60ff7884 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { Logger } from "pino"; import { getServerConfiguration } from "../../shared/Configuration.js"; diff --git a/packages/shared/SubThread.ts b/packages/shared/SubThread.ts index 116d772e2..fde31bfc3 100644 --- a/packages/shared/SubThread.ts +++ b/packages/shared/SubThread.ts @@ -4,44 +4,44 @@ import { EventEmitter } from "node:events"; import { Logger } from "pino"; -import { getServerLogger } from "./log.js"; +import { getServerLogger } from "./src/log.js"; export class SubThread extends EventEmitter { - name: any; - log: any; - loopInterval: number; - timer: any; - /** - * @param {string} name - * @param {module:shared/log.ServerLogger} log - * @param {number} [loopInterval=100] - */ - constructor( - name: string, - log: Logger = getServerLogger({ module: "SubThread" }), - loopInterval: number = 100, - ) { - super(); - this.name = name; - this.log = log; - this.loopInterval = loopInterval; - this.init(); - } + name: any; + log: any; + loopInterval: number; + timer: any; + /** + * @param {string} name + * @param {module:shared/log.ServerLogger} log + * @param {number} [loopInterval=100] + */ + constructor( + name: string, + log: Logger = getServerLogger({ module: "SubThread" }), + loopInterval: number = 100, + ) { + super(); + this.name = name; + this.log = log; + this.loopInterval = loopInterval; + this.init(); + } - init() { - this.emit("initialized"); - // @ts-ignore - this.timer = setInterval(this.run.bind(this), this.loopInterval); - } + init() { + this.emit("initialized"); + // @ts-ignore + this.timer = setInterval(this.run.bind(this), this.loopInterval); + } - run() { - // Intentionally left blank - } + run() { + // Intentionally left blank + } - shutdown() { - if (this.timer) { - clearInterval(this.timer); - } - this.emit("shutdownComplete"); - } + shutdown() { + if (this.timer) { + clearInterval(this.timer); + } + this.emit("shutdownComplete"); + } } diff --git a/packages/shared/errors/ServerError.ts b/packages/shared/errors/ServerError.ts index 018f2abd9..89d658d3c 100644 --- a/packages/shared/errors/ServerError.ts +++ b/packages/shared/errors/ServerError.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../log.js"; +import { getServerLogger } from "../src/log.js"; /** * @module errors @@ -14,99 +14,99 @@ import { getServerLogger } from "../log.js"; * @property {module:shared/log.ServerLogger} log The logger */ export class ServerError extends Error { - code: number; - /** - * Creates an instance of ServerError. - * @param {string} message The error message - */ - constructor(message: string) { - super(message); - this.code = 500; - this.name = "ServerError"; - } + code: number; + /** + * Creates an instance of ServerError. + * @param {string} message The error message + */ + constructor(message: string) { + super(message); + this.code = 500; + this.name = "ServerError"; + } - /** - * Convert the error to JSON - * - * @returns {{name: string, message: string, stack: string}} - */ - toJSON(): { name: string; message: string; stack: string } { - return { - name: this.name, - message: this.message, - stack: this.stack ?? "", - }; - } + /** + * Convert the error to JSON + * + * @returns {{name: string, message: string, stack: string}} + */ + toJSON(): { name: string; message: string; stack: string } { + return { + name: this.name, + message: this.message, + stack: this.stack ?? "", + }; + } - /** - * Convert the error to a string - * @override - */ - override toString() { - return JSON.stringify(this.toJSON()); - } + /** + * Convert the error to a string + * @override + */ + override toString() { + return JSON.stringify(this.toJSON()); + } - /** - * Convert a JSON object to a ServerError - * - * @static - * @param {{ - * name: string, - * message: string, - * stack: string - * }} json The JSON object - * @returns {ServerError} - */ - static fromJSON(json: { - name: string; - message: string; - stack: string; - }): ServerError { - const { name, message, stack } = json; - const newError = new ServerError(String(message)); - newError.name = name; - newError.stack = stack; - getServerLogger({ level: "error" }).error(json, message); - return newError; - } + /** + * Convert a JSON object to a ServerError + * + * @static + * @param {{ + * name: string, + * message: string, + * stack: string + * }} json The JSON object + * @returns {ServerError} + */ + static fromJSON(json: { + name: string; + message: string; + stack: string; + }): ServerError { + const { name, message, stack } = json; + const newError = new ServerError(String(message)); + newError.name = name; + newError.stack = stack; + getServerLogger({ level: "error" }).error(json, message); + return newError; + } - /** - * @static - * @param {string} jsonString - * @returns {ServerError} - */ - static fromString(jsonString: string): ServerError { - getServerLogger({ level: "error" }).error(jsonString); - return ServerError.fromJSON(JSON.parse(jsonString)); - } + /** + * @static + * @param {string} jsonString + * @returns {ServerError} + */ + static fromString(jsonString: string): ServerError { + getServerLogger({ level: "error" }).error(jsonString); + return ServerError.fromJSON(JSON.parse(jsonString)); + } - /** - * @static - * @param {Error} error - * @returns {ServerError} - */ - static fromError(error: Error): ServerError { - const newError = new ServerError(error.message); - newError.name = error.name; - newError.stack = error.stack; - getServerLogger({ level: "error" }).error(error, error.message); - return newError; - } + /** + * @static + * @param {Error} error + * @returns {ServerError} + */ + static fromError(error: Error): ServerError { + const newError = new ServerError(error.message); + newError.name = error.name; + newError.stack = error.stack; + getServerLogger({ level: "error" }).error(error, error.message); + return newError; + } - /** - * @static - * @param {unknown} error - * @param {string} message - * @returns {ServerError} - */ - static fromUnknown(error: unknown, message: string): ServerError { - if (error instanceof Error) { - return ServerError.fromError(error); - } - if (typeof error === "string") { - return ServerError.fromString(error); - } - getServerLogger({ level: "error" }).error(error, message); - return new ServerError(`Unknown error: ${String(error)}`); - } + /** + * @static + * @param {unknown} error + * @param {string} message + * @returns {ServerError} + */ + static fromUnknown(error: unknown, message: string): ServerError { + if (error instanceof Error) { + return ServerError.fromError(error); + } + if (typeof error === "string") { + return ServerError.fromString(error); + } + getServerLogger({ level: "error" }).error(error, message); + return new ServerError(`Unknown error: ${String(error)}`); + } } diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 26ea14f69..1907bc955 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -1,6 +1,6 @@ export { SubThread } from "./SubThread.js"; export { NetworkMessage } from "./src/NetworkMessage.js"; -export { ServerLogger, getServerLogger } from "./log.js"; +export { ServerLogger, getServerLogger } from "./src/log.js"; export { Configuration, getServerConfiguration } from "./Configuration.js"; export { McosEncryptionPair } from "./State.ts"; diff --git a/packages/shared/log.ts b/packages/shared/src/log.ts similarity index 96% rename from packages/shared/log.ts rename to packages/shared/src/log.ts index 74da6d6d4..82653ab8f 100644 --- a/packages/shared/log.ts +++ b/packages/shared/src/log.ts @@ -1,4 +1,4 @@ -import { Logger, LoggerOptions, pino } from "pino"; +import { type Logger, type LoggerOptions, pino } from "pino"; type ServerLoggerOptions = { level?: string; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index 32e4859d4..77e267886 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -21,7 +21,7 @@ import { updateEncryption, } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; // eslint-disable-next-line no-unused-vars import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.ts b/packages/transactions/test/_getPlayerRaceHistory.test.ts index 5edac4f7b..c3efd314b 100644 --- a/packages/transactions/test/_getPlayerRaceHistory.test.ts +++ b/packages/transactions/test/_getPlayerRaceHistory.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; diff --git a/packages/transactions/test/clientConnect.test.ts b/packages/transactions/test/clientConnect.test.ts index 564a8d02c..638358a11 100644 --- a/packages/transactions/test/clientConnect.test.ts +++ b/packages/transactions/test/clientConnect.test.ts @@ -2,7 +2,7 @@ import { describe, expect, it } from "vitest"; import { getDatabaseServer } from "../../database/src/DatabaseManager.js"; import { State } from "../../shared/State.js"; import { ServerError } from "../../shared/errors/ServerError.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { TClientConnectMessage } from "../src/TClientConnectMessage.js"; import { clientConnect } from "../src/clientConnect.js"; diff --git a/packages/transactions/test/getLobbies.test.ts b/packages/transactions/test/getLobbies.test.ts index be8c74e0b..c5c7d2e7c 100644 --- a/packages/transactions/test/getLobbies.test.ts +++ b/packages/transactions/test/getLobbies.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { mockPino } from "../../../test/factoryMocks.js"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shareds"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { getLobbies } from "../src/getLobbies.js"; diff --git a/packages/transactions/test/login.test.ts b/packages/transactions/test/login.test.ts index 326394dfa..a7eaf1161 100644 --- a/packages/transactions/test/login.test.ts +++ b/packages/transactions/test/login.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { login } from "../src/login.js"; diff --git a/packages/transactions/test/trackingPing.test.ts b/packages/transactions/test/trackingPing.test.ts index c748ec0c7..061774cdf 100644 --- a/packages/transactions/test/trackingPing.test.ts +++ b/packages/transactions/test/trackingPing.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test, vi } from "vitest"; -import { getServerLogger } from "../../shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; import { OldServerMessage } from "../../shared/messageFactory.js"; import { trackingPing } from "../src/trackingPing.js"; diff --git a/server.ts b/server.ts index 0c0eab3bc..2be4fbaaf 100755 --- a/server.ts +++ b/server.ts @@ -19,7 +19,7 @@ import Sentry from "@sentry/node"; import { getGatewayServer } from "./packages/gateway/src/GatewayServer.js"; import { verifyLegacyCipherSupport } from "./packages/gateway/src/encryption.js"; import { getServerConfiguration } from "./packages/shared/Configuration.js"; -import { getServerLogger } from "./packages/shared/log.js"; +import { getServerLogger } from "rusty-motors-shared"; const coreLogger = getServerLogger({ From cec63ff67d1ac906f46049b824425e6d5507aa19 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 19:32:16 -0400 Subject: [PATCH 52/84] refactor: Update import paths for shared log module --- packages/shared/Configuration.ts | 132 +++++++++++++++---------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/packages/shared/Configuration.ts b/packages/shared/Configuration.ts index 57d870b0e..6075a612a 100644 --- a/packages/shared/Configuration.ts +++ b/packages/shared/Configuration.ts @@ -1,5 +1,5 @@ import { Logger } from "pino"; -import { getServerLogger } from "./log.js"; +import { getServerLogger } from "./src/log.js"; /** * @module shared/Configuration @@ -7,52 +7,52 @@ import { getServerLogger } from "./log.js"; */ export class Configuration { - certificateFile!: string; - privateKeyFile!: string; - publicKeyFile!: string; - host!: string; - logLevel!: string; - static instance: Configuration | undefined; - /** - * - * @param {object} args - * @param {string} [args.host="localhost"] - * @param {string} [args.certificateFile="certificates/certificate.pem"] - * @param {string} [args.privateKeyFile="certificates/privatekey.pem"] - * @param {string} [args.publicKeyFile="certificates/publickey.pem"] - * @param {string} [args.logLevel="info"] - * @param {module:pino.Logger} [args.logger=getServerLogger({})] - */ - constructor({ - host = "localhost", - certificateFile = "certificates/certificate.pem", - privateKeyFile = "certificates/privatekey.pem", - publicKeyFile = "certificates/publickey.pem", - logLevel = "info", - logger = getServerLogger({}), - }: { - host?: string; - certificateFile?: string; - privateKeyFile?: string; - publicKeyFile?: string; - logLevel?: string; - logger?: Logger; - }) { - try { - this.certificateFile = certificateFile; + certificateFile!: string; + privateKeyFile!: string; + publicKeyFile!: string; + host!: string; + logLevel!: string; + static instance: Configuration | undefined; + /** + * + * @param {object} args + * @param {string} [args.host="localhost"] + * @param {string} [args.certificateFile="certificates/certificate.pem"] + * @param {string} [args.privateKeyFile="certificates/privatekey.pem"] + * @param {string} [args.publicKeyFile="certificates/publickey.pem"] + * @param {string} [args.logLevel="info"] + * @param {module:pino.Logger} [args.logger=getServerLogger({})] + */ + constructor({ + host = "localhost", + certificateFile = "certificates/certificate.pem", + privateKeyFile = "certificates/privatekey.pem", + publicKeyFile = "certificates/publickey.pem", + logLevel = "info", + logger = getServerLogger({}), + }: { + host?: string; + certificateFile?: string; + privateKeyFile?: string; + publicKeyFile?: string; + logLevel?: string; + logger?: Logger; + }) { + try { + this.certificateFile = certificateFile; - this.privateKeyFile = privateKeyFile; + this.privateKeyFile = privateKeyFile; - this.publicKeyFile = publicKeyFile; + this.publicKeyFile = publicKeyFile; - this.host = host; + this.host = host; - this.logLevel = logLevel.toLowerCase(); - Configuration.instance = this; - } catch (error) { - logger.fatal(`Error in core server: ${String(error)}`); - } - } + this.logLevel = logLevel.toLowerCase(); + Configuration.instance = this; + } catch (error) { + logger.fatal(`Error in core server: ${String(error)}`); + } + } } /** @@ -68,30 +68,30 @@ export class Configuration { * @returns {Configuration} */ export function getServerConfiguration({ - host, - certificateFile, - privateKeyFile, - publicKeyFile, - logLevel, - logger, + host, + certificateFile, + privateKeyFile, + publicKeyFile, + logLevel, + logger, }: { - host?: string; - certificateFile?: string; - privateKeyFile?: string; - publicKeyFile?: string; - logLevel?: string; - logger?: Logger; + host?: string; + certificateFile?: string; + privateKeyFile?: string; + publicKeyFile?: string; + logLevel?: string; + logger?: Logger; }): Configuration { - if (typeof Configuration.instance === "undefined") { - Configuration.instance = new Configuration({ - host, - certificateFile, - privateKeyFile, - publicKeyFile, - logLevel, - logger, - }); - } + if (typeof Configuration.instance === "undefined") { + Configuration.instance = new Configuration({ + host, + certificateFile, + privateKeyFile, + publicKeyFile, + logLevel, + logger, + }); + } - return Configuration.instance; + return Configuration.instance; } From 557c1433176fda07347ad1edb4759d54bd70cb31 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Thu, 22 Aug 2024 19:54:14 -0400 Subject: [PATCH 53/84] refactor: Add SerializedBuffer to shared exports --- packages/shared/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 1907bc955..946d74bd3 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -2,8 +2,7 @@ export { SubThread } from "./SubThread.js"; export { NetworkMessage } from "./src/NetworkMessage.js"; export { ServerLogger, getServerLogger } from "./src/log.js"; export { Configuration, getServerConfiguration } from "./Configuration.js"; -export { McosEncryptionPair } from "./State.ts"; - +export { SerializedBuffer } from "./src/SerializedBuffer.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; From ade5ddbe053581197d0d42229b8eccd637a69817 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:45:46 -0400 Subject: [PATCH 54/84] refactor: Add ServerError to shared exports --- packages/shared/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 946d74bd3..9b36f11d6 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -5,6 +5,7 @@ export { Configuration, getServerConfiguration } from "./Configuration.js"; export { SerializedBuffer } from "./src/SerializedBuffer.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; +export { ServerError } from "./errors/ServerError.js"; export interface KeypressEvent { sequence: string; From 4b630ecfe288d6ba21b46997ea28027549cb223c Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:46:07 -0400 Subject: [PATCH 55/84] refactor: Disable useLiteralKeys lint rule in biome.json The useLiteralKeys lint rule was disabled in the biome.json file to allow the use of computed property names in object literals. This change improves the flexibility and readability of the codebase. --- biome.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/biome.json b/biome.json index ee9a136af..0b946b08c 100644 --- a/biome.json +++ b/biome.json @@ -10,7 +10,8 @@ "noMultipleSpacesInRegularExpressionLiterals": "error", "noUselessCatch": "error", "noWith": "error", - "useArrowFunction": "off" + "useArrowFunction": "off", + "useLiteralKeys":"off" }, "correctness": { "noConstAssign": "error", From af3136050ae8b18c3156743382faed7062d52df5 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:47:42 -0400 Subject: [PATCH 56/84] refactor: Add "biomejs.biome" to recommended extensions The "biomejs.biome" extension has been added to the list of recommended extensions in the ".vscode/extensions.json" file. This change ensures that users are prompted to install the "biomejs.biome" extension when opening the project in Visual Studio Code. It improves the development experience by providing additional functionality specific to the Biome project. --- .vscode/extensions.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index b17b16dd4..e40d9784c 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,9 +1,9 @@ { "recommendations": [ "ms-azuretools.vscode-docker", - "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", "ms-vscode.makefile-tools", - "usernamehw.errorlens" + "usernamehw.errorlens", + "biomejs.biome" ] -} +} \ No newline at end of file From 44fd10dba40957c1cc1a0c33c42f9c8a2f51c29e Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:48:34 -0400 Subject: [PATCH 57/84] chore: formatting --- packages/database/src/__generated__/login.ts | 8 +++----- packages/database/src/__generated__/profile.ts | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/database/src/__generated__/login.ts b/packages/database/src/__generated__/login.ts index 7d5ff4b79..7130589c9 100644 --- a/packages/database/src/__generated__/login.ts +++ b/packages/database/src/__generated__/login.ts @@ -2,16 +2,14 @@ * !!! This file is autogenerated do not edit by hand !!! * * Generated by: @databases/pg-schema-print-types - * Checksum: 2QhRIF5QcEQfsA954WH4A1F9qsXfxKnVpal+9mll0E4ca+DRjMppDopDbnwBmEv8SkKT0nnQXWrLw6pvis4gUQ== + * Checksum: jI7CFo4ToJ0njsv1Nz5ic3WC9Jh90718YRYWBe5SCUPkw4duMKQ+yAkyt0dwDDcaSCIrm3sW7/sFgWEzRmbj5A== */ /* eslint-disable */ // tslint:disable -import Player from './player' - interface Login { - customer_id: Player['customer_id'] + customer_id: number /** * @default 0 */ @@ -22,7 +20,7 @@ interface Login { export default Login; interface Login_InsertParameters { - customer_id: Player['customer_id'] + customer_id: number /** * @default 0 */ diff --git a/packages/database/src/__generated__/profile.ts b/packages/database/src/__generated__/profile.ts index 636e5ecd4..69eab1ad5 100644 --- a/packages/database/src/__generated__/profile.ts +++ b/packages/database/src/__generated__/profile.ts @@ -2,21 +2,19 @@ * !!! This file is autogenerated do not edit by hand !!! * * Generated by: @databases/pg-schema-print-types - * Checksum: cWy5E6rmsqYAjbb3s7l4A4U+62pKFdFWfooxs6rx6B0Ni3fTG5offgvrKqo5Ac0Dt+hX2hv/IETGAQkDutjQlw== + * Checksum: K5z3NAJNi7LjL4o2EgNAi4QT6I+QWNd4TXWcycmzlohj/F2l9sUIxjZds/2EF5SuNb/Huo65020zv4EuLdWHZA== */ /* eslint-disable */ // tslint:disable -import Player from './player' - interface Profile { /** * @default EXTRACT(epoch FROM now())::integer */ create_stamp: number current_key: string - customer_id: Player['customer_id'] + customer_id: number /** * @default false */ @@ -67,7 +65,7 @@ interface Profile_InsertParameters { */ create_stamp?: number current_key: string - customer_id: Player['customer_id'] + customer_id: number /** * @default false */ From aac22b4ce5bcf3e8499c3b97cb266dd3a8284615 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:49:46 -0400 Subject: [PATCH 58/84] chore: use dotenvx to load .env file for db types generation --- package.json | 202 +++++++++++++++++++++++++------------------------ pnpm-lock.yaml | 115 ++++++++++++++++++++++++++-- 2 files changed, 212 insertions(+), 105 deletions(-) diff --git a/package.json b/package.json index 20fe8fd18..fa229f7c1 100644 --- a/package.json +++ b/package.json @@ -1,101 +1,103 @@ { - "name": "mcos", - "version": "1.0.0", - "description": "a server", - "author": "Drazi Crendraven ", - "license": "AGPL-3.0", - "private": true, - "repository": { - "type": "git", - "url": "git@github.com:drazisil/mcos.git" - }, - "scripts": { - "clean": "rm --verbose -rf **/node_modules node_modules", - "start": "make start", - "check:all": "pnpm run -r --stream check", - "lint:all": "pnpm run -r --stream lint", - "format:all": "pnpm run -r --stream format", - "test": "npm run test:all", - "test:all": "pnpm run -r --stream test", - "types:db": "npm --workspace rusty-motors-database run types:db", - "migrate": "pg-migrations apply --directory migrations " - }, - "files": [ - "README.md", - "CHANGELOG.md", - "AUTHORS" - ], - "type": "module", - "dependencies": { - "@adminjs/sequelize": "^4.1.1", - "@databases/pg": "^5.5.0", - "@fastify/sensible": "^5.5.0", - "@sentry/node": "7.88", - "@sentry/profiling-node": "^1.3.2", - "adminjs": "^7.5.2", - "fastify": "^4.25.1", - "moment": "^2.29.4", - "pino": "^8.17.1", - "rusty-motors-database": "link:packages/database", - "rusty-motors-gateway": "link:packages/gateway", - "rusty-motors-nps": "link:packages/nps", - "rusty-motors-shared": "link:packages/shared", - "rusty-motors-shared-packets": "link:packages/shared-packets", - "sequelize": "^6.35.2", - "sqlite": "^5.1.1", - "ts-node": "10.9.2" - }, - "devDependencies": { - "@biomejs/biome": "1.8.3", - "@databases/pg-migrations": "^5.0.3", - "@databases/pg-test": "^3.1.2", - "@sentry/cli": "^2.23.1", - "@tsconfig/node-lts": "^20.1.0", - "@tsconfig/node20": "^20.1.2", - "@types/chai": "4.3.11", - "@types/node": "^22.5.0", - "@types/sinon": "17.0.2", - "@types/sinon-chai": "3.2.12", - "@typescript-eslint/eslint-plugin": "^6.15.0", - "@typescript-eslint/parser": "^6.15.0", - "@vitest/coverage-v8": "^2.0.5", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "5.1.1", - "husky": "^8.0.3", - "jsdoc": "^4.0.2", - "lint-staged": "^15.2.0", - "prettier": "3.1.1", - "prettier-eslint": "16.2.0", - "rimraf": "^5.0.5", - "standard-version": "^9.5.0", - "tsx": "4.7.0", - "typescript": "^5.3.3", - "typescript-eslint-language-service": "^5.0.5", - "vitest": "^2.0.5" - }, - "c8": { - "all": true, - "reporter": [ - "text", - "cobertura", - "html", - "lcov" - ], - "exclude": [ - "coverage", - "**/*.test.m{j,t}s", - "docs", - "docs2" - ] - }, - "lint-staged": { - "**/*.js": "eslint" - }, - "husky": { - "hooks": { - "pre-commit": "lint-staged" - } - }, - "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" -} + "name": "mcos", + "version": "1.0.0", + "description": "a server", + "author": "Drazi Crendraven ", + "license": "AGPL-3.0", + "private": true, + "repository": { + "type": "git", + "url": "git@github.com:drazisil/mcos.git" + }, + "scripts": { + "clean": "rm --verbose -rf **/node_modules node_modules", + "start": "make start", + "check:all": "pnpm run -r --stream check", + "lint:all": "pnpm run -r --stream lint", + "format:all": "pnpm run -r --stream format", + "test": "npm run test:all", + "test:all": "pnpm run -r --stream test", + "types:db": "pnpm --filter=rusty-motors-database run types:db", + "types": "dotenvx run -- pnpm run types:db", + "migrate": "pg-migrations apply --directory migrations " + }, + "files": [ + "README.md", + "CHANGELOG.md", + "AUTHORS" + ], + "type": "module", + "dependencies": { + "@adminjs/sequelize": "^4.1.1", + "@databases/pg": "^5.5.0", + "@dotenvx/dotenvx": "^1.10.2", + "@fastify/sensible": "^5.5.0", + "@sentry/node": "7.88", + "@sentry/profiling-node": "^1.3.2", + "adminjs": "^7.5.2", + "fastify": "^4.25.1", + "moment": "^2.29.4", + "pino": "^8.17.1", + "rusty-motors-database": "link:packages/database", + "rusty-motors-gateway": "link:packages/gateway", + "rusty-motors-nps": "link:packages/nps", + "rusty-motors-shared": "link:packages/shared", + "rusty-motors-shared-packets": "link:packages/shared-packets", + "sequelize": "^6.35.2", + "sqlite": "^5.1.1", + "ts-node": "10.9.2" + }, + "devDependencies": { + "@biomejs/biome": "1.8.3", + "@databases/pg-migrations": "^5.0.3", + "@databases/pg-test": "^3.1.2", + "@sentry/cli": "^2.23.1", + "@tsconfig/node-lts": "^20.1.0", + "@tsconfig/node20": "^20.1.2", + "@types/chai": "4.3.11", + "@types/node": "^22.5.0", + "@types/sinon": "17.0.2", + "@types/sinon-chai": "3.2.12", + "@typescript-eslint/eslint-plugin": "^6.15.0", + "@typescript-eslint/parser": "^6.15.0", + "@vitest/coverage-v8": "^2.0.5", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "5.1.1", + "husky": "^8.0.3", + "jsdoc": "^4.0.2", + "lint-staged": "^15.2.0", + "prettier": "3.1.1", + "prettier-eslint": "16.2.0", + "rimraf": "^5.0.5", + "standard-version": "^9.5.0", + "tsx": "4.7.0", + "typescript": "^5.3.3", + "typescript-eslint-language-service": "^5.0.5", + "vitest": "^2.0.5" + }, + "c8": { + "all": true, + "reporter": [ + "text", + "cobertura", + "html", + "lcov" + ], + "exclude": [ + "coverage", + "**/*.test.m{j,t}s", + "docs", + "docs2" + ] + }, + "lint-staged": { + "**/*.js": "eslint" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 89979ebe3..ba94ece89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,10 +10,13 @@ importers: dependencies: '@adminjs/sequelize': specifier: ^4.1.1 - version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3) + version: 4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0)) '@databases/pg': specifier: ^5.5.0 version: 5.5.0(typescript@5.5.4) + '@dotenvx/dotenvx': + specifier: ^1.10.2 + version: 1.10.2 '@fastify/sensible': specifier: ^5.5.0 version: 5.6.0 @@ -52,7 +55,7 @@ importers: version: link:packages/shared-packets sequelize: specifier: ^6.35.2 - version: 6.37.3 + version: 6.37.3(pg@8.12.0) sqlite: specifier: ^5.1.1 version: 5.1.1 @@ -1094,6 +1097,10 @@ packages: '@databases/with-container@2.1.1': resolution: {integrity: sha512-iHsOn/6ElWuGpcytgNh9ZAvFd78G0ikOMWj0DtMTB4fXVqRA5uYZpLpLv/fvwL895xT7VTbVA6HV3YoY0yuQUg==} + '@dotenvx/dotenvx@1.10.2': + resolution: {integrity: sha512-PmJBXsXCBFQp+WwAXpwpitXK2ceH1J/w+anrqzcdMutwkN+p4Xf7Rmd1nyhmvrz09WSZvoQb3oyy6KlSxU/9kQ==} + hasBin: true + '@emotion/babel-plugin@11.12.0': resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} @@ -1680,6 +1687,16 @@ packages: resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} + '@noble/ciphers@0.5.3': + resolution: {integrity: sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w==} + + '@noble/curves@1.5.0': + resolution: {integrity: sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -2899,6 +2916,10 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@12.1.0: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} @@ -3163,6 +3184,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dotgitignore@2.1.0: resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} engines: {node: '>=6'} @@ -3173,6 +3198,10 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eciesjs@0.4.7: + resolution: {integrity: sha512-4JQahOkBdDy27jjW4q3FJQigHlcwZXx28sCtBQkBamF2XUdcNXrInpgrr8h205MtVIS0CMHufyIKGVjtjxQ2ZA==} + engines: {node: '>=16.0.0'} + electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} @@ -3375,6 +3404,14 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fdir@6.2.0: + resolution: {integrity: sha512-9XaWcDl0riOX5j2kYfy0kKdg7skw3IY6kA4LFT8Tk2yF9UdrADUy8D6AJuBLtf7ISm/MksumwAHE3WVbMRyCLw==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3860,6 +3897,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} @@ -4266,6 +4307,10 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} + object-treeify@1.1.33: + resolution: {integrity: sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A==} + engines: {node: '>= 10'} + object.assign@4.1.5: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} @@ -4475,6 +4520,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.6.0: resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} engines: {node: '>=0.10'} @@ -5340,6 +5389,9 @@ packages: tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + tinyexec@0.2.0: + resolution: {integrity: sha512-au8dwv4xKSDR+Fw52csDo3wcDztPdne2oM1o/7LFro4h6bdFmvyUAeAfX40pwDtzHgRFqz1XWaUqgKS2G83/ig==} + tinymce@6.8.4: resolution: {integrity: sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg==} @@ -5658,6 +5710,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + why-is-node-running@2.3.0: resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} engines: {node: '>=8'} @@ -5792,11 +5849,11 @@ snapshots: - react-is - supports-color - '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3)': + '@adminjs/sequelize@4.1.1(adminjs@7.8.11(@types/react@18.3.4))(sequelize@6.37.3(pg@8.12.0))': dependencies: adminjs: 7.8.11(@types/react@18.3.4) escape-regexp: 0.0.1 - sequelize: 6.37.3 + sequelize: 6.37.3(pg@8.12.0) '@ampproject/remapping@2.3.0': dependencies: @@ -6861,6 +6918,18 @@ snapshots: transitivePeerDependencies: - supports-color + '@dotenvx/dotenvx@1.10.2': + dependencies: + commander: 11.1.0 + dotenv: 16.4.5 + eciesjs: 0.4.7 + fdir: 6.2.0(picomatch@4.0.2) + ignore: 5.3.2 + object-treeify: 1.1.33 + picomatch: 4.0.2 + tinyexec: 0.2.0 + which: 4.0.0 + '@emotion/babel-plugin@11.12.0': dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) @@ -7285,6 +7354,14 @@ snapshots: '@lukeed/ms@2.0.2': {} + '@noble/ciphers@0.5.3': {} + + '@noble/curves@1.5.0': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/hashes@1.4.0': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -8676,6 +8753,8 @@ snapshots: commander@10.0.1: {} + commander@11.1.0: {} + commander@12.1.0: {} commander@2.20.3: {} @@ -8985,6 +9064,8 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv@16.4.5: {} + dotgitignore@2.1.0: dependencies: find-up: 3.0.0 @@ -8994,6 +9075,12 @@ snapshots: eastasianwidth@0.2.0: {} + eciesjs@0.4.7: + dependencies: + '@noble/ciphers': 0.5.3 + '@noble/curves': 1.5.0 + '@noble/hashes': 1.4.0 + electron-to-chromium@1.5.13: {} emoji-regex@10.3.0: {} @@ -9301,6 +9388,10 @@ snapshots: dependencies: reusify: 1.0.4 + fdir@6.2.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -9776,6 +9867,8 @@ snapshots: isexe@2.0.0: {} + isexe@3.1.1: {} + isobject@3.0.1: {} istanbul-lib-coverage@3.2.2: {} @@ -10183,6 +10276,8 @@ snapshots: object-keys@1.1.1: {} + object-treeify@1.1.33: {} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 @@ -10396,6 +10491,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.6.0: {} pify@2.3.0: {} @@ -11027,7 +11124,7 @@ snapshots: sequelize-pool@7.1.0: {} - sequelize@6.37.3: + sequelize@6.37.3(pg@8.12.0): dependencies: '@types/debug': 4.1.12 '@types/validator': 13.12.0 @@ -11045,6 +11142,8 @@ snapshots: uuid: 8.3.2 validator: 13.12.0 wkx: 0.5.0 + optionalDependencies: + pg: 8.12.0 transitivePeerDependencies: - supports-color @@ -11351,6 +11450,8 @@ snapshots: tinybench@2.9.0: {} + tinyexec@0.2.0: {} + tinymce@6.8.4: {} tinypool@1.0.1: {} @@ -11635,6 +11736,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + why-is-node-running@2.3.0: dependencies: siginfo: 2.0.0 From 5c1e55bbc3454787a4e28c4fd8da2062bc1afd9c Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:50:23 -0400 Subject: [PATCH 59/84] refactor: Update database module imports and configuration This commit updates the imports and configuration in the database module. It replaces the deprecated imports from '@databases/pg' with the new imports from '@databases/pg'. It also updates the usage of the 'createConnectionPool' and 'tables' functions to use the default exports from the respective modules. Additionally, it updates the import path for the generated database schema file. These changes ensure compatibility with the latest version of the database module and improve the maintainability of the codebase. --- packages/database/src/services/database.ts | 16 ++++++++++------ packages/database/tsconfig.json | 6 ++++-- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/database/src/services/database.ts b/packages/database/src/services/database.ts index 0f72992d7..25c2187fc 100644 --- a/packages/database/src/services/database.ts +++ b/packages/database/src/services/database.ts @@ -1,11 +1,15 @@ -import createConnectionPool, { sql } from '@databases/pg'; -import tables from '@databases/pg-typed'; -import type DatabaseSchema from '../__generated__/index.js'; -const DatabaseSchema = await import('../__generated__/schema.json'); +import atdb from "@databases/pg"; +import { sql } from "@databases/pg"; +import tables from "@databases/pg-typed"; +import type DatabaseSchemaType from "../__generated__/index.js"; +const DatabaseSchema = await import("../__generated__/schema.json"); export { sql }; -export const db = createConnectionPool(process.env['DATABASE_URL']); +const createConnectionPool = atdb.default; +const defineTables = tables.default; + +export const db = createConnectionPool(process.env["DATABASE_URL"]); // You can list whatever tables you actually have here: export const { @@ -30,7 +34,7 @@ export const { warehouse: WarehouseSchema, login: LoginSchema, profile: ProfileSchema, -} = tables({ +} = defineTables({ databaseSchema: DatabaseSchema.default, }); export type { DatabaseSchema }; diff --git a/packages/database/tsconfig.json b/packages/database/tsconfig.json index a26c2f180..40c54fa19 100644 --- a/packages/database/tsconfig.json +++ b/packages/database/tsconfig.json @@ -2,10 +2,12 @@ "extends": "../../tsconfig.base.json", "compilerOptions": { "incremental": true, - "composite": true + "composite": true, + "resolveJsonModule": true }, "include": [ "index.ts", - "src" + "src", + "src/__generated__/schema.json" ] } \ No newline at end of file From a8bdd702513ecabb065459e8112914e7bcfbdfc5 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:51:13 -0400 Subject: [PATCH 60/84] refactor: Update SerializedBuffer class in shared module This commit updates the SerializedBuffer class in the shared module. It removes the constructor and modifies the deserialize method to return a SerializedBuffer instance. These changes improve the serialization and deserialization process, ensuring compatibility with the latest requirements and enhancing the overall functionality of the codebase. --- packages/shared/src/SerializedBuffer.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/shared/src/SerializedBuffer.ts b/packages/shared/src/SerializedBuffer.ts index c4fda93a4..9fe6fcbec 100644 --- a/packages/shared/src/SerializedBuffer.ts +++ b/packages/shared/src/SerializedBuffer.ts @@ -5,9 +5,7 @@ import { BaseSerialized } from "./BaseSerialized.js"; * A serialized buffer, prefixed with its 2-byte length. */ export class SerializedBuffer extends BaseSerialized { - constructor(data?: Buffer) { - super(data); - } + override serialize() { try { const buffer = Buffer.alloc(2 + this._data.length); @@ -18,7 +16,7 @@ export class SerializedBuffer extends BaseSerialized { throw ServerError.fromUnknown(error, "Unable to serialize buffer"); } } - override deserialize(buffer: Buffer) { + override deserialize(buffer: Buffer): SerializedBuffer { try { const length = buffer.readUInt16BE(0); if (buffer.length < 2 + length) { From 8fb934c16a1808fafa979c615ac690076e5320cf Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:51:35 -0400 Subject: [PATCH 61/84] refactor: Remove unused import and log statement in getWarehouseInventory This commit removes an unused import statement for WarehouseSchema and a log.resetName() statement in the getWarehouseInventory function. These changes improve the codebase by eliminating unnecessary code and reducing clutter. --- packages/database/src/functions/getWarehouseInventory.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/database/src/functions/getWarehouseInventory.ts b/packages/database/src/functions/getWarehouseInventory.ts index 6426d655d..908242300 100644 --- a/packages/database/src/functions/getWarehouseInventory.ts +++ b/packages/database/src/functions/getWarehouseInventory.ts @@ -1,4 +1,4 @@ -import { db, WarehouseSchema, getTuneables, sql } from "../../index.js"; +import { db, getTuneables, sql } from "../../index.js"; import { getServerLogger } from "rusty-motors-shared"; export type WarehouseInventory = { @@ -67,6 +67,5 @@ export async function getWarehouseInventory( dealOfTheDayDiscount: dealOfTheDayDiscount ?? 0, }; - log.resetName(); return inventory; } From b38d8b6b2ef580fcb5f3986801bca555c973fbe2 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:51:55 -0400 Subject: [PATCH 62/84] refactor: Update import paths for shared modules --- packages/core/src/serializationHelpers.ts | 2 +- packages/database/src/models/Lobby.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/serializationHelpers.ts b/packages/core/src/serializationHelpers.ts index b2b276835..9e4185cf7 100644 --- a/packages/core/src/serializationHelpers.ts +++ b/packages/core/src/serializationHelpers.ts @@ -1,4 +1,4 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; /** * Clamp a value between 0 and 255 diff --git a/packages/database/src/models/Lobby.ts b/packages/database/src/models/Lobby.ts index 6065c61f5..5a54095dd 100644 --- a/packages/database/src/models/Lobby.ts +++ b/packages/database/src/models/Lobby.ts @@ -1,9 +1,9 @@ -import { ServerError } from "../../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { ServerError } from "rusty-motors-shared"; +import { SerializedBuffer } from "rusty-motors-shared"; export class LobbyModel extends SerializedBuffer { // eslint-disable-next-line @typescript-eslint/no-unused-vars - deserialize(_inputBuffer: Buffer): LobbyModel { + override deserialize(_inputBuffer: Buffer): LobbyModel { throw new ServerError("Method not implemented."); } override serialize(): Buffer { From b2a3b836b13a21fe93f11aa45878beff603e829a Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 22:58:57 -0400 Subject: [PATCH 63/84] refactor: Update import paths for shared modules --- packages/gateway/src/GatewayServer.ts | 8 +++---- packages/gateway/src/encryption.ts | 4 ++-- packages/gateway/src/index.ts | 6 ++--- packages/shared/index.ts | 34 +++++++++++++++++---------- 4 files changed, 31 insertions(+), 21 deletions(-) diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 377fd367e..5336cfab2 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -9,13 +9,13 @@ import { receivePersonaData } from "../../persona/src/internal.js"; import { Configuration, getServerConfiguration, -} from "../../shared/Configuration.js"; +} from "rusty-motors-shared"; import { addOnDataHandler, createInitialState, fetchStateFromDatabase, -} from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +} from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { receiveTransactionsData } from "../../transactions/src/internal.js"; import { onSocketConnection } from "./index.js"; @@ -26,7 +26,7 @@ import { addWebRoutes } from "./web.js"; */ type GatewayOptions = { - config?: import("/home/drazisil/mcos/packages/shared/Configuration.js").Configuration; + config?: Configuration; log?: Logger; backlogAllowedCount?: number; listeningPortList?: number[]; diff --git a/packages/gateway/src/encryption.ts b/packages/gateway/src/encryption.ts index d8f1119a9..446257215 100644 --- a/packages/gateway/src/encryption.ts +++ b/packages/gateway/src/encryption.ts @@ -15,8 +15,8 @@ // along with this program. If not, see . import { createCipheriv, createDecipheriv, getCiphers } from "node:crypto"; -import { McosEncryptionPair } from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { McosEncryptionPair } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; /** * This function creates a new encryption pair for use with the game server diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 78c2a9a7f..6a7792acf 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -16,18 +16,18 @@ import { randomUUID } from "node:crypto"; import { - OnDataHandler, + type OnDataHandler, addSocket, fetchStateFromDatabase, getOnDataHandler, removeSocket, wrapSocket, -} from "../../shared/State.js"; +} from "rusty-motors-shared"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; -import { Logger } from "pino"; +import type { Logger } from "pino"; import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; import { getGatewayServer } from "./GatewayServer.js"; diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 9b36f11d6..d703b3643 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -6,21 +6,31 @@ export { SerializedBuffer } from "./src/SerializedBuffer.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; export { ServerError } from "./errors/ServerError.js"; +export { + McosEncryptionPair, + addSession, + createInitialState, + fetchStateFromDatabase, + addOnDataHandler, + addSocket, + getOnDataHandler, + removeSocket, + wrapSocket, +} from "./State.js"; +export type { OnDataHandler } from "./State.js"; export interface KeypressEvent { - sequence: string; - name: string; - ctrl: boolean; - meta: boolean; - shift: boolean; + sequence: string; + name: string; + ctrl: boolean; + meta: boolean; + shift: boolean; } export interface ConnectionRecord { - customerId: number; - connectionId: string; - sessionKey: string; - sKey: string; - contextId: string; + customerId: number; + connectionId: string; + sessionKey: string; + sKey: string; + contextId: string; } - - From 561ac933660701e041a504dc0f032051a7686a31 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 23:01:18 -0400 Subject: [PATCH 64/84] refactor: Update import paths for shared modules --- packages/gateway/src/index.ts | 9 +++++---- packages/gateway/src/web.ts | 4 ++-- packages/gateway/test/encryption.test.ts | 2 +- packages/shared/index.ts | 2 +- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 6a7792acf..8838e602d 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -17,18 +17,19 @@ import { randomUUID } from "node:crypto"; import { type OnDataHandler, + type ServiceResponse, addSocket, fetchStateFromDatabase, getOnDataHandler, removeSocket, wrapSocket, } from "rusty-motors-shared"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; import type { Logger } from "pino"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBuffer } from "rusty-motors-shared"; import { getGatewayServer } from "./GatewayServer.js"; /** @@ -156,7 +157,7 @@ export function onSocketConnection({ log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); // Deserialize the raw message - const rawMessage = new SerializedBuffer()._doDeserialize( + const rawMessage = new SerializedBuffer().deserialize( incomingDataAsBuffer, ); @@ -171,7 +172,7 @@ export function onSocketConnection({ }) .then( ( - /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, + response: ServiceResponse, ) => { log.debug("onData handler returned"); const { messages } = response; diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index f6eed1d72..a6b948c18 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -21,8 +21,8 @@ import { handleGetKey, handleGetRegistry, } from "../../shard/src/index.js"; -import { getServerConfiguration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerConfiguration } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; /** * Add web routes to the web server diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index db1a6ea42..acc7aede0 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -8,7 +8,7 @@ import { createInitialState, getEncryption, } from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { createCommandEncryptionPair, createDataEncryptionPair, diff --git a/packages/shared/index.ts b/packages/shared/index.ts index d703b3643..bfe66b2a7 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -17,7 +17,7 @@ export { removeSocket, wrapSocket, } from "./State.js"; -export type { OnDataHandler } from "./State.js"; +export type { OnDataHandler, ServiceResponse } from "./State.js"; export interface KeypressEvent { sequence: string; From 2711c8599b6a72c61b9e1a52091103802699fcf4 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sat, 24 Aug 2024 23:04:35 -0400 Subject: [PATCH 65/84] refactor: Update import paths for shared modules --- packages/gateway/test/encryption.test.ts | 2 +- packages/lobby/src/handlers/_setMyUserData.ts | 6 +++--- packages/shared/index.ts | 6 +++++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index acc7aede0..5b7716ee8 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -7,7 +7,7 @@ import { addEncryption, createInitialState, getEncryption, -} from "../../shared/State.js"; +} from "rusty-motors-shared"; import { ServerError } from "rusty-motors-shared"; import { createCommandEncryptionPair, diff --git a/packages/lobby/src/handlers/_setMyUserData.ts b/packages/lobby/src/handlers/_setMyUserData.ts index 96607b3fd..d344228c0 100644 --- a/packages/lobby/src/handlers/_setMyUserData.ts +++ b/packages/lobby/src/handlers/_setMyUserData.ts @@ -1,7 +1,7 @@ -import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; +import { getServerConfiguration } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; -import { LegacyMessage } from "../../../shared/LegacyMessage.js"; +import { LegacyMessage } from "rusty-motors-shared"; import { UserInfo } from "../UserInfoMessage.js"; import { updateUser } from "../../../database/index.js"; diff --git a/packages/shared/index.ts b/packages/shared/index.ts index bfe66b2a7..869a8c03f 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -8,7 +8,7 @@ export { ServerMessage } from "./src/ServerMessage.js"; export { ServerError } from "./errors/ServerError.js"; export { McosEncryptionPair, - addSession, + McosEncryption, addSession, createInitialState, fetchStateFromDatabase, addOnDataHandler, @@ -16,8 +16,12 @@ export { getOnDataHandler, removeSocket, wrapSocket, + addEncryption, + getEncryption, } from "./State.js"; +export type { State } from "./State.js"; export type { OnDataHandler, ServiceResponse } from "./State.js"; +export { LegacyMessage } from "./LegacyMessage.js"; export interface KeypressEvent { sequence: string; From 9e715d20be87b993a431a7793537f3abdd345c3c Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 04:37:45 -0400 Subject: [PATCH 66/84] refactor: Update import paths for shared modules - works --- packages/shared/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/shared/index.ts b/packages/shared/index.ts index d703b3643..869a8c03f 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -8,7 +8,7 @@ export { ServerMessage } from "./src/ServerMessage.js"; export { ServerError } from "./errors/ServerError.js"; export { McosEncryptionPair, - addSession, + McosEncryption, addSession, createInitialState, fetchStateFromDatabase, addOnDataHandler, @@ -16,8 +16,12 @@ export { getOnDataHandler, removeSocket, wrapSocket, + addEncryption, + getEncryption, } from "./State.js"; -export type { OnDataHandler } from "./State.js"; +export type { State } from "./State.js"; +export type { OnDataHandler, ServiceResponse } from "./State.js"; +export { LegacyMessage } from "./LegacyMessage.js"; export interface KeypressEvent { sequence: string; From 73ac98e510b6f6775bf4cbc461388088e2335e51 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 04:42:49 -0400 Subject: [PATCH 67/84] refactor: Update import paths for shared modules - works --- packages/gateway/src/web.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gateway/src/web.ts b/packages/gateway/src/web.ts index f6eed1d72..a6b948c18 100644 --- a/packages/gateway/src/web.ts +++ b/packages/gateway/src/web.ts @@ -21,8 +21,8 @@ import { handleGetKey, handleGetRegistry, } from "../../shard/src/index.js"; -import { getServerConfiguration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { getServerConfiguration } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; /** * Add web routes to the web server From 78c24743ea7d35da6ab08705051c6ebe1d1ad8a2 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 04:44:43 -0400 Subject: [PATCH 68/84] refactor: Update import paths for shared modules This commit updates the import paths for shared modules in the gateway test file. It replaces the relative import paths with the package name "rusty-motors-shared". This change improves the maintainability and readability of the codebase by using a more explicit and standardized import approach. --- packages/gateway/test/encryption.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gateway/test/encryption.test.ts b/packages/gateway/test/encryption.test.ts index db1a6ea42..5b7716ee8 100644 --- a/packages/gateway/test/encryption.test.ts +++ b/packages/gateway/test/encryption.test.ts @@ -7,8 +7,8 @@ import { addEncryption, createInitialState, getEncryption, -} from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +} from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; import { createCommandEncryptionPair, createDataEncryptionPair, From 596851cdb3fc3d38e6f6511861d82a4556720eb4 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 05:01:56 -0400 Subject: [PATCH 69/84] refactor: Update import paths for shared modules This commit updates the import paths for shared modules in the gateway test file. It replaces the relative import paths with the package name "rusty-motors-shared". This change improves the maintainability and readability of the codebase by using a more explicit and standardized import approach. --- packages/gateway/src/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 6a7792acf..45e5f4a7d 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -17,13 +17,14 @@ import { randomUUID } from "node:crypto"; import { type OnDataHandler, + type ServiceResponse, addSocket, fetchStateFromDatabase, getOnDataHandler, removeSocket, wrapSocket, } from "rusty-motors-shared"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; @@ -171,7 +172,7 @@ export function onSocketConnection({ }) .then( ( - /** @type {import("../../shared/State.js").ServiceResponse} */ response: import("../../shared/State.js").ServiceResponse, + response: ServiceResponse, ) => { log.debug("onData handler returned"); const { messages } = response; From 36e6769c7ac7b7ded4b65b7b36ab2440e2055fbe Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 07:04:42 -0400 Subject: [PATCH 70/84] refactor: Update import paths for shared modules - start works, lobby loads --- packages/gateway/src/index.ts | 5 +- packages/interfaces/index.d.ts | 4 +- packages/lobby/src/MiniRiffMessage.js | 4 +- .../lobby/src/handlers/encryptedCommand.ts | 20 ++++---- .../lobby/src/handlers/handleTrackingPing.ts | 6 +-- packages/lobby/src/handlers/heartbeat.js | 2 +- packages/lobby/src/handlers/index.js | 6 +-- .../src/handlers/requestConnectGameServer.ts | 15 +++--- packages/lobby/src/internal.ts | 18 +++---- .../handlers/handleSendMiniRiffList.test.ts | 2 +- packages/login/src/internal.ts | 51 +++++++++---------- packages/persona/src/_gameLogout.ts | 8 +-- packages/persona/src/_getFirstBuddy.ts | 8 +-- packages/persona/src/_selectGamePersona.ts | 8 +-- .../src/handlers/validatePersonaName.ts | 6 +-- packages/persona/src/index.js | 2 +- packages/persona/src/internal.ts | 20 ++++---- packages/shared/Configuration.ts | 2 +- packages/shared/GameMessage.ts | 6 +-- packages/shared/MessageBuffer.ts | 4 +- packages/shared/MessageHeader.ts | 4 +- packages/shared/MessageNode.ts | 4 +- packages/shared/OldServerMessage.ts | 4 +- ...alizedBuffer.ts => SerializedBufferOld.ts} | 8 +-- packages/shared/State.ts | 6 +-- packages/shared/TimeStamp.ts | 4 +- packages/shared/index.ts | 9 +++- packages/transactions/src/ArcadeCarMessage.ts | 6 +-- .../transactions/src/EntryFeePurseMessage.ts | 6 +-- packages/transactions/src/GameUrlsMessage.ts | 6 +-- .../transactions/src/GenericReplyMessage.ts | 6 +-- packages/transactions/src/LobbyMessage.ts | 6 +-- .../transactions/src/OwnedVehiclesMessage.ts | 6 +-- .../transactions/src/PartsAssemblyMessage.ts | 6 +-- .../transactions/src/PlayerInfoMessage.ts | 4 +- .../transactions/src/PlayerPhysicalMessage.ts | 4 +- .../src/PlayerRacingHistoryMessage.ts | 6 +-- packages/transactions/src/TLoginMessage.ts | 6 +-- packages/transactions/src/TunablesMessage.ts | 4 +- packages/transactions/src/internal.ts | 16 +++--- .../test/_getPlayerRaceHistory.test.ts | 2 +- packages/transactions/test/getLobbies.test.ts | 2 +- packages/transactions/test/login.test.ts | 2 +- .../transactions/test/trackingPing.test.ts | 2 +- 44 files changed, 167 insertions(+), 159 deletions(-) rename packages/shared/{SerializedBuffer.ts => SerializedBufferOld.ts} (75%) diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 45e5f4a7d..7e77cec09 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -17,6 +17,7 @@ import { randomUUID } from "node:crypto"; import { type OnDataHandler, + SerializedBufferOld, type ServiceResponse, addSocket, fetchStateFromDatabase, @@ -29,7 +30,7 @@ import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; import type { Logger } from "pino"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBuffer } from "rusty-motors-shared"; import { getGatewayServer } from "./GatewayServer.js"; /** @@ -157,7 +158,7 @@ export function onSocketConnection({ log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); // Deserialize the raw message - const rawMessage = new SerializedBuffer()._doDeserialize( + const rawMessage = new SerializedBufferOld()._doDeserialize( incomingDataAsBuffer, ); diff --git a/packages/interfaces/index.d.ts b/packages/interfaces/index.d.ts index 539841e36..93de3749f 100644 --- a/packages/interfaces/index.d.ts +++ b/packages/interfaces/index.d.ts @@ -4,7 +4,7 @@ import { Socket } from "node:net"; import pino from "pino"; import { Configuration } from "../shared/Configuration.js"; import { ServerError } from "../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../shared/SerializedBuffer.ts"; +import { SerializedBufferOld } from "../shared/SerializedBufferOld.ts"; /** * @module interfaces @@ -189,7 +189,7 @@ export interface RaceLobbyRecord { export interface ServiceArgs { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log: import("pino").Logger; } diff --git a/packages/lobby/src/MiniRiffMessage.js b/packages/lobby/src/MiniRiffMessage.js index 00f8976d4..2e542b1c7 100644 --- a/packages/lobby/src/MiniRiffMessage.js +++ b/packages/lobby/src/MiniRiffMessage.js @@ -1,9 +1,9 @@ import { ServerError } from "../../shared/errors/ServerError.js"; import { LegacyMessage, - SerializedBuffer, + SerializedBufferOld, serializeString, -} from "../../shared/messageFactory.js"; +} from "rusty-motors-shared"; export class MiniRiffMessage extends LegacyMessage { constructor() { diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index b0c059d5d..a4227042b 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -7,7 +7,7 @@ import { import { ServerError } from "../../../shared/errors/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; import { MessageBuffer } from "../../../shared/MessageBuffer.js"; -import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { _setMyUserData } from "./_setMyUserData.js"; import { handleGetMiniUserList } from "./handleGetMiniUserList.js"; @@ -22,11 +22,11 @@ import { handleSendMiniRiffList } from "./handleSendMiniRiffList.js"; * name: string, * handler: (args: { * connectionId: string, - * message: SerializedBuffer, + * message: SerializedBufferOld, * log: import("pino").Logger, * }) => Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>}[]} */ export const messageHandlers: { @@ -34,11 +34,11 @@ export const messageHandlers: { name: string; handler: (args: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log: import("pino").Logger; }) => Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }>; }[] = []; @@ -229,11 +229,11 @@ async function handleCommand({ * * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "Lobby" })] * @returns {Promise<{ * connectionId: string, -* messages: SerializedBuffer[], +* messages: SerializedBufferOld[], * }>} */ @@ -245,11 +245,11 @@ export async function handleEncryptedNPSCommand({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; @@ -276,7 +276,7 @@ export async function handleEncryptedNPSCommand({ log, }); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage.setBuffer((await encryptedResponse).message.serialize()); return { diff --git a/packages/lobby/src/handlers/handleTrackingPing.ts b/packages/lobby/src/handlers/handleTrackingPing.ts index d98cfba4f..9c7c11bc8 100644 --- a/packages/lobby/src/handlers/handleTrackingPing.ts +++ b/packages/lobby/src/handlers/handleTrackingPing.ts @@ -1,6 +1,6 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; export async function handleTrackingPing({ connectionId, @@ -10,11 +10,11 @@ export async function handleTrackingPing({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; diff --git a/packages/lobby/src/handlers/heartbeat.js b/packages/lobby/src/handlers/heartbeat.js index 605e85330..2b36aeae1 100644 --- a/packages/lobby/src/handlers/heartbeat.js +++ b/packages/lobby/src/handlers/heartbeat.js @@ -2,7 +2,7 @@ import { getServerLogger } from "rusty-motors-shared"; import { NPSMessage, SerializedBuffer, -} from "../../../shared/messageFactory.js"; +} from "rusty-motors-shared"; /** * @param {object} args diff --git a/packages/lobby/src/handlers/index.js b/packages/lobby/src/handlers/index.js index 32818b8a4..ce55743aa 100644 --- a/packages/lobby/src/handlers/index.js +++ b/packages/lobby/src/handlers/index.js @@ -1,5 +1,5 @@ // eslint-disable-next-line no-unused-vars -import { SerializedBuffer } from "../../../shared/messageFactory.js"; +import { SerializedBufferOld } from "rusty-motors-shared"; import { handleEncryptedNPSCommand } from "./encryptedCommand.js"; import { _npsHeartbeat } from "./heartbeat.js"; import { _npsRequestGameConnectServer } from "./requestConnectGameServer.js"; @@ -7,14 +7,14 @@ import { _npsRequestGameConnectServer } from "./requestConnectGameServer.js"; /** * @typedef {object} ServiceArgs * @property {string} connectionId - * @property {SerializedBuffer} message + * @property {SerializedBufferOld} message * @property {import("pino").Logger} log */ /** * @typedef {object} ServiceResponse * @property {string} connectionId - * @property {SerializedBuffer[] } messages + * @property {SerializedBufferOld[] } messages */ /** diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index e2883be5a..fbe1932c1 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -13,7 +13,7 @@ import { getEncryption, } from "../../../shared/State.js"; import { ServerError } from "../../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; import { UserInfoMessage } from "../UserInfoMessage.js"; import { fetchSessionKeyByCustomerId } from "../../../database/index.js"; @@ -40,7 +40,7 @@ export function toHex(data: Buffer): string { * @param {import("../../../interfaces/index.js").ServiceArgs} args * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ export async function _npsRequestGameConnectServer({ @@ -51,7 +51,7 @@ export async function _npsRequestGameConnectServer({ }), }: import("../../../interfaces/index.js").ServiceArgs): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { // This is a NPS_LoginInfo packet // As a legacy packet, it used the old NPSMessage format @@ -79,14 +79,15 @@ export async function _npsRequestGameConnectServer({ if (!existingEncryption) { // Set the encryption keys on the lobby connection - const keys = await fetchSessionKeyByCustomerId(customerId) - .catch((/** @type {unknown} */ error: unknown) => { + const keys = await fetchSessionKeyByCustomerId(customerId).catch( + (/** @type {unknown} */ error: unknown) => { throw new ServerError( `Unable to fetch session key for customerId ${customerId.toString()}: ${String( error, )}`, ); - }); + }, + ); if (keys === undefined) { throw new ServerError("Error fetching session keys!"); } @@ -126,7 +127,7 @@ export async function _npsRequestGameConnectServer({ `!!! outbound lobby login response packet: ${responsePacket.toString()}`, ); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage._doDeserialize(responsePacket.serialize()); return { diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index 050bf0535..a2224830c 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -17,7 +17,7 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { handleEncryptedNPSCommand } from "./handlers/encryptedCommand.js"; @@ -32,11 +32,11 @@ import { _npsRequestGameConnectServer } from "./handlers/requestConnectGameServe * name: string, * handler: (args: { * connectionId: string, - * message: SerializedBuffer, + * message: SerializedBufferOld, * log: import("pino").Logger, * }) => Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>}[]} */ export const messageHandlers: { @@ -44,11 +44,11 @@ export const messageHandlers: { name: string; handler: (args: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log: import("pino").Logger; }) => Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }>; }[] = [ { @@ -71,11 +71,11 @@ export const messageHandlers: { /** * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "PersonaServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} * @throws {Error} Unknown code was received */ @@ -87,11 +87,11 @@ export async function receiveLobbyData({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; diff --git a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts index 27a4a9884..23997a600 100644 --- a/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts +++ b/packages/lobby/test/handlers/handleSendMiniRiffList.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { LegacyMessage } from "../../../shared/messageFactory.js"; +import { LegacyMessage } from "rusty-motors-shared"; import { handleSendMiniRiffList } from "../../src/handlers/handleSendMiniRiffList.js"; describe("handleSendMiniRiffList", () => { diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index a809bf4ca..594b7c84c 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -17,7 +17,7 @@ import { getServerConfiguration } from "../../shared/Configuration.js"; import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { NetworkMessage } from "../../shared/src/NetworkMessage.js"; import { NPSUserStatus } from "./NPSUserStatus.js"; @@ -42,11 +42,11 @@ const userRecords: import("../../interfaces/index.js").UserRecordMini[] = [ * @private * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "LoginServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ async function login({ @@ -57,11 +57,11 @@ async function login({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { const data = message.serialize(); @@ -102,19 +102,16 @@ async function login({ // Save sessionkey in database under customerId log.debug("Preparing to update session key in db"); await updateSessionKey( - userRecord.customerId, - sessionKey ?? "", - contextId, - connectionId, - ) - .catch((error) => { - const err = new ServerError( - `Unable to update session key in the database: ${String( - error, - )}`, - ); - throw err; - }); + userRecord.customerId, + sessionKey ?? "", + contextId, + connectionId, + ).catch((error) => { + const err = new ServerError( + `Unable to update session key in the database: ${String(error)}`, + ); + throw err; + }); log.debug("Session key updated"); @@ -142,7 +139,7 @@ async function login({ log.debug("Returning login response"); log.debug(`Outbound message: ${outboundMessage.asHex()}`); - const outboundMessage2 = new SerializedBuffer(); + const outboundMessage2 = new SerializedBufferOld(); outboundMessage2._doDeserialize(outboundMessage.serialize()); log.debug( @@ -166,11 +163,11 @@ async function login({ * name: string, * handler: (args: { * connectionId: string, - * message: SerializedBuffer, + * message: SerializedBufferOld, * log: import("pino").Logger, * }) => Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>}[]} */ export const messageHandlers: { @@ -178,11 +175,11 @@ export const messageHandlers: { name: string; handler: (args: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log: import("pino").Logger; }) => Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }>; }[] = [ { @@ -198,11 +195,11 @@ export const messageHandlers: { * @export * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "LoginServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ export async function handleLoginData({ @@ -213,11 +210,11 @@ export async function handleLoginData({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; log.debug(`Received Login Server packet: ${connectionId}`); diff --git a/packages/persona/src/_gameLogout.ts b/packages/persona/src/_gameLogout.ts index 6805516ed..2366d200c 100644 --- a/packages/persona/src/_gameLogout.ts +++ b/packages/persona/src/_gameLogout.ts @@ -1,5 +1,5 @@ import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** @@ -10,7 +10,7 @@ import { LegacyMessage } from "../../shared/LegacyMessage.js"; * @param {import("pino").Logger} [args.log=getServerLogger({ module: "LoginServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ @@ -26,7 +26,7 @@ export async function _gameLogout({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.debug("_npsLogoutGameUser..."); const requestPacket = message; @@ -47,7 +47,7 @@ export async function _gameLogout({ })}`, ); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage._doDeserialize(responsePacket._doSerialize()); return { diff --git a/packages/persona/src/_getFirstBuddy.ts b/packages/persona/src/_getFirstBuddy.ts index 83ea26c04..090a1a4d3 100644 --- a/packages/persona/src/_getFirstBuddy.ts +++ b/packages/persona/src/_getFirstBuddy.ts @@ -1,5 +1,5 @@ import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { BuddyCount, BuddyInfoMessage, BuddyList } from "./BuddyInfoMessage.js"; @@ -16,7 +16,7 @@ export async function _getFirstBuddy({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { // This message is a versioned nps message const incomingMessage = new NPSMessage(); @@ -39,7 +39,7 @@ export async function _getFirstBuddy({ const buddyCountMessage = new BuddyCount(); buddyCountMessage.buddyCount = 0; - const outboundMessage1 = new SerializedBuffer(); + const outboundMessage1 = new SerializedBufferOld(); outboundMessage1._doDeserialize(buddyCountMessage.serialize()); const buddyInfoMessage = new BuddyInfoMessage(); @@ -59,7 +59,7 @@ export async function _getFirstBuddy({ buddyInfoMessage.add(buddyInfo); } - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage._doDeserialize(buddyInfoMessage.serialize()); log.debug( diff --git a/packages/persona/src/_selectGamePersona.ts b/packages/persona/src/_selectGamePersona.ts index 659ddd11c..9da79dbc5 100644 --- a/packages/persona/src/_selectGamePersona.ts +++ b/packages/persona/src/_selectGamePersona.ts @@ -1,5 +1,5 @@ import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** @@ -10,7 +10,7 @@ import { LegacyMessage } from "../../shared/LegacyMessage.js"; * @param {import("pino").Logger} [args.log=getServerLogger({ module: "LoginServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ @@ -26,7 +26,7 @@ export async function _selectGamePersona({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.debug("_npsSelectGamePersona..."); const requestPacket = message; @@ -51,7 +51,7 @@ export async function _selectGamePersona({ .toString("hex")} `, ); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage.setBuffer(responsePacket._doSerialize()); return { diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 187f039dc..76f2f9bec 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -1,5 +1,5 @@ import { getServerLogger } from "rusty-motors-shared"; -import { SerializedBuffer } from "../../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { RawMessage } from "../../../shared/src/RawMessage.js"; @@ -19,7 +19,7 @@ export async function validatePersonaName({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.debug("_npsLogoutGameUser..."); const requestPacket = message; @@ -39,7 +39,7 @@ export async function validatePersonaName({ })}`, ); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage._doDeserialize(responsePacket.serialize()); return { diff --git a/packages/persona/src/index.js b/packages/persona/src/index.js index d10bdfbfd..de685a3b1 100644 --- a/packages/persona/src/index.js +++ b/packages/persona/src/index.js @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { NPSMessage } from "../../shared/messageFactory.js"; +import { NPSMessage } from "rusty-motors-shared"; /** * Selects a game persona and marks it as in use diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index b60ff7884..bfb892976 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -19,7 +19,7 @@ import { getServerLogger } from "rusty-motors-shared"; import { Logger } from "pino"; import { getServerConfiguration } from "../../shared/Configuration.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { PersonaList, @@ -45,7 +45,7 @@ const NAME_BUFFER_SIZE = 30; * log: import("pino").Logger, * }) => Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>}[]} */ export const messageHandlers: { @@ -57,7 +57,7 @@ export const messageHandlers: { log: Logger; }) => Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }>; }[] = [ { @@ -162,7 +162,7 @@ async function getPersonaMapsByCustomerId( * @param {import("pino").Logger} [args.log=getServerLogger({ module: "LoginServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} */ async function getPersonaMaps({ @@ -175,7 +175,7 @@ async function getPersonaMaps({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.debug("_npsGetPersonaMaps..."); @@ -235,7 +235,7 @@ async function getPersonaMaps({ })}`, ); - const outboundMessage = new SerializedBuffer(); + const outboundMessage = new SerializedBufferOld(); outboundMessage._doDeserialize(personaMapsMessage.serialize()); return { @@ -262,11 +262,11 @@ async function getPersonaMaps({ * * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "PersonaServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[], + * messages: SerializedBufferOld[], * }>} * @throws {Error} Unknown code was received */ @@ -278,11 +278,11 @@ export async function receivePersonaData({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; const { data } = message; diff --git a/packages/shared/Configuration.ts b/packages/shared/Configuration.ts index 6075a612a..37b9c31f7 100644 --- a/packages/shared/Configuration.ts +++ b/packages/shared/Configuration.ts @@ -1,4 +1,4 @@ -import { Logger } from "pino"; +import type { Logger } from "pino"; import { getServerLogger } from "./src/log.js"; /** diff --git a/packages/shared/GameMessage.ts b/packages/shared/GameMessage.ts index a76eca96b..b7367d287 100644 --- a/packages/shared/GameMessage.ts +++ b/packages/shared/GameMessage.ts @@ -1,7 +1,7 @@ import { GameMessageHeader } from "./GameMessageHeader.js"; -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; -export class GameMessage extends SerializedBuffer { +export class GameMessage extends SerializedBufferOld { _header: GameMessageHeader; _recordData: Buffer; constructor(gameMessageId: number) { @@ -22,7 +22,7 @@ export class GameMessage extends SerializedBuffer { } /** @deprecated - Use deserialize instead */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { + override _doDeserialize(buffer: Buffer): SerializedBufferOld { this._header._doDeserialize(buffer); this._recordData = Buffer.alloc(this._header._gameMessageLength - 4); buffer.copy(this._recordData, 0, 8); diff --git a/packages/shared/MessageBuffer.ts b/packages/shared/MessageBuffer.ts index 3a0271552..4444e1a48 100644 --- a/packages/shared/MessageBuffer.ts +++ b/packages/shared/MessageBuffer.ts @@ -1,8 +1,8 @@ import { ServerError } from "./errors/ServerError.js"; import { MessageHeader } from "./MessageHeader.js"; -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; -export class MessageBuffer extends SerializedBuffer { +export class MessageBuffer extends SerializedBufferOld { _header: MessageHeader; _buffer: Buffer; constructor() { diff --git a/packages/shared/MessageHeader.ts b/packages/shared/MessageHeader.ts index f605be619..1ecd5ec76 100644 --- a/packages/shared/MessageHeader.ts +++ b/packages/shared/MessageHeader.ts @@ -1,6 +1,6 @@ -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; -export class MessageHeader extends SerializedBuffer { +export class MessageHeader extends SerializedBufferOld { _size: number; _messageId: number; _messageLength: number; diff --git a/packages/shared/MessageNode.ts b/packages/shared/MessageNode.ts index be72ffa2c..633ec2a27 100644 --- a/packages/shared/MessageNode.ts +++ b/packages/shared/MessageNode.ts @@ -1,5 +1,5 @@ import { ServerError } from "./errors/ServerError.js"; -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; export class MessageNode { header: { @@ -26,7 +26,7 @@ export class MessageNode { * @param {module:shared/RawMessage} rawMessage * @return {MessageNode} */ - static fromRawMessage(rawMessage: SerializedBuffer): MessageNode { + static fromRawMessage(rawMessage: SerializedBufferOld): MessageNode { const messageNode = new MessageNode(); messageNode.deserialize(rawMessage.serialize()); diff --git a/packages/shared/OldServerMessage.ts b/packages/shared/OldServerMessage.ts index 79d58b3f2..35f24eea2 100644 --- a/packages/shared/OldServerMessage.ts +++ b/packages/shared/OldServerMessage.ts @@ -1,4 +1,4 @@ -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; import { serverHeader } from "./serverHeader.js"; /** @@ -7,7 +7,7 @@ import { serverHeader } from "./serverHeader.js"; * @mixin {SerializableMixin} */ -export class OldServerMessage extends SerializedBuffer { +export class OldServerMessage extends SerializedBufferOld { _header: serverHeader; _msgNo: number; constructor() { diff --git a/packages/shared/SerializedBuffer.ts b/packages/shared/SerializedBufferOld.ts similarity index 75% rename from packages/shared/SerializedBuffer.ts rename to packages/shared/SerializedBufferOld.ts index 1ab54e012..72e7e0c73 100644 --- a/packages/shared/SerializedBuffer.ts +++ b/packages/shared/SerializedBufferOld.ts @@ -7,16 +7,18 @@ import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; * @mixin {SerializableMixin} */ -export class SerializedBuffer extends SerializableMixin(AbstractSerializable) { +export class SerializedBufferOld extends SerializableMixin( + AbstractSerializable, +) { constructor() { super(); } /** * @param {Buffer} buffer - * @returns {SerializedBuffer} + * @returns {SerializedBufferOld} */ - override _doDeserialize(buffer: Buffer): SerializedBuffer { + override _doDeserialize(buffer: Buffer): SerializedBufferOld { this.setBuffer(buffer); return this; } diff --git a/packages/shared/State.ts b/packages/shared/State.ts index 71ddbfacc..b9b73b9bb 100644 --- a/packages/shared/State.ts +++ b/packages/shared/State.ts @@ -9,7 +9,7 @@ import { Cipher, Decipher } from "crypto"; import { Socket } from "node:net"; import { Logger } from "pino"; -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; /** * @external RawMessage @@ -181,7 +181,7 @@ export function wrapSocket( interface OnDataHandlerArgs { args: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: Logger; }; } @@ -191,7 +191,7 @@ interface OnDataHandlerArgs { export interface ServiceResponse { connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; } export type OnDataHandler = Function; diff --git a/packages/shared/TimeStamp.ts b/packages/shared/TimeStamp.ts index c74a6b974..077dbbd35 100644 --- a/packages/shared/TimeStamp.ts +++ b/packages/shared/TimeStamp.ts @@ -1,6 +1,6 @@ -import { SerializedBuffer } from "./SerializedBuffer.js"; +import { SerializedBufferOld } from "./SerializedBufferOld.js"; -export class Timestamp extends SerializedBuffer { +export class Timestamp extends SerializedBufferOld { _year: number; _month: number; _day: number; diff --git a/packages/shared/index.ts b/packages/shared/index.ts index 869a8c03f..c1c18b1fe 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -1,14 +1,21 @@ +import { LegacyMessage } from "./LegacyMessage.js"; + export { SubThread } from "./SubThread.js"; export { NetworkMessage } from "./src/NetworkMessage.js"; export { ServerLogger, getServerLogger } from "./src/log.js"; export { Configuration, getServerConfiguration } from "./Configuration.js"; export { SerializedBuffer } from "./src/SerializedBuffer.js"; +export { SerializedBufferOld } from "./SerializedBufferOld.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; +export { AbstractSerializable, SerializableMixin } from "./messageFactory.js"; export { ServerError } from "./errors/ServerError.js"; +export {NPSMessage} from "./NPSMessage.js"; +export {OldServerMessage} from "./OldServerMessage.js"; export { McosEncryptionPair, - McosEncryption, addSession, + McosEncryption, + addSession, createInitialState, fetchStateFromDatabase, addOnDataHandler, diff --git a/packages/transactions/src/ArcadeCarMessage.ts b/packages/transactions/src/ArcadeCarMessage.ts index 1d61c4163..5448e8aca 100644 --- a/packages/transactions/src/ArcadeCarMessage.ts +++ b/packages/transactions/src/ArcadeCarMessage.ts @@ -14,13 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ -export class ArcadeCarMessage extends SerializedBuffer { +export class ArcadeCarMessage extends SerializedBufferOld { _msgNo: number; _carCount: number; _shouldExpectMoreMessages: boolean; @@ -70,7 +70,7 @@ export class ArcadeCarMessage extends SerializedBuffer { } } -export class ArcadeCarInfo extends SerializedBuffer { +export class ArcadeCarInfo extends SerializedBufferOld { _brandedPartId: number; _lobbyId: number; constructor() { diff --git a/packages/transactions/src/EntryFeePurseMessage.ts b/packages/transactions/src/EntryFeePurseMessage.ts index 5da60cf94..98ea54ee7 100644 --- a/packages/transactions/src/EntryFeePurseMessage.ts +++ b/packages/transactions/src/EntryFeePurseMessage.ts @@ -15,13 +15,13 @@ // along with this program. If not, see . import { ServerError } from "../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** * A message listing the entry fees and purses for each entry fee * This is the body of a MessageNode */ -export class EntryFeePurseMessage extends SerializedBuffer { +export class EntryFeePurseMessage extends SerializedBufferOld { _msgNo: number; _numberOfPurseEntries: number; _shouldExpectMoreMessages: boolean; @@ -71,7 +71,7 @@ export class EntryFeePurseMessage extends SerializedBuffer { } } -export class PurseEntry extends SerializedBuffer { +export class PurseEntry extends SerializedBufferOld { _entryFee: number; // 4 bytes _purse: number; // 4 bytes constructor() { diff --git a/packages/transactions/src/GameUrlsMessage.ts b/packages/transactions/src/GameUrlsMessage.ts index 825ac3520..f8fe88acc 100644 --- a/packages/transactions/src/GameUrlsMessage.ts +++ b/packages/transactions/src/GameUrlsMessage.ts @@ -14,14 +14,14 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { serializeString } from "../../shared/serializeString.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ -export class GameUrlsMessage extends SerializedBuffer { +export class GameUrlsMessage extends SerializedBufferOld { _msgNo: number; _urlCount: number; _shouldExpectMoreMessages: boolean; @@ -71,7 +71,7 @@ export class GameUrlsMessage extends SerializedBuffer { } } -export class GameUrl extends SerializedBuffer { +export class GameUrl extends SerializedBufferOld { _urlId: number; urlRef: string; constructor() { diff --git a/packages/transactions/src/GenericReplyMessage.ts b/packages/transactions/src/GenericReplyMessage.ts index da3b81f0f..9fa2ba6c7 100644 --- a/packages/transactions/src/GenericReplyMessage.ts +++ b/packages/transactions/src/GenericReplyMessage.ts @@ -14,9 +14,9 @@ * @property {Buffer} data2 */ -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; -export class GenericReply extends SerializedBuffer { +export class GenericReply extends SerializedBufferOld { msgNo: number; msgReply: number; result: Buffer; @@ -56,7 +56,7 @@ export class GenericReply extends SerializedBuffer { } } -export class GenericReplyMessage extends SerializedBuffer { +export class GenericReplyMessage extends SerializedBufferOld { msgNo: number; toFrom: number; appId: number; diff --git a/packages/transactions/src/LobbyMessage.ts b/packages/transactions/src/LobbyMessage.ts index a67360187..cc714b90f 100644 --- a/packages/transactions/src/LobbyMessage.ts +++ b/packages/transactions/src/LobbyMessage.ts @@ -15,13 +15,13 @@ // along with this program. If not, see . import { ServerError } from "../../shared/errors/ServerError.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ -export class LobbyMessage extends SerializedBuffer { +export class LobbyMessage extends SerializedBufferOld { _msgNo: number; _lobbyCount: number; _shouldExpectMoreMessages: boolean; @@ -71,7 +71,7 @@ export class LobbyMessage extends SerializedBuffer { } } -export class LobbyInfo extends SerializedBuffer { +export class LobbyInfo extends SerializedBufferOld { _lobbyId: number; _raceTypeId: number; _terfId: number; diff --git a/packages/transactions/src/OwnedVehiclesMessage.ts b/packages/transactions/src/OwnedVehiclesMessage.ts index 4fb37eccf..34e321bcb 100644 --- a/packages/transactions/src/OwnedVehiclesMessage.ts +++ b/packages/transactions/src/OwnedVehiclesMessage.ts @@ -14,13 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** * A message listing the player's owned vehicles * This is the body of a MessageNode */ -export class OwnedVehiclesMessage extends SerializedBuffer { +export class OwnedVehiclesMessage extends SerializedBufferOld { _msgNo: number; _numberOfVehicles: number; _vehicleList: OwnedVehicle[]; @@ -67,7 +67,7 @@ export class OwnedVehiclesMessage extends SerializedBuffer { } } -export class OwnedVehicle extends SerializedBuffer { +export class OwnedVehicle extends SerializedBufferOld { _vehicleId: number; _brandedPartId: number; constructor() { diff --git a/packages/transactions/src/PartsAssemblyMessage.ts b/packages/transactions/src/PartsAssemblyMessage.ts index 9454158d7..30972069e 100644 --- a/packages/transactions/src/PartsAssemblyMessage.ts +++ b/packages/transactions/src/PartsAssemblyMessage.ts @@ -1,6 +1,6 @@ -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; -export class PartsAssemblyMessage extends SerializedBuffer { +export class PartsAssemblyMessage extends SerializedBufferOld { _msgNo: number; _ownerId: number; _numberOfParts: number; @@ -37,7 +37,7 @@ export class PartsAssemblyMessage extends SerializedBuffer { } } -export class Part extends SerializedBuffer { +export class Part extends SerializedBufferOld { _partId: number; // 4 bytes _parentPartId: number; // 4 bytes _brandedPartId: number; // 4 bytes diff --git a/packages/transactions/src/PlayerInfoMessage.ts b/packages/transactions/src/PlayerInfoMessage.ts index 4fe7d1425..6c1960efb 100644 --- a/packages/transactions/src/PlayerInfoMessage.ts +++ b/packages/transactions/src/PlayerInfoMessage.ts @@ -15,14 +15,14 @@ // along with this program. If not, see . import { Timestamp } from "../../shared/TimeStamp.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { serializeStringRaw } from "../../shared/serializeStringRaw.js"; /** * A message listing the player's owned vehicles * This is the body of a MessageNode */ -export class PlayerInfoMessage extends SerializedBuffer { +export class PlayerInfoMessage extends SerializedBufferOld { _msgNo: number; // 2 bytes _playerId: number; // 4 bytes _playerName: string; // 13 bytes diff --git a/packages/transactions/src/PlayerPhysicalMessage.ts b/packages/transactions/src/PlayerPhysicalMessage.ts index 015897225..89c4ac7ab 100644 --- a/packages/transactions/src/PlayerPhysicalMessage.ts +++ b/packages/transactions/src/PlayerPhysicalMessage.ts @@ -1,6 +1,6 @@ -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; -export class PlayerPhysicalMessage extends SerializedBuffer { +export class PlayerPhysicalMessage extends SerializedBufferOld { _msgNo: number; // 2 bytes _playerId: number; // 4 bytes _bodytype: number; // 4 bytes diff --git a/packages/transactions/src/PlayerRacingHistoryMessage.ts b/packages/transactions/src/PlayerRacingHistoryMessage.ts index 2e80f73cf..91ca419fa 100644 --- a/packages/transactions/src/PlayerRacingHistoryMessage.ts +++ b/packages/transactions/src/PlayerRacingHistoryMessage.ts @@ -1,6 +1,6 @@ -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; -export class PlayerRacingHistoryMessage extends SerializedBuffer { +export class PlayerRacingHistoryMessage extends SerializedBufferOld { _msgId: number; // 2 bytes _userId: number; // 4 bytes _numRaces: number; // 2 bytes @@ -75,7 +75,7 @@ export class PlayerRacingHistoryMessage extends SerializedBuffer { } } -export class RacingHistoryRecordEntry extends SerializedBuffer { +export class RacingHistoryRecordEntry extends SerializedBufferOld { raceType: number; // 4 bytes numberOfRacesEntered: number; // 4 bytes numberOfRacesFinished: number; // 4 bytes diff --git a/packages/transactions/src/TLoginMessage.ts b/packages/transactions/src/TLoginMessage.ts index 10427d68b..aad996ff8 100644 --- a/packages/transactions/src/TLoginMessage.ts +++ b/packages/transactions/src/TLoginMessage.ts @@ -15,15 +15,15 @@ // along with this program. If not, see . import { OldServerMessage } from "../../shared/OldServerMessage.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; -export class ListEntry extends SerializedBuffer { +export class ListEntry extends SerializedBufferOld { constructor() { super(); } } -export class LoginCompleteMessage extends SerializedBuffer { +export class LoginCompleteMessage extends SerializedBufferOld { _msgNo: number; _serverTime: number; _firstTime: boolean; diff --git a/packages/transactions/src/TunablesMessage.ts b/packages/transactions/src/TunablesMessage.ts index 57d4f1f3f..447279d89 100644 --- a/packages/transactions/src/TunablesMessage.ts +++ b/packages/transactions/src/TunablesMessage.ts @@ -14,13 +14,13 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** * A message listing the lobbies * This is the body of a MessageNode */ -export class TunablesMessage extends SerializedBuffer { +export class TunablesMessage extends SerializedBufferOld { _msgNo: number; _clubCreationCost: number; _clubCreationRequiredLevel: number; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index 77e267886..35bed4def 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -24,7 +24,7 @@ import { ServerError } from "../../shared/errors/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; // eslint-disable-next-line no-unused-vars import { OldServerMessage } from "../../shared/OldServerMessage.js"; -import { SerializedBuffer } from "../../shared/SerializedBuffer.js"; +import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { ServerMessage } from "../../shared/src/ServerMessage.js"; import { messageHandlers } from "./handlers.js"; @@ -130,11 +130,11 @@ async function processInput({ /** * @param {object} args * @param {string} args.connectionId - * @param {SerializedBuffer} args.message + * @param {SerializedBufferOld} args.message * @param {import("pino").Logger} [args.log=getServerLogger({ module: "transactionServer" })] * @returns {Promise<{ * connectionId: string, - * messages: SerializedBuffer[] + * messages: SerializedBufferOld[] * }>} */ export async function receiveTransactionsData({ @@ -145,11 +145,11 @@ export async function receiveTransactionsData({ }), }: { connectionId: string; - message: SerializedBuffer; + message: SerializedBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - messages: SerializedBuffer[]; + messages: SerializedBufferOld[]; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; @@ -212,7 +212,7 @@ export async function receiveTransactionsData({ }); // Loop through the outbound messages and encrypt them - const outboundMessages: SerializedBuffer[] = []; + const outboundMessages: SerializedBufferOld[] = []; response.messages.forEach((outboundMessage) => { log.debug(`Outbound message: ${outboundMessage.toString()}`); @@ -253,7 +253,7 @@ export async function receiveTransactionsData({ log.debug(`Encrypted message: ${outboundMessage.toString()}`); - const outboundRawMessage = new SerializedBuffer(); + const outboundRawMessage = new SerializedBufferOld(); outboundRawMessage.setBuffer(outboundMessage.serialize()); log.debug( `Encrypted message: ${outboundRawMessage.toString()}`, @@ -265,7 +265,7 @@ export async function receiveTransactionsData({ ); } } else { - const outboundRawMessage = new SerializedBuffer(); + const outboundRawMessage = new SerializedBufferOld(); outboundRawMessage.setBuffer(outboundMessage.serialize()); log.debug(`Outbound message: ${outboundRawMessage.toString()}`); outboundMessages.push(outboundRawMessage); diff --git a/packages/transactions/test/_getPlayerRaceHistory.test.ts b/packages/transactions/test/_getPlayerRaceHistory.test.ts index c3efd314b..27fc7bd64 100644 --- a/packages/transactions/test/_getPlayerRaceHistory.test.ts +++ b/packages/transactions/test/_getPlayerRaceHistory.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { getServerLogger } from "rusty-motors-shared"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "rusty-motors-shared"; import { _getPlayerRaceHistory } from "../src/_getPlayerRaceHistory.js"; describe("_getPlayerRaceHistory", () => { diff --git a/packages/transactions/test/getLobbies.test.ts b/packages/transactions/test/getLobbies.test.ts index c5c7d2e7c..dfac4f1b9 100644 --- a/packages/transactions/test/getLobbies.test.ts +++ b/packages/transactions/test/getLobbies.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from "vitest"; import { mockPino } from "../../../test/factoryMocks.js"; import { getServerLogger } from "rusty-motors-shareds"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "rusty-motors-shared"; import { getLobbies } from "../src/getLobbies.js"; describe("getLobbies", () => { diff --git a/packages/transactions/test/login.test.ts b/packages/transactions/test/login.test.ts index a7eaf1161..e0b1dce5c 100644 --- a/packages/transactions/test/login.test.ts +++ b/packages/transactions/test/login.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from "vitest"; import { getServerLogger } from "rusty-motors-shared"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "rusty-motors-shared"; import { login } from "../src/login.js"; describe("login", () => { diff --git a/packages/transactions/test/trackingPing.test.ts b/packages/transactions/test/trackingPing.test.ts index 061774cdf..148a9417a 100644 --- a/packages/transactions/test/trackingPing.test.ts +++ b/packages/transactions/test/trackingPing.test.ts @@ -1,6 +1,6 @@ import { describe, expect, test, vi } from "vitest"; import { getServerLogger } from "rusty-motors-shared"; -import { OldServerMessage } from "../../shared/messageFactory.js"; +import { OldServerMessage } from "rusty-motors-shared"; import { trackingPing } from "../src/trackingPing.js"; describe("trackingPing", () => { From ad69707edd9e5568aa1a581ab1a11e065c5c63fa Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 07:25:16 -0400 Subject: [PATCH 71/84] refactor: Update import paths for shared modules - start works, lobby loads --- packages/cli/ConsoleThread.ts | 6 +++--- packages/gateway/index.ts | 2 +- packages/interfaces/index.d.ts | 6 +++--- packages/lobby/src/handlers/encryptedCommand.ts | 10 +++++----- packages/lobby/src/handlers/handleGetMiniUserList.ts | 2 +- .../lobby/src/handlers/handleSendMiniRiffList.ts | 2 +- .../lobby/src/handlers/requestConnectGameServer.ts | 2 +- packages/lobby/src/internal.ts | 2 +- .../shared/{MessageBuffer.ts => MessageBufferOld.ts} | 12 ++++++------ packages/shared/index.ts | 5 +++-- 10 files changed, 25 insertions(+), 24 deletions(-) rename packages/shared/{MessageBuffer.ts => MessageBufferOld.ts} (93%) diff --git a/packages/cli/ConsoleThread.ts b/packages/cli/ConsoleThread.ts index 283e0620e..df7983f01 100644 --- a/packages/cli/ConsoleThread.ts +++ b/packages/cli/ConsoleThread.ts @@ -1,8 +1,8 @@ import { emitKeypressEvents } from "node:readline"; // eslint-disable-next-line no-unused-vars -import { Gateway } from "../gateway/src/GatewayServer.js"; -import { SubThread } from "../shared/SubThread.js"; -import { ServerError } from "../shared/errors/ServerError.js"; +import { Gateway } from "rusty-motors-gateway"; +import { SubThread } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; /** * @module ConsoleThread diff --git a/packages/gateway/index.ts b/packages/gateway/index.ts index 4f86d8559..4bcdddb3a 100644 --- a/packages/gateway/index.ts +++ b/packages/gateway/index.ts @@ -1 +1 @@ -export { getGatewayServer } from "./src/GatewayServer.js"; +export { getGatewayServer, Gateway } from "./src/GatewayServer.js"; diff --git a/packages/interfaces/index.d.ts b/packages/interfaces/index.d.ts index 93de3749f..aeb81bb56 100644 --- a/packages/interfaces/index.d.ts +++ b/packages/interfaces/index.d.ts @@ -2,9 +2,9 @@ import { Cipher, Decipher } from "node:crypto"; import { IncomingMessage, ServerResponse } from "node:http"; import { Socket } from "node:net"; import pino from "pino"; -import { Configuration } from "../shared/Configuration.js"; -import { ServerError } from "../shared/errors/ServerError.js"; -import { SerializedBufferOld } from "../shared/SerializedBufferOld.ts"; +import { Configuration } from "rusty-motors-shared"; +import { ServerError } from "rusty-motors-shared"; +import { SerializedBufferOld } from "rusty-motors-shared"; /** * @module interfaces diff --git a/packages/lobby/src/handlers/encryptedCommand.ts b/packages/lobby/src/handlers/encryptedCommand.ts index a4227042b..985aad5f1 100644 --- a/packages/lobby/src/handlers/encryptedCommand.ts +++ b/packages/lobby/src/handlers/encryptedCommand.ts @@ -4,9 +4,9 @@ import { getEncryption, updateEncryption, } from "../../../shared/State.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; -import { MessageBuffer } from "../../../shared/MessageBuffer.js"; +import { MessageBufferOld } from "rusty-motors-shared"; import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; import { _setMyUserData } from "./_setMyUserData.js"; @@ -62,11 +62,11 @@ async function encryptCmd({ }), }: { connectionId: string; - message: LegacyMessage | MessageBuffer; + message: LegacyMessage | MessageBufferOld; log?: import("pino").Logger; }): Promise<{ connectionId: string; - message: LegacyMessage | MessageBuffer; + message: LegacyMessage | MessageBufferOld; }> { const state = fetchStateFromDatabase(); @@ -197,7 +197,7 @@ async function handleCommand({ log?: import("pino").Logger; }): Promise<{ connectionId: string; - message: MessageBuffer | LegacyMessage; + message: MessageBufferOld | LegacyMessage; }> { log.level = getServerConfiguration({}).logLevel ?? "info"; const incommingRequest = message; diff --git a/packages/lobby/src/handlers/handleGetMiniUserList.ts b/packages/lobby/src/handlers/handleGetMiniUserList.ts index 0271f30d5..33753c9e7 100644 --- a/packages/lobby/src/handlers/handleGetMiniUserList.ts +++ b/packages/lobby/src/handlers/handleGetMiniUserList.ts @@ -1,5 +1,5 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { GameMessage } from "../../../shared/GameMessage.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; diff --git a/packages/lobby/src/handlers/handleSendMiniRiffList.ts b/packages/lobby/src/handlers/handleSendMiniRiffList.ts index a912145b7..bbb6c4640 100644 --- a/packages/lobby/src/handlers/handleSendMiniRiffList.ts +++ b/packages/lobby/src/handlers/handleSendMiniRiffList.ts @@ -1,5 +1,5 @@ import { getServerConfiguration } from "../../../shared/Configuration.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { GameMessage } from "../../../shared/GameMessage.js"; import { LegacyMessage } from "../../../shared/LegacyMessage.js"; diff --git a/packages/lobby/src/handlers/requestConnectGameServer.ts b/packages/lobby/src/handlers/requestConnectGameServer.ts index fbe1932c1..b9295a263 100644 --- a/packages/lobby/src/handlers/requestConnectGameServer.ts +++ b/packages/lobby/src/handlers/requestConnectGameServer.ts @@ -12,7 +12,7 @@ import { fetchStateFromDatabase, getEncryption, } from "../../../shared/State.js"; -import { ServerError } from "../../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { SerializedBufferOld } from "../../../shared/SerializedBufferOld.js"; import { UserInfoMessage } from "../UserInfoMessage.js"; import { fetchSessionKeyByCustomerId } from "../../../database/index.js"; diff --git a/packages/lobby/src/internal.ts b/packages/lobby/src/internal.ts index a2224830c..9c92a5dd2 100644 --- a/packages/lobby/src/internal.ts +++ b/packages/lobby/src/internal.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { getServerConfiguration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; diff --git a/packages/shared/MessageBuffer.ts b/packages/shared/MessageBufferOld.ts similarity index 93% rename from packages/shared/MessageBuffer.ts rename to packages/shared/MessageBufferOld.ts index 4444e1a48..f34544d28 100644 --- a/packages/shared/MessageBuffer.ts +++ b/packages/shared/MessageBufferOld.ts @@ -2,7 +2,7 @@ import { ServerError } from "./errors/ServerError.js"; import { MessageHeader } from "./MessageHeader.js"; import { SerializedBufferOld } from "./SerializedBufferOld.js"; -export class MessageBuffer extends SerializedBufferOld { +export class MessageBufferOld extends SerializedBufferOld { _header: MessageHeader; _buffer: Buffer; constructor() { @@ -14,10 +14,10 @@ export class MessageBuffer extends SerializedBufferOld { /** * @param {number} id - The ID of the message * @param {Buffer} buffer - The buffer to deserialize - * @returns {MessageBuffer} + * @returns {MessageBufferOld} */ - static createGameMessage(id: number, buffer: Buffer): MessageBuffer { - const message = new MessageBuffer(); + static createGameMessage(id: number, buffer: Buffer): MessageBufferOld { + const message = new MessageBufferOld(); message._header._messageId = id; message.buffer = buffer; return message; @@ -81,9 +81,9 @@ export class MessageBuffer extends SerializedBufferOld { /** * @param {Buffer} buffer - * @returns {MessageBuffer} + * @returns {MessageBufferOld} */ - deserialize(buffer: Buffer): MessageBuffer { + deserialize(buffer: Buffer): MessageBufferOld { this._header.deserialize(buffer.subarray(0, 8)); if (buffer.length < 4 + this._header.messageLength) { throw new ServerError( diff --git a/packages/shared/index.ts b/packages/shared/index.ts index c1c18b1fe..a00037dc4 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -10,8 +10,9 @@ export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; export { AbstractSerializable, SerializableMixin } from "./messageFactory.js"; export { ServerError } from "./errors/ServerError.js"; -export {NPSMessage} from "./NPSMessage.js"; -export {OldServerMessage} from "./OldServerMessage.js"; +export { NPSMessage } from "./NPSMessage.js"; +export { OldServerMessage } from "./OldServerMessage.js"; +export { MessageBufferOld } from "./MessageBufferOld.js"; export { McosEncryptionPair, McosEncryption, From e91212acd97408c9afec5a84ab21426ca824cbaf Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 07:29:22 -0400 Subject: [PATCH 72/84] refactor: Update import paths for shared modules - start works, lobby loads --- packages/lobby/src/LoginInfoMessage.ts | 2 +- packages/lobby/src/MiniRiffMessage.js | 159 +++++++++--------- packages/lobby/src/UserInfoMessage.ts | 2 +- packages/login/src/NPSUserStatus.ts | 2 +- packages/login/src/index.ts | 2 +- packages/login/src/internal.ts | 2 +- packages/persona/src/PersonaMapsMessage.ts | 2 +- .../persona/src/getPersonasByPersonaId.ts | 28 +-- packages/persona/src/internal.ts | 2 +- packages/shard/src/index.ts | 48 +++--- packages/shared/GameMessageHeader.ts | 2 +- packages/shared/MessageBufferOld.ts | 2 +- packages/shared/MessageNode.ts | 2 +- packages/shared/NPSHeader.ts | 2 +- packages/shared/NPSMessage.js | 84 --------- packages/shared/deserializeString.ts | 2 +- packages/shared/index.ts | 2 +- packages/shared/legacyHeader.ts | 2 +- packages/shared/messageFactory.ts | 2 +- packages/shared/serverHeader.ts | 2 +- packages/shared/src/BaseSerialized.ts | 64 +++---- packages/shared/src/NetworkMessage.ts | 102 +++++------ packages/shared/src/RawMessage.ts | 76 ++++----- packages/shared/src/SerializedBuffer.ts | 56 +++--- .../shared/{errors => src}/ServerError.ts | 2 +- packages/shared/src/ServerMessage.ts | 140 +++++++-------- .../transactions/src/EntryFeePurseMessage.ts | 2 +- packages/transactions/src/LobbyMessage.ts | 2 +- packages/transactions/src/_getOwnedParts.ts | 2 +- packages/transactions/src/_getPlayerInfo.ts | 2 +- packages/transactions/src/internal.ts | 2 +- 31 files changed, 362 insertions(+), 439 deletions(-) delete mode 100644 packages/shared/NPSMessage.js rename packages/shared/{errors => src}/ServerError.ts (98%) diff --git a/packages/lobby/src/LoginInfoMessage.ts b/packages/lobby/src/LoginInfoMessage.ts index 3a87b32ec..223fcb0e4 100644 --- a/packages/lobby/src/LoginInfoMessage.ts +++ b/packages/lobby/src/LoginInfoMessage.ts @@ -1,4 +1,4 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { deserializeString } from "../../shared/deserializeString.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { serializeString } from "../../shared/serializeString.js"; diff --git a/packages/lobby/src/MiniRiffMessage.js b/packages/lobby/src/MiniRiffMessage.js index 2e542b1c7..72895c9dd 100644 --- a/packages/lobby/src/MiniRiffMessage.js +++ b/packages/lobby/src/MiniRiffMessage.js @@ -1,96 +1,99 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { - LegacyMessage, - SerializedBufferOld, - serializeString, + LegacyMessage, + SerializedBufferOld, + serializeString, } from "rusty-motors-shared"; export class MiniRiffMessage extends LegacyMessage { - constructor() { - super(); - /** @type {MiniRiffInfo[]} */ - this._riffList = []; - } + constructor() { + super(); + /** @type {MiniRiffInfo[]} */ + this._riffList = []; + } - size() { - let size = 4; - for (const riff of this._riffList) { - size += riff.size(); - } - return size; - } + size() { + let size = 4; + for (const riff of this._riffList) { + size += riff.size(); + } + return size; + } - /** @param {MiniRiffInfo} riff */ - addRiff(riff) { - this._riffList.push(riff); - } + /** @param {MiniRiffInfo} riff */ + addRiff(riff) { + this._riffList.push(riff); + } - /** - * @returns {Buffer} - */ - serialize() { - try { - const neededSize = this.size(); - this._header.length = neededSize + 4; - const buffer = Buffer.alloc(this._header.length); - this._header._doSerialize().copy(buffer); - let offset = this._header._size; // offset is 4 - buffer.writeUInt16BE(this._riffList.length, offset); - offset += 4; - for (const riff of this._riffList) { - riff.serialize().copy(buffer, offset); - offset += riff.size(); - } + /** + * @returns {Buffer} + */ + serialize() { + try { + const neededSize = this.size(); + this._header.length = neededSize + 4; + const buffer = Buffer.alloc(this._header.length); + this._header._doSerialize().copy(buffer); + let offset = this._header._size; // offset is 4 + buffer.writeUInt16BE(this._riffList.length, offset); + offset += 4; + for (const riff of this._riffList) { + riff.serialize().copy(buffer, offset); + offset += riff.size(); + } - return buffer; - } catch (error) { - throw ServerError.fromUnknown(error, "Error serializing MiniRiffMessage"); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing MiniRiffMessage", + ); + } + } - toString() { - return `MiniRiffMessage: ${this._riffList.length} riff(s)`; - } + toString() { + return `MiniRiffMessage: ${this._riffList.length} riff(s)`; + } } export class MiniRiffInfo extends SerializedBuffer { - constructor() { - super(); - this._riffName = ""; // max 32 bytes - this._riffId = 0; // 4 bytes - this._riffPopulation = 0; // 2 bytes - } + constructor() { + super(); + this._riffName = ""; // max 32 bytes + this._riffId = 0; // 4 bytes + this._riffPopulation = 0; // 2 bytes + } - size() { - return 4 + (4 + this._riffName.length + 1) + 4 + 2; - } + size() { + return 4 + (4 + this._riffName.length + 1) + 4 + 2; + } - /** - * @returns {Buffer} - */ - serialize() { - try { - const buffer = Buffer.alloc(this.size()); - let offset = 0; - if (this._riffName.length > 32) { - throw new ServerError("Riff name is too long"); - } - offset = serializeString(this._riffName, buffer, offset); + /** + * @returns {Buffer} + */ + serialize() { + try { + const buffer = Buffer.alloc(this.size()); + let offset = 0; + if (this._riffName.length > 32) { + throw new ServerError("Riff name is too long"); + } + offset = serializeString(this._riffName, buffer, offset); - buffer.writeUInt32BE(this._riffId, offset); - offset += 4; - buffer.writeUInt16BE(this._riffPopulation, offset); + buffer.writeUInt32BE(this._riffId, offset); + offset += 4; + buffer.writeUInt16BE(this._riffPopulation, offset); - return buffer; - } catch (error) { - throw ServerError.fromUnknown( - error, - "Error serializing LoginInfoMessage", - ); - } - } + return buffer; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Error serializing LoginInfoMessage", + ); + } + } - toString() { - return `MiniRiffInfo: ${this._riffName} (${this._riffId}) - ${this._riffPopulation}`; - } + toString() { + return `MiniRiffInfo: ${this._riffName} (${this._riffId}) - ${this._riffPopulation}`; + } } diff --git a/packages/lobby/src/UserInfoMessage.ts b/packages/lobby/src/UserInfoMessage.ts index ffe526c9e..a735b6134 100644 --- a/packages/lobby/src/UserInfoMessage.ts +++ b/packages/lobby/src/UserInfoMessage.ts @@ -1,4 +1,4 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { deserializeString } from "../../shared/deserializeString.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; import { serializeString } from "../../shared/serializeString.js"; diff --git a/packages/login/src/NPSUserStatus.ts b/packages/login/src/NPSUserStatus.ts index 2253e8ab2..64ddf00de 100644 --- a/packages/login/src/NPSUserStatus.ts +++ b/packages/login/src/NPSUserStatus.ts @@ -3,7 +3,7 @@ import { readFileSync } from "node:fs"; import { Logger } from "pino"; import { Configuration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { LegacyMessage } from "../../shared/LegacyMessage.js"; /** diff --git a/packages/login/src/index.ts b/packages/login/src/index.ts index 36abceb71..3cd3bf9ef 100644 --- a/packages/login/src/index.ts +++ b/packages/login/src/index.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { DatabaseManager } from "../../interfaces/index.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { handleLoginData } from "./internal.js"; diff --git a/packages/login/src/internal.ts b/packages/login/src/internal.ts index 594b7c84c..07cd944dd 100644 --- a/packages/login/src/internal.ts +++ b/packages/login/src/internal.ts @@ -15,7 +15,7 @@ // along with this program. If not, see . import { getServerConfiguration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; diff --git a/packages/persona/src/PersonaMapsMessage.ts b/packages/persona/src/PersonaMapsMessage.ts index d68df53c4..5f467526a 100644 --- a/packages/persona/src/PersonaMapsMessage.ts +++ b/packages/persona/src/PersonaMapsMessage.ts @@ -1,5 +1,5 @@ import { serializeString } from "../../core/src/serializationHelpers.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { NPSMessage } from "../../shared/NPSMessage.js"; import { NPSHeader } from "../../shared/NPSHeader.js"; diff --git a/packages/persona/src/getPersonasByPersonaId.ts b/packages/persona/src/getPersonasByPersonaId.ts index b726387b7..0bdf8d1eb 100644 --- a/packages/persona/src/getPersonasByPersonaId.ts +++ b/packages/persona/src/getPersonasByPersonaId.ts @@ -1,5 +1,5 @@ import { PersonaRecord } from "../../interfaces/index.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { personaRecords } from "./internal.js"; /** @@ -9,20 +9,20 @@ import { personaRecords } from "./internal.js"; */ export async function getPersonasByPersonaId({ - personas = personaRecords, - id, + personas = personaRecords, + id, }: { - personas?: PersonaRecord[]; - id: number; + personas?: PersonaRecord[]; + id: number; }): Promise { - const results = personaRecords.filter((persona) => { - const match = id === persona.id.readInt32BE(0); - return match; - }); - if (results.length === 0) { - const err = new ServerError(`Unable to locate a persona for id: ${id}`); - throw err; - } + const results = personaRecords.filter((persona) => { + const match = id === persona.id.readInt32BE(0); + return match; + }); + if (results.length === 0) { + const err = new ServerError(`Unable to locate a persona for id: ${id}`); + throw err; + } - return results; + return results; } diff --git a/packages/persona/src/internal.ts b/packages/persona/src/internal.ts index bfb892976..03fea1833 100644 --- a/packages/persona/src/internal.ts +++ b/packages/persona/src/internal.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; import { Logger } from "pino"; diff --git a/packages/shard/src/index.ts b/packages/shard/src/index.ts index 7cac77957..3c20bb631 100644 --- a/packages/shard/src/index.ts +++ b/packages/shard/src/index.ts @@ -16,7 +16,7 @@ import { readFileSync } from "fs"; import { Configuration } from "../../shared/Configuration.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; // This section of the server can not be encrypted. This is an intentional choice for compatibility // deepcode ignore HttpToHttps: This is intentional. See above note. @@ -27,15 +27,15 @@ import { ServerError } from "../../shared/errors/ServerError.js"; * @return {string} */ export function handleGetCert(config: Configuration): string { - if (config.certificateFile === undefined) { - throw new ServerError("Certificate file not defined"); - } - try { - const cert = readFileSync(config.certificateFile, "utf8"); - return cert; - } catch (err) { - throw new ServerError(`Error reading certificate file: ${String(err)}`); - } + if (config.certificateFile === undefined) { + throw new ServerError("Certificate file not defined"); + } + try { + const cert = readFileSync(config.certificateFile, "utf8"); + return cert; + } catch (err) { + throw new ServerError(`Error reading certificate file: ${String(err)}`); + } } /** @@ -44,11 +44,11 @@ export function handleGetCert(config: Configuration): string { * @return {string} */ export function handleGetRegistry(config: Configuration): string { - const externalHost = config.host; - const patchHost = externalHost; - const authHost = externalHost; - const shardHost = externalHost; - return `Windows Registry Editor Version 5.00 + const externalHost = config.host; + const patchHost = externalHost; + const authHost = externalHost; + const shardHost = externalHost; + return `Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\EACom\\AuthAuth] "AuthLoginBaseService"="AuthLogin" @@ -83,13 +83,13 @@ export function handleGetRegistry(config: Configuration): string { * @return {string} */ export function handleGetKey(config: Configuration): string { - if (config.publicKeyFile === undefined) { - throw new ServerError("Public key file not defined"); - } - try { - const key = readFileSync(config.publicKeyFile, "utf8"); - return key; - } catch (err) { - throw new ServerError(`Error reading public key file: ${String(err)}`); - } + if (config.publicKeyFile === undefined) { + throw new ServerError("Public key file not defined"); + } + try { + const key = readFileSync(config.publicKeyFile, "utf8"); + return key; + } catch (err) { + throw new ServerError(`Error reading public key file: ${String(err)}`); + } } diff --git a/packages/shared/GameMessageHeader.ts b/packages/shared/GameMessageHeader.ts index db75d7a39..00ecce6fe 100644 --- a/packages/shared/GameMessageHeader.ts +++ b/packages/shared/GameMessageHeader.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { legacyHeader } from "./legacyHeader.js"; /** diff --git a/packages/shared/MessageBufferOld.ts b/packages/shared/MessageBufferOld.ts index f34544d28..109ed596c 100644 --- a/packages/shared/MessageBufferOld.ts +++ b/packages/shared/MessageBufferOld.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { MessageHeader } from "./MessageHeader.js"; import { SerializedBufferOld } from "./SerializedBufferOld.js"; diff --git a/packages/shared/MessageNode.ts b/packages/shared/MessageNode.ts index 633ec2a27..78837aabd 100644 --- a/packages/shared/MessageNode.ts +++ b/packages/shared/MessageNode.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { SerializedBufferOld } from "./SerializedBufferOld.js"; export class MessageNode { diff --git a/packages/shared/NPSHeader.ts b/packages/shared/NPSHeader.ts index df821d7fe..f7a4eb0be 100644 --- a/packages/shared/NPSHeader.ts +++ b/packages/shared/NPSHeader.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; /** diff --git a/packages/shared/NPSMessage.js b/packages/shared/NPSMessage.js deleted file mode 100644 index 7d26604a2..000000000 --- a/packages/shared/NPSMessage.js +++ /dev/null @@ -1,84 +0,0 @@ -/** - * @module shared/NPSMessage - */ - -import { ServerError } from "./errors/ServerError.js"; - -/** - * @class NPSMessage - */ -export class NPSMessage { - constructor() { - this.msgNo = 0; - this.msgVersion = 0; - this.reserved = 0; - this.data = Buffer.alloc(0); - this.msgLength = 0; - } - - /** - * - * @param {Buffer} buffer - */ - setContent(buffer) { - this.data = buffer; - this.msgLength = this.data.length + 12; // skipcq: JS-0377 - } - - /** - * - * @return {Buffer} - */ - serialize() { - try { - const packet = Buffer.alloc(this.msgLength); - packet.writeInt16BE(this.msgNo, 0); - packet.writeInt16BE(this.msgLength, 2); - if (this.msgLength > 4) { - packet.writeInt16BE(this.msgVersion, 4); - packet.writeInt16BE(this.reserved, 6); - } - - if (this.msgLength > 8) { - packet.writeInt32BE(this.msgLength, 8); - this.data.copy(packet, 12); - } - - return packet; - } catch (error) { - if (error instanceof Error) { - const err = new ServerError( - `[NPSMsg] Error in serialize(): ${error.message}`, - ); - throw err; - } - const err = new ServerError( - "[NPSMsg] Error in serialize(), error unknown", - ); - throw err; - } - } - - /** - * - * @param {Buffer} packet - * @return {NPSMessage} - */ - deserialize(packet) { - this.msgNo = packet.readInt16BE(0); - this.msgLength = packet.readInt16BE(2); - this.msgVersion = packet.readInt16BE(4); - this.data = packet.subarray(12); - return this; - } - - toString() { - return `NPSMessage: ${JSON.stringify({ - msgNo: this.msgNo, - msgLength: this.msgLength, - msgVersion: this.msgVersion, - reserved: this.reserved, - content: this.data.toString("hex"), - })}`; - } -} diff --git a/packages/shared/deserializeString.ts b/packages/shared/deserializeString.ts index b6d64f008..c2e933f10 100644 --- a/packages/shared/deserializeString.ts +++ b/packages/shared/deserializeString.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; /** * @param {Buffer} buffer diff --git a/packages/shared/index.ts b/packages/shared/index.ts index a00037dc4..526708762 100644 --- a/packages/shared/index.ts +++ b/packages/shared/index.ts @@ -9,7 +9,7 @@ export { SerializedBufferOld } from "./SerializedBufferOld.js"; export { RawMessage } from "./src/RawMessage.js"; export { ServerMessage } from "./src/ServerMessage.js"; export { AbstractSerializable, SerializableMixin } from "./messageFactory.js"; -export { ServerError } from "./errors/ServerError.js"; +export { ServerError } from "./src/ServerError.js"; export { NPSMessage } from "./NPSMessage.js"; export { OldServerMessage } from "./OldServerMessage.js"; export { MessageBufferOld } from "./MessageBufferOld.js"; diff --git a/packages/shared/legacyHeader.ts b/packages/shared/legacyHeader.ts index 7d9f7bfe2..0e5a47aad 100644 --- a/packages/shared/legacyHeader.ts +++ b/packages/shared/legacyHeader.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; /** diff --git a/packages/shared/messageFactory.ts b/packages/shared/messageFactory.ts index 26497e674..1a5990491 100644 --- a/packages/shared/messageFactory.ts +++ b/packages/shared/messageFactory.ts @@ -8,7 +8,7 @@ * - RawMessage */ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; /** * @abstract diff --git a/packages/shared/serverHeader.ts b/packages/shared/serverHeader.ts index c3c92440c..621f798c8 100644 --- a/packages/shared/serverHeader.ts +++ b/packages/shared/serverHeader.ts @@ -1,4 +1,4 @@ -import { ServerError } from "./errors/ServerError.js"; +import { ServerError } from "./src/ServerError.js"; import { SerializableMixin, AbstractSerializable } from "./messageFactory.js"; /** diff --git a/packages/shared/src/BaseSerialized.ts b/packages/shared/src/BaseSerialized.ts index 0ec4bde99..2b9702fe1 100644 --- a/packages/shared/src/BaseSerialized.ts +++ b/packages/shared/src/BaseSerialized.ts @@ -1,12 +1,12 @@ -import { ServerError } from "../errors/ServerError.js"; +import { ServerError } from "./ServerError.js"; export interface Serializable { - data: Buffer; - serialize(): Buffer; - deserialize(buffer: Buffer): Serializable; - length: number; - toString(): string; - asHex(): string; + data: Buffer; + serialize(): Buffer; + deserialize(buffer: Buffer): Serializable; + length: number; + toString(): string; + asHex(): string; } /** @@ -14,37 +14,37 @@ export interface Serializable { * Just a wrapper around a buffer */ export class BaseSerialized implements Serializable { - protected _data: Buffer; + protected _data: Buffer; - constructor(data?: Buffer) { - this._data = data || Buffer.alloc(0); - } + constructor(data?: Buffer) { + this._data = data || Buffer.alloc(0); + } - get data(): Buffer { - return this._data; - } + get data(): Buffer { + return this._data; + } - set data(data: Buffer) { - this._data = Buffer.from(data); - } + set data(data: Buffer) { + this._data = Buffer.from(data); + } - serialize(): Buffer { - throw new ServerError("Not implemented"); - } + serialize(): Buffer { + throw new ServerError("Not implemented"); + } - deserialize(_buffer: Buffer): Serializable { - throw new ServerError("Not implemented"); - } + deserialize(_buffer: Buffer): Serializable { + throw new ServerError("Not implemented"); + } - get length(): number { - return this._data.length; - } + get length(): number { + return this._data.length; + } - toString(): string { - return this.asHex(); - } + toString(): string { + return this.asHex(); + } - asHex(): string { - return this._data.toString("hex"); - } + asHex(): string { + return this._data.toString("hex"); + } } diff --git a/packages/shared/src/NetworkMessage.ts b/packages/shared/src/NetworkMessage.ts index cc4624216..5821b61e7 100644 --- a/packages/shared/src/NetworkMessage.ts +++ b/packages/shared/src/NetworkMessage.ts @@ -1,4 +1,4 @@ -import { ServerError } from "../errors/ServerError.js"; +import { ServerError } from "./ServerError.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; /** @@ -11,58 +11,58 @@ import { SerializedBuffer } from "./SerializedBuffer.js"; * - data */ export class NetworkMessage extends SerializedBuffer { - private _messageId: number; - version: number = 0x101; - reserved: number = 0x0000; - private _checksum: number = 0x00000000; - constructor(messageId: number, data?: Buffer) { - super(data); - this._messageId = messageId; - } - override serialize() { - const buffer = Buffer.alloc(12 + this._data.length); - buffer.writeUInt16BE(this._messageId, 0); - buffer.writeUInt16BE(this._data.length + 12, 2); - buffer.writeUInt16BE(this.version, 4); - buffer.writeUInt16BE(this.reserved, 6); - buffer.writeUInt32BE(this._data.length + 12, 8); - this._data.copy(buffer, 12); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 12) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16BE(2); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._messageId = buffer.readUInt16BE(0); - // Skip the length, we already know it - this.version = buffer.readUInt16BE(4); - this.reserved = buffer.readUInt16BE(6); - this._checksum = buffer.readUInt32BE(8); - this._data = buffer.subarray(4, 4 + length); - return this; - } + private _messageId: number; + version: number = 0x101; + reserved: number = 0x0000; + private _checksum: number = 0x00000000; + constructor(messageId: number, data?: Buffer) { + super(data); + this._messageId = messageId; + } + override serialize() { + const buffer = Buffer.alloc(12 + this._data.length); + buffer.writeUInt16BE(this._messageId, 0); + buffer.writeUInt16BE(this._data.length + 12, 2); + buffer.writeUInt16BE(this.version, 4); + buffer.writeUInt16BE(this.reserved, 6); + buffer.writeUInt32BE(this._data.length + 12, 8); + this._data.copy(buffer, 12); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 12) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16BE(2); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._messageId = buffer.readUInt16BE(0); + // Skip the length, we already know it + this.version = buffer.readUInt16BE(4); + this.reserved = buffer.readUInt16BE(6); + this._checksum = buffer.readUInt32BE(8); + this._data = buffer.subarray(4, 4 + length); + return this; + } - override set data(data: Buffer) { - this._data = Buffer.from(data); - } + override set data(data: Buffer) { + this._data = Buffer.from(data); + } - get messageId(): number { - return this._messageId; - } + get messageId(): number { + return this._messageId; + } - override get length(): number { - return 12 + this._data.length; - } + override get length(): number { + return 12 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/shared/src/RawMessage.ts b/packages/shared/src/RawMessage.ts index 71367250d..61c212ff9 100644 --- a/packages/shared/src/RawMessage.ts +++ b/packages/shared/src/RawMessage.ts @@ -1,48 +1,48 @@ -import { ServerError } from "../errors/ServerError.js"; +import { ServerError } from "./ServerError.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; /** * A serialized buffer, prefixed with a 2-byte message id and a 2-byte total length. */ export class RawMessage extends SerializedBuffer { - private _messageId: number; - constructor(messageId: number, data?: Buffer) { - super(data); - this._messageId = messageId; - } - override serialize() { - const buffer = Buffer.alloc(4 + this._data.length); - buffer.writeUInt16BE(this._messageId, 0); - buffer.writeUInt16BE(this._data.length + 4, 2); - this._data.copy(buffer, 4); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 4) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16BE(2); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._messageId = buffer.readUInt16BE(0); - this._data = buffer.subarray(4, 4 + length); - return this; - } + private _messageId: number; + constructor(messageId: number, data?: Buffer) { + super(data); + this._messageId = messageId; + } + override serialize() { + const buffer = Buffer.alloc(4 + this._data.length); + buffer.writeUInt16BE(this._messageId, 0); + buffer.writeUInt16BE(this._data.length + 4, 2); + this._data.copy(buffer, 4); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 4) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16BE(2); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._messageId = buffer.readUInt16BE(0); + this._data = buffer.subarray(4, 4 + length); + return this; + } - get messageId(): number { - return this._messageId; - } + get messageId(): number { + return this._messageId; + } - override get length(): number { - return 4 + this._data.length; - } + override get length(): number { + return 4 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } } diff --git a/packages/shared/src/SerializedBuffer.ts b/packages/shared/src/SerializedBuffer.ts index 9fe6fcbec..829114fb9 100644 --- a/packages/shared/src/SerializedBuffer.ts +++ b/packages/shared/src/SerializedBuffer.ts @@ -1,33 +1,37 @@ -import { ServerError } from "../errors/ServerError.js"; +import { ServerError } from "./ServerError.js"; import { BaseSerialized } from "./BaseSerialized.js"; /** * A serialized buffer, prefixed with its 2-byte length. */ export class SerializedBuffer extends BaseSerialized { - - override serialize() { - try { - const buffer = Buffer.alloc(2 + this._data.length); - buffer.writeUInt16BE(this._data.length, 0); - this._data.copy(buffer, 2); - return buffer; - } catch (error) { - throw ServerError.fromUnknown(error, "Unable to serialize buffer"); - } - } - override deserialize(buffer: Buffer): SerializedBuffer { - try { - const length = buffer.readUInt16BE(0); - if (buffer.length < 2 + length) { - throw new ServerError( - `Expected buffer of length ${2 + length}, got ${buffer.length}`, - ); - } - this._data = buffer.subarray(2, 2 + length); - return this; - } catch (error) { - throw ServerError.fromUnknown(error, "Unable to deserialize buffer"); - } - } + override serialize() { + try { + const buffer = Buffer.alloc(2 + this._data.length); + buffer.writeUInt16BE(this._data.length, 0); + this._data.copy(buffer, 2); + return buffer; + } catch (error) { + throw ServerError.fromUnknown(error, "Unable to serialize buffer"); + } + } + override deserialize(buffer: Buffer): SerializedBuffer { + try { + const length = buffer.readUInt16BE(0); + if (buffer.length < 2 + length) { + throw new ServerError( + `Expected buffer of length ${2 + length}, got ${ + buffer.length + }`, + ); + } + this._data = buffer.subarray(2, 2 + length); + return this; + } catch (error) { + throw ServerError.fromUnknown( + error, + "Unable to deserialize buffer", + ); + } + } } diff --git a/packages/shared/errors/ServerError.ts b/packages/shared/src/ServerError.ts similarity index 98% rename from packages/shared/errors/ServerError.ts rename to packages/shared/src/ServerError.ts index 89d658d3c..aed3e8958 100644 --- a/packages/shared/errors/ServerError.ts +++ b/packages/shared/src/ServerError.ts @@ -1,4 +1,4 @@ -import { getServerLogger } from "../src/log.js"; +import { getServerLogger } from "./log.js"; /** * @module errors diff --git a/packages/shared/src/ServerMessage.ts b/packages/shared/src/ServerMessage.ts index fff7b9f40..936404827 100644 --- a/packages/shared/src/ServerMessage.ts +++ b/packages/shared/src/ServerMessage.ts @@ -1,20 +1,20 @@ -import { ServerError } from "../errors/ServerError.js"; +import { ServerError } from "./ServerError.js"; import { SerializedBuffer } from "./SerializedBuffer.js"; class HeaderShim { - private _realObject: ServerMessage; + private _realObject: ServerMessage; - constructor(realObject: ServerMessage) { - this._realObject = realObject; - } + constructor(realObject: ServerMessage) { + this._realObject = realObject; + } - get flags(): number { - return this._realObject.flags; - } + get flags(): number { + return this._realObject.flags; + } - set flags(value: number) { - this._realObject.flags = value; - } + set flags(value: number) { + this._realObject.flags = value; + } } /** @@ -26,70 +26,70 @@ class HeaderShim { * - data */ export class ServerMessage extends SerializedBuffer { - private _signature = "TOMC"; - private _sequence: number = 0; - private _flags: number = 0; - _header: HeaderShim; + private _signature = "TOMC"; + private _sequence: number = 0; + private _flags: number = 0; + _header: HeaderShim; - constructor(sequence: number = 0, flags: number = 0, data?: Buffer) { - super(); - this._sequence = sequence; - this._flags = flags; - this._data = data || Buffer.alloc(0); - this._header = new HeaderShim(this); - } - override serialize() { - const buffer = Buffer.alloc(11 + this._data.length); - buffer.writeInt16LE(this._data.length + 9, 0); - buffer.write(this._signature, 2); - buffer.writeInt32LE(this._sequence, 6); - buffer.writeInt8(this._flags, 10); - this._data.copy(buffer, 11); - return buffer; - } - override deserialize(buffer: Buffer) { - if (buffer.length < 11) { - throw new ServerError( - `Unable to get header from buffer, got ${buffer.length}`, - ); - } - const length = buffer.readUInt16LE(0); - if (buffer.length < length) { - throw new ServerError( - `Expected buffer of length ${length}, got ${buffer.length}`, - ); - } - this._signature = buffer.toString("ascii", 2, 6); - this._sequence = buffer.readInt32LE(6); - this._flags = buffer.readInt8(10); - this._data = buffer.subarray(11, 11 + length); - return this; - } + constructor(sequence: number = 0, flags: number = 0, data?: Buffer) { + super(); + this._sequence = sequence; + this._flags = flags; + this._data = data || Buffer.alloc(0); + this._header = new HeaderShim(this); + } + override serialize() { + const buffer = Buffer.alloc(11 + this._data.length); + buffer.writeInt16LE(this._data.length + 9, 0); + buffer.write(this._signature, 2); + buffer.writeInt32LE(this._sequence, 6); + buffer.writeInt8(this._flags, 10); + this._data.copy(buffer, 11); + return buffer; + } + override deserialize(buffer: Buffer) { + if (buffer.length < 11) { + throw new ServerError( + `Unable to get header from buffer, got ${buffer.length}`, + ); + } + const length = buffer.readUInt16LE(0); + if (buffer.length < length) { + throw new ServerError( + `Expected buffer of length ${length}, got ${buffer.length}`, + ); + } + this._signature = buffer.toString("ascii", 2, 6); + this._sequence = buffer.readInt32LE(6); + this._flags = buffer.readInt8(10); + this._data = buffer.subarray(11, 11 + length); + return this; + } - override get data(): Buffer { - return this._data; - } + override get data(): Buffer { + return this._data; + } - override set data(data: Buffer) { - this._data = Buffer.from(data); - } + override set data(data: Buffer) { + this._data = Buffer.from(data); + } - setBuffer(buffer: Buffer) { - this._data = buffer; - } + setBuffer(buffer: Buffer) { + this._data = buffer; + } - override get length(): number { - return 11 + this._data.length; - } + override get length(): number { + return 11 + this._data.length; + } - override asHex(): string { - return this.serialize().toString("hex"); - } + override asHex(): string { + return this.serialize().toString("hex"); + } - public get flags(): number { - return this._flags; - } - public set flags(value: number) { - this._flags = value; - } + public get flags(): number { + return this._flags; + } + public set flags(value: number) { + this._flags = value; + } } diff --git a/packages/transactions/src/EntryFeePurseMessage.ts b/packages/transactions/src/EntryFeePurseMessage.ts index 98ea54ee7..03d9bfed9 100644 --- a/packages/transactions/src/EntryFeePurseMessage.ts +++ b/packages/transactions/src/EntryFeePurseMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** diff --git a/packages/transactions/src/LobbyMessage.ts b/packages/transactions/src/LobbyMessage.ts index cc714b90f..9767a2dc2 100644 --- a/packages/transactions/src/LobbyMessage.ts +++ b/packages/transactions/src/LobbyMessage.ts @@ -14,7 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { SerializedBufferOld } from "../../shared/SerializedBufferOld.js"; /** diff --git a/packages/transactions/src/_getOwnedParts.ts b/packages/transactions/src/_getOwnedParts.ts index 36305bb21..5525dc3eb 100644 --- a/packages/transactions/src/_getOwnedParts.ts +++ b/packages/transactions/src/_getOwnedParts.ts @@ -2,7 +2,7 @@ import { fetchStateFromDatabase, findSessionByConnectionId, } from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PartsAssemblyMessage } from "./PartsAssemblyMessage.js"; diff --git a/packages/transactions/src/_getPlayerInfo.ts b/packages/transactions/src/_getPlayerInfo.ts index ecc95a315..baad4c482 100644 --- a/packages/transactions/src/_getPlayerInfo.ts +++ b/packages/transactions/src/_getPlayerInfo.ts @@ -1,4 +1,4 @@ -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { OldServerMessage } from "../../shared/OldServerMessage.js"; import { GenericRequestMessage } from "./GenericRequestMessage.js"; import { PlayerInfoMessage } from "./PlayerInfoMessage.js"; diff --git a/packages/transactions/src/internal.ts b/packages/transactions/src/internal.ts index 35bed4def..327d58c4c 100644 --- a/packages/transactions/src/internal.ts +++ b/packages/transactions/src/internal.ts @@ -20,7 +20,7 @@ import { getEncryption, updateEncryption, } from "../../shared/State.js"; -import { ServerError } from "../../shared/errors/ServerError.js"; +import { ServerError } from "../../shared/src/ServerError.js"; import { getServerLogger } from "rusty-motors-shared"; // eslint-disable-next-line no-unused-vars import { OldServerMessage } from "../../shared/OldServerMessage.js"; From d0afb67fc0afd2173b25f7051b2d7cf2ceb6e4c5 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 08:10:52 -0400 Subject: [PATCH 73/84] refactor: Add unit tests for tunables module This commit adds unit tests for the tunables module in the database package. The tests cover the functionality of retrieving tunable values, setting tunable values, and handling invalid tunable names. This addition improves the reliability and maintainability of the codebase by ensuring the correctness of the tunables module. start works, lobby loads --- packages/database/src/services/tunables.ts | 749 ++++++--------------- packages/database/test/tunables.test.ts | 32 + 2 files changed, 227 insertions(+), 554 deletions(-) create mode 100644 packages/database/test/tunables.test.ts diff --git a/packages/database/src/services/tunables.ts b/packages/database/src/services/tunables.ts index 088eac8af..e4f90a2db 100644 --- a/packages/database/src/services/tunables.ts +++ b/packages/database/src/services/tunables.ts @@ -1,117 +1,127 @@ +type TunableType = Record & { + clubCreationFee: number; + clubCreationMinimumLevel: number; + clubOfficerMinimumLevel: number; + racePPDefeatedOpponent: number; + racePPPlaceLost: number; + racePenaltyPerRank: number; + raceBonusPerRank: number; + raceBonusPerMileSponsored: number; + raceBonusPerMileOpen: number; + levelsTunelog: number; + levelsSlope: number; + levelsOffset: number; + maxEZStreetLevel: number; + clubWaitPeriodBetweenClubs: number; + turfwarCaptionBonus: number; + turfwarMemberBonus: number; + topDogBonus: number; + rankAdvancementBonus: number; + ttCashRewardFirst: number; + ttCashRewardSecond: number; + ttCashRewardThird: number; + ttPointsRewardFirst: number; + ttPointsRewardSecond: number; + ttPointsRewardThird: number; + universalRepairCostModifier: number; + universalScrapValueModifier: number; + adCost1Day: number; + adCost2Days: number; + adCost3Days: number; + adCost4Days: number; + adCost5Days: number; + adCost6Days: number; + adCost7Days: number; + tradeInModifier: number; + simStreetMaxWager: number; + pointAward1stPlace: number; + pointAward2ndPlace: number; + pointAward3rdPlace: number; + pointAward4thPlace: number; + pointAward5thPlace: number; + pointAward6thPlace: number; + arcadeRacePointModifier: number; + mcotsPoolingFrequency: number; + starterCash: number; + enableCheatEmails: number; + salaryPerLevel: number; + clubMaxMembers: number; + clubRegistrationFee: number; + clubReRegistrationFee: number; + classifiedAdBillRate: number; + classifiedAdMaxDays: number; + classifiedAdMaxSize: number; + papAwardPercentage: number; + dealOfTheDayBrandedPartId: number; + dealOfTheDayDiscount: number; +}; + +/** + * Represents a class that holds tunable values for a game. + * This class follows the Singleton design pattern. + */ class Tunables { private static instance: Tunables; - private clubCreationFee: number; - private clubCreationMinimumLevel: number; - private clubOfficerMinimumLevel: number; - private racePPDefeatedOpponent: number; - private racePPPlaceLost: number; - private racePenaltyPerRank: number; - private raceBonusPerRank: number; - private raceBonusPerMileSponsored: number; - private raceBonusPerMileOpen: number; - private levelsTunelog: number; - private levelsSlope: number; - private levelsOffset: number; - private maxEZStreetLevel: number; - private clubWaitPeriodBetweenClubs: number; - private turfwarCaptionBonus: number; - private turfwarMemberBonus: number; - private topDogBonus: number; - private rankAdvancementBonus: number; - private ttCashRewardFirst: number; - private ttCashRewardSecond: number; - private ttCashRewardThird: number; - private ttPointsRewardFirst: number; - private ttPointsRewardSecond: number; - private ttPointsRewardThird: number; - private universalRepairCostModifier: number; - private universalScrapValueModifier: number; - private adCost1Day: number; - private adCost2Days: number; - private adCost3Days: number; - private adCost4Days: number; - private adCost5Days: number; - private adCost6Days: number; - private adCost7Days: number; - private tradeInModifier: number; - private simStreetMaxWager: number; - private pointAward1stPlace: number; - private pointAward2ndPlace: number; - private pointAward3rdPlace: number; - private pointAward4thPlace: number; - private pointAward5thPlace: number; - private pointAward6thPlace: number; - private arcadeRacePointModifier: number; - private mcotsPoolingFrequency: number; - private starterCash: number; - private enableCheatEmails: number; - private salaryPerLevel: number; - private clubMaxMembers: number; - private clubRegistrationFee: number; - private clubReRegistrationFee: number; - private classifiedAdBillRate: number; - private classifiedAdMaxDays: number; - private classifiedAdMaxSize: number; - private papAwardPercentage: number; - private dealOfTheDayBrandedPartId: number; - private dealOfTheDayDiscount: number; + private tunables: TunableType = { + clubCreationFee: 5000, + clubCreationMinimumLevel: 10, + clubOfficerMinimumLevel: 10, + racePPDefeatedOpponent: 5, + racePPPlaceLost: 1, + racePenaltyPerRank: 5, + raceBonusPerRank: 5, + raceBonusPerMileSponsored: 1, + raceBonusPerMileOpen: 1, + levelsTunelog: 100, + levelsSlope: 1, + levelsOffset: 0, + maxEZStreetLevel: 100, + clubWaitPeriodBetweenClubs: 7, + turfwarCaptionBonus: 500, + turfwarMemberBonus: 100, + topDogBonus: 1000, + rankAdvancementBonus: 100, + ttCashRewardFirst: 1000, + ttCashRewardSecond: 500, + ttCashRewardThird: 250, + ttPointsRewardFirst: 100, + ttPointsRewardSecond: 50, + ttPointsRewardThird: 25, + universalRepairCostModifier: 100, + universalScrapValueModifier: 100, + adCost1Day: 100, + adCost2Days: 200, + adCost3Days: 300, + adCost4Days: 400, + adCost5Days: 500, + adCost6Days: 600, + adCost7Days: 700, + tradeInModifier: 100, + simStreetMaxWager: 100, + pointAward1stPlace: 100, + pointAward2ndPlace: 75, + pointAward3rdPlace: 50, + pointAward4thPlace: 25, + pointAward5thPlace: 10, + pointAward6thPlace: 5, + arcadeRacePointModifier: 100, + mcotsPoolingFrequency: 100, + starterCash: 1000, + enableCheatEmails: 1, + salaryPerLevel: 100, + clubMaxMembers: 10, + clubRegistrationFee: 1000, + clubReRegistrationFee: 500, + classifiedAdBillRate: 100, + classifiedAdMaxDays: 7, + classifiedAdMaxSize: 100, + papAwardPercentage: 10, + dealOfTheDayBrandedPartId: 0, + dealOfTheDayDiscount: 0, + }; private constructor() { - this.clubCreationFee = 5000; - this.clubCreationMinimumLevel = 10; - this.clubOfficerMinimumLevel = 10; - this.racePPDefeatedOpponent = 5; - this.racePPPlaceLost = 1; - this.racePenaltyPerRank = 5; - this.raceBonusPerRank = 5; - this.raceBonusPerMileSponsored = 1; - this.raceBonusPerMileOpen = 1; - this.levelsTunelog = 100; - this.levelsSlope = 1; - this.levelsOffset = 0; - this.maxEZStreetLevel = 100; - this.clubWaitPeriodBetweenClubs = 7; - this.turfwarCaptionBonus = 500; - this.turfwarMemberBonus = 100; - this.topDogBonus = 1000; - this.rankAdvancementBonus = 100; - this.ttCashRewardFirst = 1000; - this.ttCashRewardSecond = 500; - this.ttCashRewardThird = 250; - this.ttPointsRewardFirst = 100; - this.ttPointsRewardSecond = 50; - this.ttPointsRewardThird = 25; - this.universalRepairCostModifier = 100; - this.universalScrapValueModifier = 100; - this.adCost1Day = 100; - this.adCost2Days = 200; - this.adCost3Days = 300; - this.adCost4Days = 400; - this.adCost5Days = 500; - this.adCost6Days = 600; - this.adCost7Days = 700; - this.tradeInModifier = 100; - this.simStreetMaxWager = 100; - this.pointAward1stPlace = 100; - this.pointAward2ndPlace = 75; - this.pointAward3rdPlace = 50; - this.pointAward4thPlace = 25; - this.pointAward5thPlace = 10; - this.pointAward6thPlace = 5; - this.arcadeRacePointModifier = 100; - this.mcotsPoolingFrequency = 100; - this.starterCash = 1000; - this.enableCheatEmails = 1; - this.salaryPerLevel = 100; - this.clubMaxMembers = 10; - this.clubRegistrationFee = 1000; - this.clubReRegistrationFee = 500; - this.classifiedAdBillRate = 100; - this.classifiedAdMaxDays = 7; - this.classifiedAdMaxSize = 100; - this.papAwardPercentage = 10; - this.dealOfTheDayBrandedPartId = 0; - this.dealOfTheDayDiscount = 0; + this.initializeTunables(); } public static getInstance(): Tunables { @@ -122,457 +132,88 @@ class Tunables { return Tunables.instance; } - public getClubCreationFee(): number { - return this.clubCreationFee; - } - - public getClubCreationMinimumLevel(): number { - return this.clubCreationMinimumLevel; - } - - public getClubOfficerMinimumLevel(): number { - return this.clubOfficerMinimumLevel; - } - - public getRacePPDefeatedOpponent(): number { - return this.racePPDefeatedOpponent; - } - - public getRacePPPlaceLost(): number { - return this.racePPPlaceLost; - } - - public getRacePenaltyPerRank(): number { - return this.racePenaltyPerRank; - } - - public getRaceBonusPerRank(): number { - return this.raceBonusPerRank; - } - - public getRaceBonusPerMileSponsored(): number { - return this.raceBonusPerMileSponsored; - } - - public getRaceBonusPerMileOpen(): number { - return this.raceBonusPerMileOpen; - } - - public getLevelsTunelog(): number { - return this.levelsTunelog; - } - - public getLevelsSlope(): number { - return this.levelsSlope; - } - - public getLevelsOffset(): number { - return this.levelsOffset; - } - - public getMaxEZStreetLevel(): number { - return this.maxEZStreetLevel; - } - - public getClubWaitPeriodBetweenClubs(): number { - return this.clubWaitPeriodBetweenClubs; - } - - public getTurfwarCaptionBonus(): number { - return this.turfwarCaptionBonus; - } - - public getTurfwarMemberBonus(): number { - return this.turfwarMemberBonus; - } - - public getTopDogBonus(): number { - return this.topDogBonus; - } - - public getRankAdvancementBonus(): number { - return this.rankAdvancementBonus; - } - - public getTtCashRewardFirst(): number { - return this.ttCashRewardFirst; - } - - public getTtCashRewardSecond(): number { - return this.ttCashRewardSecond; - } - - public getTtCashRewardThird(): number { - return this.ttCashRewardThird; - } - - public getTtPointsRewardFirst(): number { - return this.ttPointsRewardFirst; - } - - public getTtPointsRewardSecond(): number { - return this.ttPointsRewardSecond; - } - - public getTtPointsRewardThird(): number { - return this.ttPointsRewardThird; - } - - public getUniversalRepairCostModifier(): number { - return this.universalRepairCostModifier; - } - - public getUniversalScrapValueModifier(): number { - return this.universalScrapValueModifier; - } - - public getAdCost1Day(): number { - return this.adCost1Day; - } - - public getAdCost2Days(): number { - return this.adCost2Days; - } - - public getAdCost3Days(): number { - return this.adCost3Days; - } - - public getAdCost4Days(): number { - return this.adCost4Days; - } - - public getAdCost5Days(): number { - return this.adCost5Days; - } - - public getAdCost6Days(): number { - return this.adCost6Days; - } - - public getAdCost7Days(): number { - return this.adCost7Days; - } - - public getTradeInModifier(): number { - return this.tradeInModifier; - } - - public getSimStreetMaxWager(): number { - return this.simStreetMaxWager; - } - - public getPointAward1stPlace(): number { - return this.pointAward1stPlace; - } - - public getPointAward2ndPlace(): number { - return this.pointAward2ndPlace; - } - - public getPointAward3rdPlace(): number { - return this.pointAward3rdPlace; - } - - public getPointAward4thPlace(): number { - return this.pointAward4thPlace; - } - - public getPointAward5thPlace(): number { - return this.pointAward5thPlace; - } - - public getPointAward6thPlace(): number { - return this.pointAward6thPlace; - } - - public getArcadeRacePointModifier(): number { - return this.arcadeRacePointModifier; - } - - public getMcotsPoolingFrequency(): number { - return this.mcotsPoolingFrequency; - } - - public getStarterCash(): number { - return this.starterCash; - } - - public getEnableCheatEmails(): number { - return this.enableCheatEmails; - } - - public getSalaryPerLevel(): number { - return this.salaryPerLevel; - } - - public getClubMaxMembers(): number { - return this.clubMaxMembers; - } - - public getClubRegistrationFee(): number { - return this.clubRegistrationFee; - } - - public getClubReRegistrationFee(): number { - return this.clubReRegistrationFee; - } - - public getClassifiedAdBillRate(): number { - return this.classifiedAdBillRate; - } - - public getClassifiedAdMaxDays(): number { - return this.classifiedAdMaxDays; - } - - public getClassifiedAdMaxSize(): number { - return this.classifiedAdMaxSize; - } - - public getPapAwardPercentage(): number { - return this.papAwardPercentage; - } - - public getDealOfTheDayBrandedPartId(): number { - return this.dealOfTheDayBrandedPartId; - } - - public getDealOfTheDayDiscount(): number { - return this.dealOfTheDayDiscount; - } - - public setClubCreationFee(clubCreationFee: number): void { - this.clubCreationFee = clubCreationFee; - } - - public setClubCreationMinimumLevel(clubCreationMinimumLevel: number): void { - this.clubCreationMinimumLevel = clubCreationMinimumLevel; - } - - public setClubOfficerMinimumLevel(clubOfficerMinimumLevel: number): void { - this.clubOfficerMinimumLevel = clubOfficerMinimumLevel; - } - - public setRacePPDefeatedOpponent(racePPDefeatedOpponent: number): void { - this.racePPDefeatedOpponent = racePPDefeatedOpponent; - } - - public setRacePPPlaceLost(racePPPlaceLost: number): void { - this.racePPPlaceLost = racePPPlaceLost; - } - - public setRacePenaltyPerRank(racePenaltyPerRank: number): void { - this.racePenaltyPerRank = racePenaltyPerRank; - } - - public setRaceBonusPerRank(raceBonusPerRank: number): void { - this; - } - - public setRaceBonusPerMileSponsored( - raceBonusPerMileSponsored: number - ): void { - this.raceBonusPerMileSponsored = raceBonusPerMileSponsored; - } - - public setRaceBonusPerMileOpen(raceBonusPerMileOpen: number): void { - this.raceBonusPerMileOpen = raceBonusPerMileOpen; - } - - public setLevelsTunelog(levelsTunelog: number): void { - this.levelsTunelog = levelsTunelog; - } - - public setLevelsSlope(levelsSlope: number): void { - this.levelsSlope = levelsSlope; - } - - public setLevelsOffset(levelsOffset: number): void { - this.levelsOffset = levelsOffset; - } - - public setMaxEZStreetLevel(maxEZStreetLevel: number): void { - this.maxEZStreetLevel = maxEZStreetLevel; - } - - public setClubWaitPeriodBetweenClubs( - clubWaitPeriodBetweenClubs: number - ): void { - this.clubWaitPeriodBetweenClubs = clubWaitPeriodBetweenClubs; - } - - public setTurfwarCaptionBonus(turfwarCaptionBonus: number): void { - this.turfwarCaptionBonus = turfwarCaptionBonus; - } - - public setTurfwarMemberBonus(turfwarMemberBonus: number): void { - this.turfwarMemberBonus = turfwarMemberBonus; - } - - public setTopDogBonus(topDogBonus: number): void { - this.topDogBonus = topDogBonus; - } - - public setRankAdvancementBonus(rankAdvancementBonus: number): void { - this.rankAdvancementBonus = rankAdvancementBonus; - } - - public setTtCashRewardFirst(ttCashRewardFirst: number): void { - this.ttCashRewardFirst = ttCashRewardFirst; - } - - public setTtCashRewardSecond(ttCashRewardSecond: number): void { - this.ttCashRewardSecond = ttCashRewardSecond; - } - - public setTtCashRewardThird(ttCashRewardThird: number): void { - this.ttCashRewardThird = ttCashRewardThird; - } - - public setTtPointsRewardFirst(ttPointsRewardFirst: number): void { - this.ttPointsRewardFirst = ttPointsRewardFirst; - } - - public setTtPointsRewardSecond(ttPointsRewardSecond: number): void { - this.ttPointsRewardSecond = ttPointsRewardSecond; - } - - public setTtPointsRewardThird(ttPointsRewardThird: number): void { - this.ttPointsRewardThird = ttPointsRewardThird; - } - - public setUniversalRepairCostModifier( - universalRepairCostModifier: number - ): void { - this.universalRepairCostModifier = universalRepairCostModifier; - } - - public setUniversalScrapValueModifier( - universalScrapValueModifier: number - ): void { - this.universalScrapValueModifier = universalScrapValueModifier; - } - - public setAdCost1Day(adCost1Day: number): void { - this.adCost1Day = adCost1Day; - } - - public setAdCost2Days(adCost2Days: number): void { - this.adCost2Days = adCost2Days; - } - - public setAdCost3Days(adCost3Days: number): void { - this.adCost3Days = adCost3Days; - } - - public setAdCost4Days(adCost4Days: number): void { - this.adCost4Days = adCost4Days; - } - - public setAdCost5Days(adCost5Days: number): void { - this.adCost5Days = adCost5Days; - } - - public setAdCost6Days(adCost6Days: number): void { - this.adCost6Days = adCost6Days; - } - - public setAdCost7Days(adCost7Days: number): void { - this.adCost7Days = adCost7Days; - } - - public setTradeInModifier(tradeInModifier: number): void { - this.tradeInModifier = tradeInModifier; - } - - public setSimStreetMaxWager(simStreetMaxWager: number): void { - this.simStreetMaxWager = simStreetMaxWager; - } - - public setPointAward1stPlace(pointAward1stPlace: number): void { - this.pointAward1stPlace = pointAward1stPlace; - } - - public setPointAward2ndPlace(pointAward2ndPlace: number): void { - this.pointAward2ndPlace = pointAward2ndPlace; - } - - public setPointAward3rdPlace(pointAward3rdPlace: number): void { - this.pointAward3rdPlace = pointAward3rdPlace; - } - - public setPointAward4thPlace(pointAward4thPlace: number): void { - this.pointAward4thPlace = pointAward4thPlace; - } - - public setPointAward5thPlace(pointAward5thPlace: number): void { - this.pointAward5thPlace = pointAward5thPlace; - } - - public setPointAward6thPlace(pointAward6thPlace: number): void { - this.pointAward6thPlace = pointAward6thPlace; - } - - public setArcadeRacePointModifier(arcadeRacePointModifier: number): void { - this.arcadeRacePointModifier = arcadeRacePointModifier; - } - - public setMcotsPoolingFrequency(mcotsPoolingFrequency: number): void { - this.mcotsPoolingFrequency = mcotsPoolingFrequency; - } - - public setStarterCash(starterCash: number): void { - this.starterCash = starterCash; - } - - public setEnableCheatEmails(enableCheatEmails: number): void { - this.enableCheatEmails = enableCheatEmails; - } - - public setSalaryPerLevel(salaryPerLevel: number): void { - this.salaryPerLevel = salaryPerLevel; - } - - public setClubMaxMembers(clubMaxMembers: number): void { - this.clubMaxMembers = clubMaxMembers; - } - - public setClubRegistrationFee(clubRegistrationFee: number): void { - this.clubRegistrationFee = clubRegistrationFee; - } - - public setClubReRegistrationFee(clubReRegistrationFee: number): void { - this.clubReRegistrationFee = clubReRegistrationFee; - } - - public setClassifiedAdBillRate(classifiedAdBillRate: number): void { - this.classifiedAdBillRate = classifiedAdBillRate; - } - - public setClassifiedAdMaxDays(classifiedAdMaxDays: number): void { - this.classifiedAdMaxDays = classifiedAdMaxDays; - } - - public setClassifiedAdMaxSize(classifiedAdMaxSize: number): void { - this.classifiedAdMaxSize = classifiedAdMaxSize; - } + private initializeTunables(): void { + this.tunables = { + clubCreationFee: 5000, + clubCreationMinimumLevel: 10, + clubOfficerMinimumLevel: 10, + racePPDefeatedOpponent: 5, + racePPPlaceLost: 1, + racePenaltyPerRank: 5, + raceBonusPerRank: 5, + raceBonusPerMileSponsored: 1, + raceBonusPerMileOpen: 1, + levelsTunelog: 100, + levelsSlope: 1, + levelsOffset: 0, + maxEZStreetLevel: 100, + clubWaitPeriodBetweenClubs: 7, + turfwarCaptionBonus: 500, + turfwarMemberBonus: 100, + topDogBonus: 1000, + rankAdvancementBonus: 100, + ttCashRewardFirst: 1000, + ttCashRewardSecond: 500, + ttCashRewardThird: 250, + ttPointsRewardFirst: 100, + ttPointsRewardSecond: 50, + ttPointsRewardThird: 25, + universalRepairCostModifier: 100, + universalScrapValueModifier: 100, + adCost1Day: 100, + adCost2Days: 200, + adCost3Days: 300, + adCost4Days: 400, + adCost5Days: 500, + adCost6Days: 600, + adCost7Days: 700, + tradeInModifier: 100, + simStreetMaxWager: 100, + pointAward1stPlace: 100, + pointAward2ndPlace: 75, + pointAward3rdPlace: 50, + pointAward4thPlace: 25, + pointAward5thPlace: 10, + pointAward6thPlace: 5, + arcadeRacePointModifier: 100, + mcotsPoolingFrequency: 100, + starterCash: 1000, + enableCheatEmails: 1, + salaryPerLevel: 100, + clubMaxMembers: 10, + clubRegistrationFee: 1000, + clubReRegistrationFee: 500, + classifiedAdBillRate: 100, + classifiedAdMaxDays: 7, + classifiedAdMaxSize: 100, + papAwardPercentage: 10, + dealOfTheDayBrandedPartId: 0, + dealOfTheDayDiscount: 0, + }; + } + + public getTunable(name: string): number { + if (this.tunables[name] === undefined) { + throw new Error(`Tunable ${name} not found`); + } - public setPapAwardPercentage(papAwardPercentage: number): void { - this.papAwardPercentage = papAwardPercentage; + return this.tunables[name]; } - public setDealOfTheDayBrandedPartId( - dealOfTheDayBrandedPartId: number - ): void { - this.dealOfTheDayBrandedPartId = dealOfTheDayBrandedPartId; - } + public setTunable(name: string, value: number): void { + if (this.tunables[name] === undefined) { + throw new Error(`Tunable ${name} not found`); + } - public setDealOfTheDayDiscount(dealOfTheDayDiscount: number): void { - this.dealOfTheDayDiscount = dealOfTheDayDiscount; + this.tunables[name] = value; } } +/** + * Retrieves the tunables from the database. + * + * @returns The tunables object. + */ export function getTunables(): Tunables { return Tunables.getInstance(); } diff --git a/packages/database/test/tunables.test.ts b/packages/database/test/tunables.test.ts new file mode 100644 index 000000000..b4759b80d --- /dev/null +++ b/packages/database/test/tunables.test.ts @@ -0,0 +1,32 @@ +import { describe, expect, it } from "vitest"; +import { getTunables } from "../src/services/tunables"; + +describe("Tunables", () => { + it("should return the correct tunable value", () => { + const tunables = getTunables(); + expect(tunables.getTunable("clubCreationFee")).toBe(5000); + expect(tunables.getTunable("clubCreationMinimumLevel")).toBe(10); + // Add more test cases for other tunable values + }); + + it("should throw an error for an invalid tunable name", () => { + const tunables = getTunables(); + expect(() => tunables.getTunable("invalidTunable")).toThrowError( + "Tunable invalidTunable not found", + ); + }); + + it("should set the tunable value correctly", () => { + const tunables = getTunables(); + tunables.setTunable("clubCreationFee", 10000); + expect(tunables.getTunable("clubCreationFee")).toBe(10000); + // Add more test cases for other tunable values + }); + + it("should throw an error when setting an invalid tunable name", () => { + const tunables = getTunables(); + expect(() => tunables.setTunable("invalidTunable", 100)).toThrowError( + "Tunable invalidTunable not found", + ); + }); +}); From d8f14d6277cd25a91a3b5ffd8ac60e9d9646aed8 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 08:40:13 -0400 Subject: [PATCH 74/84] refactor: Update import paths for shared modules in lobby and login packages - start works, lobby loads --- package.json | 5 + packages/cli/index.ts | 1 + packages/gateway/src/GatewayServer.ts | 620 +++++++++++++------------- packages/lobby/index.ts | 1 + packages/lobby/package.json | 34 ++ packages/lobby/vite.config.ts | 22 + packages/login/index.ts | 1 + packages/login/package.json | 34 ++ packages/login/vite.config.ts | 22 + packages/transactions/index.ts | 1 + pnpm-lock.yaml | 53 +++ 11 files changed, 483 insertions(+), 311 deletions(-) create mode 100644 packages/cli/index.ts create mode 100644 packages/lobby/index.ts create mode 100644 packages/lobby/package.json create mode 100644 packages/lobby/vite.config.ts create mode 100644 packages/login/index.ts create mode 100644 packages/login/package.json create mode 100644 packages/login/vite.config.ts create mode 100644 packages/transactions/index.ts diff --git a/package.json b/package.json index fa229f7c1..c5e3b0a28 100644 --- a/package.json +++ b/package.json @@ -36,13 +36,18 @@ "@sentry/profiling-node": "^1.3.2", "adminjs": "^7.5.2", "fastify": "^4.25.1", + "lobby": "link:packages/lobby", "moment": "^2.29.4", "pino": "^8.17.1", + "rusty-motors-cli": "link:packages/cli", "rusty-motors-database": "link:packages/database", "rusty-motors-gateway": "link:packages/gateway", + "rusty-motors-lobby": "link:packages/lobby", + "rusty-motors-login": "link:packages/login", "rusty-motors-nps": "link:packages/nps", "rusty-motors-shared": "link:packages/shared", "rusty-motors-shared-packets": "link:packages/shared-packets", + "rusty-motors-transactions": "link:packages/transactions", "sequelize": "^6.35.2", "sqlite": "^5.1.1", "ts-node": "10.9.2" diff --git a/packages/cli/index.ts b/packages/cli/index.ts new file mode 100644 index 000000000..29da293ab --- /dev/null +++ b/packages/cli/index.ts @@ -0,0 +1 @@ +export { ConsoleThread } from "./ConsoleThread.js"; diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 5336cfab2..01949cada 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -1,42 +1,38 @@ import { Socket, createServer as createSocketServer } from "node:net"; import FastifySensible from "@fastify/sensible"; -import fastify from "fastify"; +import fastify, { type FastifyInstance } from "fastify"; import type { Logger } from "pino"; -import { ConsoleThread } from "../../cli/ConsoleThread.js"; -import { receiveLobbyData } from "../../lobby/src/internal.js"; -import { receiveLoginData } from "../../login/src/index.js"; +import { ConsoleThread } from "rusty-motors-cli"; +import { receiveLobbyData } from "rusty-motors-lobby"; +import { receiveLoginData } from "rusty-motors-login"; import { receivePersonaData } from "../../persona/src/internal.js"; +import { Configuration, getServerConfiguration } from "rusty-motors-shared"; import { - Configuration, - getServerConfiguration, -} from "rusty-motors-shared"; -import { - addOnDataHandler, - createInitialState, - fetchStateFromDatabase, + addOnDataHandler, + createInitialState, + fetchStateFromDatabase, } from "rusty-motors-shared"; import { ServerError } from "rusty-motors-shared"; import { getServerLogger } from "rusty-motors-shared"; -import { receiveTransactionsData } from "../../transactions/src/internal.js"; +import { receiveTransactionsData } from "rusty-motors-transactions"; import { onSocketConnection } from "./index.js"; import { addWebRoutes } from "./web.js"; /** - * @module gateway + * Options for the GatewayServer. */ - type GatewayOptions = { - config?: Configuration; - log?: Logger; - backlogAllowedCount?: number; - listeningPortList?: number[]; - socketConnectionHandler?: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; + config?: Configuration; + log?: Logger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; }; /** @@ -44,267 +40,269 @@ type GatewayOptions = { * @see {@link getGatewayServer()} to get a singleton instance */ export class Gateway { - config: Configuration; - log: Logger; - timer: NodeJS.Timeout | null; - loopInterval: number; - status: string; - consoleEvents: string[]; - backlogAllowedCount: number; - listeningPortList: number[]; - servers: import("node:net").Server[]; - socketconnection: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; - static _instance: Gateway | undefined; - webServer: import("fastify").FastifyInstance | undefined; - readThread: ConsoleThread | undefined; - /** - * Creates an instance of GatewayServer. - * @param {GatewayOptions} options - */ - constructor({ - config = getServerConfiguration({}), - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList = [], - socketConnectionHandler = onSocketConnection, - }: GatewayOptions) { - log.debug("Creating GatewayServer instance"); - - this.config = config; - this.log = log; - /** @type {NodeJS.Timeout | null} */ - this.timer = null; - this.loopInterval = 0; - /** @type {"stopped" | "running" | "stopping" | "restarting"} */ - this.status = "stopped"; - this.consoleEvents = ["userExit", "userRestart", "userHelp"]; - this.backlogAllowedCount = backlogAllowedCount; - this.listeningPortList = listeningPortList; - /** @type {import("node:net").Server[]} */ - this.servers = []; - this.socketconnection = socketConnectionHandler; - - Gateway._instance = this; - } - - /** - * @return {import("fastify").FastifyInstance} - */ - getWebServer(): import("fastify").FastifyInstance { - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - return this.webServer; - } - - start() { - this.log.debug("Starting GatewayServer in start()"); - this.log.info("Server starting"); - - // Check if there are any listening ports specified - if (this.listeningPortList.length === 0) { - throw new ServerError("No listening ports specified"); - } - - // Mark the GatewayServer as running - this.log.debug("Marking GatewayServer as running"); - this.status = "running"; - - // Initialize the GatewayServer - this.init(); - - this.listeningPortList.forEach((port) => { - const server = createSocketServer((s) => { - this.socketconnection({ - incomingSocket: s, - log: this.log, - }); - }); - - server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { - this.log.debug(`Listening on port ${port}`); - }); - - // Add the server to the list of servers - this.servers.push(server); - }); - - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - - // Start the web server - addWebRoutes(this.webServer); - - this.webServer.listen( - { - host: "0.0.0.0", - port: 3000, - }, - (err, address) => { - if (err) { - this.log.error(err); - process.exit(1); - } - this.log.info(`Server listening at ${address}`); - }, - ); - } - - async restart() { - // Stop the GatewayServer - await this.stop(); - - console.log("=== Restarting... ==="); - - // Start the GatewayServer - this.start(); - } - - async exit() { - // Stop the GatewayServer - await this.stop(); - - // Exit the process - process.exit(0); - } - - async stop() { - // Mark the GatewayServer as stopping - this.log.debug("Marking GatewayServer as stopping"); - this.status = "stopping"; - - // Stop the servers - this.servers.forEach((server) => { - server.close(); - }); - - // Stop the read thread - if (this.readThread !== undefined) { - this.readThread.stop(); - } - - if (this.webServer === undefined) { - throw new ServerError("webServer is undefined"); - } - await this.webServer.close(); - - // Stop the timer - if (this.timer !== null) { - clearInterval(this.timer); - } - - // Mark the GatewayServer as stopped - this.log.debug("Marking GatewayServer as stopped"); - this.status = "stopped"; - - // Reset the global state - this.log.debug("Resetting the global state"); - createInitialState({}).save(); - } - - /** - * @param {string} event - */ - handleReadThreadEvent(event: string) { - if (event === "userExit") { - this.exit(); - } - if (event === "userRestart") { - this.restart(); - } - if (event === "userHelp") { - this.help(); - } - } - - init() { - // Create the read thread - this.readThread = new ConsoleThread({ - parentThread: this, - log: this.log, - }); - - // Register the read thread events - if (this.readThread === undefined) { - throw new ServerError("readThread is undefined"); - } - this.consoleEvents.forEach((event) => { - this.readThread?.on(event, () => { - this.handleReadThreadEvent(event); - }); - }); - - this.webServer = fastify({ - logger: true, - }); - this.webServer.register(FastifySensible); - - let state = fetchStateFromDatabase(); - - state = addOnDataHandler(state, 8226, receiveLoginData); - state = addOnDataHandler(state, 8228, receivePersonaData); - state = addOnDataHandler(state, 7003, receiveLobbyData); - state = addOnDataHandler(state, 43300, receiveTransactionsData); - - state.save(); - - this.log.debug("GatewayServer initialized"); - } - - help() { - console.log("=== Help ==="); - console.log("x: Exit"); - console.log("r: Restart"); - console.log("?: Help"); - console.log("============"); - } - run() { - // Intentionally left blank - } - - /** - * - * @param {GatewayOptions} options - * @returns {Gateway} - * @memberof Gateway - */ - static getInstance({ - config = undefined, - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList = [], - socketConnectionHandler = onSocketConnection, - }: GatewayOptions): Gateway { - if (Gateway._instance === undefined) { - Gateway._instance = new Gateway({ - config, - log, - backlogAllowedCount, - listeningPortList, - socketConnectionHandler, - }); - } - return Gateway._instance; - } - - shutdown() { - this.log.debug("Shutdown complete for GatewayServer"); - this.status = "stopped"; - this.log.info("Server stopped"); - - process.exit(0); - } + config: Configuration; + log: Logger; + timer: NodeJS.Timeout | null; + loopInterval: number; + status: string; + consoleEvents: string[]; + backlogAllowedCount: number; + listeningPortList: number[]; + activeServers: import("node:net").Server[]; + socketconnection: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; + static _instance: Gateway | undefined; + webServer: import("fastify").FastifyInstance | undefined; + readThread: ConsoleThread | undefined; + /** + * Creates an instance of GatewayServer. + * @param {GatewayOptions} options + */ + constructor({ + config = getServerConfiguration({}), + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList = [], + socketConnectionHandler = onSocketConnection, + }: GatewayOptions) { + log.debug("Creating GatewayServer instance"); + + this.config = config; + this.log = log; + /** @type {NodeJS.Timeout | null} */ + this.timer = null; + this.loopInterval = 0; + /** @type {"stopped" | "running" | "stopping" | "restarting"} */ + this.status = "stopped"; + this.consoleEvents = ["userExit", "userRestart", "userHelp"]; + this.backlogAllowedCount = backlogAllowedCount; + this.listeningPortList = listeningPortList; + /** @type {import("node:net").Server[]} */ + this.activeServers = []; + this.socketconnection = socketConnectionHandler; + + Gateway._instance = this; + } + + /** + * @return {FastifyInstance} + */ + getWebServer(): FastifyInstance { + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + return this.webServer; + } + + start() { + this.log.debug("Starting GatewayServer in start()"); + this.log.info("Server starting"); + + // Check if there are any listening ports specified + if (this.listeningPortList.length === 0) { + throw new ServerError("No listening ports specified"); + } + + // Mark the GatewayServer as running + this.log.debug("Marking GatewayServer as running"); + this.status = "running"; + + // Initialize the GatewayServer + this.init(); + + this.listeningPortList.forEach(async (port) => { + const server = createSocketServer((s) => { + this.socketconnection({ + incomingSocket: s, + log: this.log, + }); + }); + + // Listen on the specified port + + server.listen(port, "0.0.0.0", this.backlogAllowedCount, () => { + this.log.debug(`Listening on port ${port}`); + }); + + // Add the server to the list of servers + this.activeServers.push(server); + }); + + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + + // Start the web server + addWebRoutes(this.webServer); + + this.webServer.listen( + { + host: "0.0.0.0", + port: 3000, + }, + (err, address) => { + if (err) { + this.log.error(err); + process.exit(1); + } + this.log.info(`Server listening at ${address}`); + }, + ); + } + + async restart() { + // Stop the GatewayServer + await this.stop(); + + console.log("=== Restarting... ==="); + + // Start the GatewayServer + this.start(); + } + + async exit() { + // Stop the GatewayServer + await this.stop(); + + // Exit the process + process.exit(0); + } + + async stop() { + // Mark the GatewayServer as stopping + this.log.debug("Marking GatewayServer as stopping"); + this.status = "stopping"; + + // Stop the servers + this.activeServers.forEach((server) => { + server.close(); + }); + + // Stop the read thread + if (this.readThread !== undefined) { + this.readThread.stop(); + } + + if (this.webServer === undefined) { + throw new ServerError("webServer is undefined"); + } + await this.webServer.close(); + + // Stop the timer + if (this.timer !== null) { + clearInterval(this.timer); + } + + // Mark the GatewayServer as stopped + this.log.debug("Marking GatewayServer as stopped"); + this.status = "stopped"; + + // Reset the global state + this.log.debug("Resetting the global state"); + createInitialState({}).save(); + } + + /** + * @param {string} event + */ + handleReadThreadEvent(event: string) { + if (event === "userExit") { + this.exit(); + } + if (event === "userRestart") { + this.restart(); + } + if (event === "userHelp") { + this.help(); + } + } + + init() { + // Create the read thread + this.readThread = new ConsoleThread({ + parentThread: this, + log: this.log, + }); + + // Register the read thread events + if (this.readThread === undefined) { + throw new ServerError("readThread is undefined"); + } + this.consoleEvents.forEach((event) => { + this.readThread?.on(event, () => { + this.handleReadThreadEvent(event); + }); + }); + + this.webServer = fastify({ + logger: true, + }); + this.webServer.register(FastifySensible); + + let state = fetchStateFromDatabase(); + + state = addOnDataHandler(state, 8226, receiveLoginData); + state = addOnDataHandler(state, 8228, receivePersonaData); + state = addOnDataHandler(state, 7003, receiveLobbyData); + state = addOnDataHandler(state, 43300, receiveTransactionsData); + + state.save(); + + this.log.debug("GatewayServer initialized"); + } + + help() { + console.log("=== Help ==="); + console.log("x: Exit"); + console.log("r: Restart"); + console.log("?: Help"); + console.log("============"); + } + run() { + // Intentionally left blank + } + + /** + * + * @param {GatewayOptions} options + * @returns {Gateway} + * @memberof Gateway + */ + static getInstance({ + config = undefined, + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList = [], + socketConnectionHandler = onSocketConnection, + }: GatewayOptions): Gateway { + if (Gateway._instance === undefined) { + Gateway._instance = new Gateway({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }); + } + return Gateway._instance; + } + + shutdown() { + this.log.debug("Shutdown complete for GatewayServer"); + this.status = "stopped"; + this.log.info("Server stopped"); + + process.exit(0); + } } /** @type {Gateway | undefined} */ @@ -317,31 +315,31 @@ Gateway._instance = undefined; * @returns {Gateway} */ export function getGatewayServer({ - config, - log = getServerLogger({ - module: "GatewayServer", - }), - backlogAllowedCount = 0, - listeningPortList: listeningPortList = [], - socketConnectionHandler = onSocketConnection, + config, + log = getServerLogger({ + module: "GatewayServer", + }), + backlogAllowedCount = 0, + listeningPortList: listeningPortList = [], + socketConnectionHandler = onSocketConnection, }: { - config?: Configuration; - log?: Logger; - backlogAllowedCount?: number; - listeningPortList?: number[]; - socketConnectionHandler?: ({ - incomingSocket, - log, - }: { - incomingSocket: Socket; - log?: Logger; - }) => void; + config?: Configuration; + log?: Logger; + backlogAllowedCount?: number; + listeningPortList?: number[]; + socketConnectionHandler?: ({ + incomingSocket, + log, + }: { + incomingSocket: Socket; + log?: Logger; + }) => void; }): Gateway { - return Gateway.getInstance({ - config, - log, - backlogAllowedCount, - listeningPortList, - socketConnectionHandler, - }); + return Gateway.getInstance({ + config, + log, + backlogAllowedCount, + listeningPortList, + socketConnectionHandler, + }); } diff --git a/packages/lobby/index.ts b/packages/lobby/index.ts new file mode 100644 index 000000000..d5f98dd8e --- /dev/null +++ b/packages/lobby/index.ts @@ -0,0 +1 @@ +export { receiveLobbyData } from "./src/internal.js" diff --git a/packages/lobby/package.json b/packages/lobby/package.json new file mode 100644 index 000000000..022a6ad36 --- /dev/null +++ b/packages/lobby/package.json @@ -0,0 +1,34 @@ +{ + "name": "rusty-motors-lobby", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npx prettier --write .", + "test": "echo \"Error: no test specified\" && exit 0", + "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2" + }, + "directories": { + "test": "test" + }, + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } +} diff --git a/packages/lobby/vite.config.ts b/packages/lobby/vite.config.ts new file mode 100644 index 000000000..01911fd2b --- /dev/null +++ b/packages/lobby/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/login/index.ts b/packages/login/index.ts new file mode 100644 index 000000000..7674ca0ba --- /dev/null +++ b/packages/login/index.ts @@ -0,0 +1 @@ +export { receiveLoginData } from "./src/index.js"; diff --git a/packages/login/package.json b/packages/login/package.json new file mode 100644 index 000000000..f1c651540 --- /dev/null +++ b/packages/login/package.json @@ -0,0 +1,34 @@ +{ + "name": "rusty-motors-login", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npx prettier --write .", + "test": "echo \"Error: no test specified\" && exit 0", + "test:crypto": "pnpm node --openssl-legacy-provider node_modules/vitest/vitest.mjs run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@fastify/sensible": "^5.5.0", + "@sentry/node": "^8.0.0", + "fastify": "^4.25.2" + }, + "directories": { + "test": "test" + }, + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } +} diff --git a/packages/login/vite.config.ts b/packages/login/vite.config.ts new file mode 100644 index 000000000..01911fd2b --- /dev/null +++ b/packages/login/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/transactions/index.ts b/packages/transactions/index.ts new file mode 100644 index 000000000..7f3f950bc --- /dev/null +++ b/packages/transactions/index.ts @@ -0,0 +1 @@ +export { receiveTransactionsData } from "./src/internal.js"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba94ece89..9e4f71bbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,18 +32,30 @@ importers: fastify: specifier: ^4.25.1 version: 4.28.1 + lobby: + specifier: link:packages/lobby + version: link:packages/lobby moment: specifier: ^2.29.4 version: 2.30.1 pino: specifier: ^8.17.1 version: 8.21.0 + rusty-motors-cli: + specifier: link:packages/cli + version: link:packages/cli rusty-motors-database: specifier: link:packages/database version: link:packages/database rusty-motors-gateway: specifier: link:packages/gateway version: link:packages/gateway + rusty-motors-lobby: + specifier: link:packages/lobby + version: link:packages/lobby + rusty-motors-login: + specifier: link:packages/login + version: link:packages/login rusty-motors-nps: specifier: link:packages/nps version: link:packages/nps @@ -53,6 +65,9 @@ importers: rusty-motors-shared-packets: specifier: link:packages/shared-packets version: link:packages/shared-packets + rusty-motors-transactions: + specifier: link:packages/transactions + version: link:packages/transactions sequelize: specifier: ^6.35.2 version: 6.37.3(pg@8.12.0) @@ -211,6 +226,44 @@ importers: specifier: ^2.0.5 version: 2.0.5(@types/node@22.5.0) + packages/lobby: + dependencies: + '@fastify/sensible': + specifier: ^5.5.0 + version: 5.6.0 + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + fastify: + specifier: ^4.25.2 + version: 4.28.1 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) + + packages/login: + dependencies: + '@fastify/sensible': + specifier: ^5.5.0 + version: 5.6.0 + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + fastify: + specifier: ^4.25.2 + version: 4.28.1 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) + packages/mcots: dependencies: '@sentry/node': From 4b4625e9c6d6d84913e0bf8af07a53e7e13121c2 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 12:18:06 -0400 Subject: [PATCH 75/84] refactor: Remove unused code in shared-packets module - start works, lobby loads --- packages/shared-packets/index.ts | 2 - packages/shared-packets/src/ServerMessage.ts | 528 ++++++------------- packages/shared-packets/src/interfaces.ts | 2 - 3 files changed, 173 insertions(+), 359 deletions(-) diff --git a/packages/shared-packets/index.ts b/packages/shared-packets/index.ts index 1786df049..98e5ec925 100644 --- a/packages/shared-packets/index.ts +++ b/packages/shared-packets/index.ts @@ -2,8 +2,6 @@ export * from "./src/interfaces.js"; export { ServerMessage, ServerMessageHeader, - ServerGenericRequest, - ServerGenericResponse, ServerMessagePayload, } from "./src/ServerMessage.js"; export { Serializable } from "./src/BasePacket.js"; diff --git a/packages/shared-packets/src/ServerMessage.ts b/packages/shared-packets/src/ServerMessage.ts index 971496cff..f2fad0a64 100644 --- a/packages/shared-packets/src/ServerMessage.ts +++ b/packages/shared-packets/src/ServerMessage.ts @@ -1,4 +1,4 @@ -import { McosEncryptionPair, getServerLogger } from "rusty-motors-shared"; +import { getServerLogger } from "rusty-motors-shared"; import { BasePacket, Serializable } from "./BasePacket.js"; import type { IMessage, ISerializable } from "./interfaces.js"; @@ -8,373 +8,191 @@ const log = getServerLogger({}); * */ export class ServerMessageHeader extends BasePacket { - // All fields are little-endian - private length: number = 0; // 2 bytes - private signature: string = ""; // 4 bytes - private sequence: number = 0; // 4 bytes - private flags: number = 0; // 1 - - getDataOffset(): number { - return 11; - } - override getByteSize(): number { - return 11; - } - - getLength(): number { - return this.length; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.length, 0); - buffer.write(this.signature, 2, 4, "ascii"); - buffer.writeUInt32LE(this.sequence, 6); - buffer.writeUInt8(this.flags, 10); - - return buffer; - } - - override deserialize(data: Buffer): ServerMessageHeader { - this._assertEnoughData(data, this.getByteSize()); - - this.length = data.readUInt16LE(0); - this.signature = data.toString("utf8", 2, 6); - this.sequence = data.readUInt32LE(6); - this.flags = data.readUInt8(10); - - return this; - } - - isValidSignature(): boolean { - return this.signature === "TOMC"; - } - - isPayloadEncrypted(): boolean { - // Does the flags bitmask contain have 0x08 set? - return (this.flags & 0x08) != 0; - } - - setPayloadEncryption(encrypted: boolean): ServerMessageHeader { - if (encrypted) { - this.flags |= 0x08; - } else { - this.flags &= ~0x08; - } - return this; - } - - toString(): string { - return `ServerMessageHeader {length: ${this.length}, signature: ${this.signature}, sequence: ${this.sequence}, flags: ${this.flags}}`; - } - - toHexString(): string { - return this.serialize().toString("hex"); - } - - getSequence(): number { - return this.sequence; - } - - setSequence(sequence: number): ServerMessageHeader { - this.sequence = sequence; - return this; - } - - setLength(length: number): ServerMessageHeader { - this.length = length; - return this; - } - - setSignature(signature: string): ServerMessageHeader { - this.signature = signature; - return this; - } + // All fields are little-endian + private length: number = 0; // 2 bytes + private signature: string = ""; // 4 bytes + private sequence: number = 0; // 4 bytes + private flags: number = 0; // 1 + + getDataOffset(): number { + return 11; + } + override getByteSize(): number { + return 11; + } + + getLength(): number { + return this.length; + } + + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.length, 0); + buffer.write(this.signature, 2, 4, "ascii"); + buffer.writeUInt32LE(this.sequence, 6); + buffer.writeUInt8(this.flags, 10); + + return buffer; + } + + override deserialize(data: Buffer): ServerMessageHeader { + this._assertEnoughData(data, this.getByteSize()); + + this.length = data.readUInt16LE(0); + this.signature = data.toString("utf8", 2, 6); + this.sequence = data.readUInt32LE(6); + this.flags = data.readUInt8(10); + + return this; + } + + isValidSignature(): boolean { + return this.signature === "TOMC"; + } + + isPayloadEncrypted(): boolean { + // Does the flags bitmask contain have 0x08 set? + return (this.flags & 0x08) != 0; + } + + setPayloadEncryption(encrypted: boolean): ServerMessageHeader { + if (encrypted) { + this.flags |= 0x08; + } else { + this.flags &= ~0x08; + } + return this; + } + + override toString(): string { + return `ServerMessageHeader {length: ${this.length}, signature: ${this.signature}, sequence: ${this.sequence}, flags: ${this.flags}}`; + } + + override toHexString(): string { + return this.serialize().toString("hex"); + } + + getSequence(): number { + return this.sequence; + } + + setSequence(sequence: number): ServerMessageHeader { + this.sequence = sequence; + return this; + } + + setLength(length: number): ServerMessageHeader { + this.length = length; + return this; + } + + setSignature(signature: string): ServerMessageHeader { + this.signature = signature; + return this; + } } export class ServerMessagePayload - extends Serializable - implements ISerializable + extends Serializable + implements ISerializable { - protected messageId: number = 0; // 2 bytes + protected messageId: number = 0; // 2 bytes - override getByteSize(): number { - return 2 + this._data.length; - } + override getByteSize(): number { + return 2 + this._data.length; + } - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - this._data.copy(buffer, 2); + override serialize(): Buffer { + const buffer = Buffer.alloc(this.getByteSize()); + buffer.writeUInt16LE(this.messageId, 0); + this._data.copy(buffer, 2); - return buffer; - } + return buffer; + } - override deserialize(data: Buffer): ServerMessagePayload { - this._assertEnoughData(data, 2); + override deserialize(data: Buffer): ServerMessagePayload { + this._assertEnoughData(data, 2); - this.messageId = data.readUInt16LE(0); - this._data = data.subarray(2); + this.messageId = data.readUInt16LE(0); + this._data = data.subarray(2); - return this; - } + return this; + } - getMessageId(): number { - return this.messageId; - } + getMessageId(): number { + return this.messageId; + } - setMessageId(messageId: number): ServerMessagePayload { - this.messageId = messageId; - return this; - } -} - -export class ServerGenericRequest extends ServerMessagePayload { - private _data2: Buffer = Buffer.alloc(4); - - override getByteSize(): number { - return 2 + 4 + 4; - } - - override serialize(): Buffer { - try { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - buffer.writeUInt32LE(this._data.readUInt32LE(0), 2); - buffer.writeUInt32LE(this._data2.readUInt32LE(0), 6); - - return buffer; - } catch (error) { - log.error(`Error serializing ServerGenericRequest: ${error as string}`); - throw error; - } - } - - override deserialize(data: Buffer): ServerGenericRequest { - try { - this._assertEnoughData(data, this.getByteSize()); - - this.messageId = data.readUInt16LE(0); - this._data = data.subarray(2, 6); - this._data2 = data.subarray(6, 10); - - return this; - } catch (error) { - log.error(`Error deserializing ServerGenericRequest: ${error as string}`); - throw error; - } - } - - getData() { - return this._data; - } - - getData2() { - return this._data2; - } - - toString(): string { - return `ServerGenericRequest {messageId: ${this.messageId}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; - } -} - -export class ServerGenericResponse extends ServerMessagePayload { - private _msgReply: number = 0; // 2 bytes - private _result: number = 0; // 4 - private _data2: Buffer = Buffer.alloc(4); - - override getByteSize(): number { - return 2 + 2 + 4 + 4 + 4; - } - - override serialize(): Buffer { - const buffer = Buffer.alloc(this.getByteSize()); - buffer.writeUInt16LE(this.messageId, 0); - buffer.writeUInt16LE(this._msgReply, 2); - buffer.writeUInt32LE(this._result, 4); - buffer.writeUInt32LE(this._data.readUInt32LE(0), 8); - buffer.writeUInt32LE(this._data2.readUInt32LE(0), 12); - - return buffer; - } - - override deserialize(data: Buffer): ServerGenericResponse { - this._assertEnoughData(data, this.getByteSize()); - - this.messageId = data.readUInt16LE(0); - this._msgReply = data.readUInt16LE(2); - this._result = data.readUInt32LE(4); - this._data = data.subarray(2, 6); - this._data = data.subarray(6, 10); - - return this; - } - - getMessageReply(): number { - return this._msgReply; - } - - getResult(): number { - return this._result; - } - - setMsgReply(msgReply: number): ServerGenericResponse { - this._msgReply = msgReply; - return this; - } - - toString(): string { - return `ServerGenericResponse {messageId: ${this.messageId}, msgReply: ${this._msgReply}, result: ${this._result}, data: ${this._data.toString("hex")}, data2: ${this._data2.toString("hex")}}`; - } + setMessageId(messageId: number): ServerMessagePayload { + this.messageId = messageId; + return this; + } } export class ServerMessage extends Serializable implements IMessage { - header: ServerMessageHeader; - data: ServerMessagePayload; - private _preDecryptedMessageId: number = -1; - private _preEncryptedMessageId: number = -1; - - constructor(messageId: number) { - super(); - this.header = new ServerMessageHeader(); - this.data = new ServerMessagePayload().setMessageId(messageId); - } - getDataBuffer(): Buffer { - return this.data.serialize(); - } - setDataBuffer(data: Buffer): ServerMessage { - this.data.deserialize(data); - return this; - } - /** The message length is the length of the message data, not including the id */ - override getByteSize(): number { - return this.header.getByteSize() + this.data.getByteSize(); - } - - populateHeader(seq?: number): ServerMessage { - this.header.setLength( - this.header.getByteSize() + this.data.getByteSize() - 2, - ); - this.header.setSignature("TOMC"); - this.header.setSequence(seq || 0); - - return this; - } - - getData(): ISerializable { - return this.data; - } - setData(data: ServerMessagePayload): ServerMessage { - this.data = data; - return this; - } - override serialize(): Buffer { - try { - if (this.header.getSequence() === 0) { - throw new Error( - "ServerMessage sequence is 0, it must be set to a non-zero value before serializing", - ); - } - - if (!this.header.isValidSignature()) { - throw new Error( - "ServerMessage signature is invalid, it must be set to 'TOMC' before serializing", - ); - } - - if (this.header.getByteSize() === 0) { - throw new Error( - "ServerMessage header byte size is 0, it must be set before serializing", - ); - } - - const buffer = Buffer.alloc(this.getByteSize()); - const headerBuffer = this.header.serialize(); - const dataBuffer = this.getDataBuffer(); - - headerBuffer.copy(buffer); - dataBuffer.copy(buffer, this.header.getDataOffset()); - - return buffer; - } catch (error) { - log.error(`Error serializing ServerMessage: ${error as string}`); - throw error; - } - } - override deserialize(data: Buffer): ServerMessage { - this._assertEnoughData(data, this.header.getByteSize()); - - this.header.deserialize(data); - this.setDataBuffer(data.subarray(this.header.getDataOffset())); - - return this; - } - - isEncrypted() { - return this.header.isPayloadEncrypted(); - } - - decrypt(cipherPair: McosEncryptionPair): ServerMessage { - log.setName("ServerMessage::decrypt"); - if (this.isEncrypted()) { - try { - this._preDecryptedMessageId = this.data.getMessageId(); - log.debug( - `Decrypting ServerMessage with message id ${this.data.getMessageId()}`, - ); - this.setDataBuffer(cipherPair.decrypt(this.getDataBuffer())); - log.debug( - `Decrypted ServerMessage with message id ${this._preDecryptedMessageId}, new message id: ${this.data.getMessageId()}`, - ); - this.header.setPayloadEncryption(false); - } catch (error) { - log.error(`Error decrypting ServerMessage: ${error as string}`); - throw error; - } - } - log.resetName(); - return this; - } - - encrypt(cipherPair: McosEncryptionPair): ServerMessage { - log.setName("ServerMessage::encrypt"); - if (!this.isEncrypted()) { - try { - this._preEncryptedMessageId = this.data.getMessageId(); - log.debug( - `Encrypting ServerMessage with message id ${this.data.getMessageId()}`, - ); - this.setDataBuffer(cipherPair.encrypt(this.getDataBuffer())); - log.debug( - `Encrypted ServerMessage with message id ${this._preEncryptedMessageId}, new message id: ${this.data.getMessageId()}`, - ); - this.header.setPayloadEncryption(true); - } catch (error) { - log.error(`Error encrypting ServerMessage: ${error as string}`); - throw error; - } - } - log.resetName(); - return this; - } - - getId() { - return this.data.getMessageId(); - } - - getSequence() { - return this.header.getSequence(); - } - - toString(): string { - return `ServerMessage {length: ${this.header.getLength()}, id: ${this.data.getMessageId()}}`; - } - - getPreDecryptedMessageId() { - return this._preDecryptedMessageId; - } - - getPreEncryptedMessageId() { - return this._preEncryptedMessageId; - } + header: ServerMessageHeader; + data: ServerMessagePayload; + + constructor(messageId: number) { + super(); + this.header = new ServerMessageHeader(); + this.data = new ServerMessagePayload().setMessageId(messageId); + } + getDataBuffer(): Buffer { + return this.data.serialize(); + } + setDataBuffer(data: Buffer): ServerMessage { + this.data.deserialize(data); + return this; + } + /** The message length is the length of the message data, not including the id */ + override getByteSize(): number { + return this.header.getByteSize() + this.data.getByteSize(); + } + + override serialize(): Buffer { + try { + if (this.header.getSequence() === 0) { + throw new Error( + "ServerMessage sequence is 0, it must be set to a non-zero value before serializing", + ); + } + + if (!this.header.isValidSignature()) { + throw new Error( + "ServerMessage signature is invalid, it must be set to 'TOMC' before serializing", + ); + } + + if (this.header.getByteSize() === 0) { + throw new Error( + "ServerMessage header byte size is 0, it must be set before serializing", + ); + } + + const buffer = Buffer.alloc(this.getByteSize()); + const headerBuffer = this.header.serialize(); + const dataBuffer = this.getDataBuffer(); + + headerBuffer.copy(buffer); + dataBuffer.copy(buffer, this.header.getDataOffset()); + + return buffer; + } catch (error) { + log.error(`Error serializing ServerMessage: ${error as string}`); + throw error; + } + } + override deserialize(data: Buffer): ServerMessage { + this._assertEnoughData(data, this.header.getByteSize()); + + this.header.deserialize(data); + this.setDataBuffer(data.subarray(this.header.getDataOffset())); + + return this; + } + + override toString(): string { + return `ServerMessage {length: ${this.header.getLength()}, id: ${this.data.getMessageId()}}`; + } } diff --git a/packages/shared-packets/src/interfaces.ts b/packages/shared-packets/src/interfaces.ts index 43c4a0a29..b53cf643b 100644 --- a/packages/shared-packets/src/interfaces.ts +++ b/packages/shared-packets/src/interfaces.ts @@ -8,8 +8,6 @@ export interface ISerializable { export interface IMessage extends ISerializable { header: ISerializable; - getData(): ISerializable; getDataBuffer(): Buffer; - setData(data: ISerializable): void; setDataBuffer(data: Buffer): void; } From 7525cead9a0753b4a48e2f7b32a54ff85ad9b49f Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 12:51:05 -0400 Subject: [PATCH 76/84] refactor: Update socket data handler to include local port in log message --- packages/gateway/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 4828c3155..156229d3e 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -153,8 +153,8 @@ export function onSocketConnection({ // Add the data handler to the socket incomingSocket.on( "data", - (/** @type {Buffer} */ incomingDataAsBuffer: Buffer) => { - log.trace(`Incoming data: ${incomingDataAsBuffer.toString("hex")}`); + function socketDataHandler(incomingDataAsBuffer: Buffer) { + log.trace(`Incoming data on port ${localPort}: ${incomingDataAsBuffer.toString("hex")}`); // Deserialize the raw message const rawMessage = new SerializedBufferOld()._doDeserialize( From 7824fbcf6422d95529b5c5519a4770a3178cfcfc Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 12:51:50 -0400 Subject: [PATCH 77/84] refactor: Update validatePersonaName function to include response codes This commit updates the validatePersonaName function in the persona package. It adds an enum for response codes and replaces the hard-coded response code with the corresponding enum value. This change improves the readability and maintainability of the code by using descriptive names for response codes. start works, lobby loads, persona is dupe --- .../src/handlers/validatePersonaName.ts | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/persona/src/handlers/validatePersonaName.ts b/packages/persona/src/handlers/validatePersonaName.ts index 76f2f9bec..48f311fe0 100644 --- a/packages/persona/src/handlers/validatePersonaName.ts +++ b/packages/persona/src/handlers/validatePersonaName.ts @@ -21,19 +21,23 @@ export async function validatePersonaName({ connectionId: string; messages: SerializedBufferOld[]; }> { - log.debug("_npsLogoutGameUser..."); + log.debug("validatePersonaName called"); const requestPacket = message; log.debug( - `NPSMsg request object from _npsLogoutGameUser', - ${JSON.stringify({ - NPSMsg: requestPacket.toString(), - })}`, + `NPSMsg request object from validatePersonaName ${requestPacket.toString()}`, ); + enum responseCodes { + NPS_DUP_USER = 0x20a, + NPS_USER_VALID = 0x601, + } + + + // Build the packet - const responsePacket = new RawMessage(522); // 0x020a - NPS_DUP_USER + const responsePacket = new RawMessage(responseCodes.NPS_DUP_USER); log.debug( - `NPSMsg response object from _npsLogoutGameUser', + `NPSMsg response object from validatePersonaName ${JSON.stringify({ NPSMsg: responsePacket.toString(), })}`, From 116996186ad184301f01882ac6553f04cc7b2e7a Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 13:40:59 -0400 Subject: [PATCH 78/84] refactor: update calls to log from nps, shart cutover to nps module from gateway started, lobby loads, new toon dupe --- package.json | 2 +- packages/gateway/src/GatewayServer.ts | 4 + packages/gateway/src/index.ts | 93 +++++++---- .../getLobMiniRiffList.ts | 4 +- .../getLobMiniUserList.ts | 4 +- .../processCheckPlateText.ts | 6 +- .../processCheckProfileName.ts | 5 +- .../processDeleteProfile.ts | 5 +- .../processEncryptedGameCommand.ts | 5 +- .../gameMessageProcessors/processGameLogin.ts | 8 +- .../processGetFirstBuddy.ts | 5 +- packages/nps/messageStructs/NPSList.ts | 34 ++++ packages/nps/messageStructs/SessionKey.ts | 16 +- packages/nps/messageStructs/UserAction.ts | 2 +- packages/shared/src/log.ts | 150 +++++++++--------- pnpm-lock.yaml | 41 +---- 16 files changed, 205 insertions(+), 179 deletions(-) create mode 100644 packages/nps/messageStructs/NPSList.ts diff --git a/package.json b/package.json index c5e3b0a28..6f96b87e9 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "fastify": "^4.25.1", "lobby": "link:packages/lobby", "moment": "^2.29.4", - "pino": "^8.17.1", + "pino": "^9.3.2", "rusty-motors-cli": "link:packages/cli", "rusty-motors-database": "link:packages/database", "rusty-motors-gateway": "link:packages/gateway", diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 01949cada..31e613860 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -17,6 +17,7 @@ import { getServerLogger } from "rusty-motors-shared"; import { receiveTransactionsData } from "rusty-motors-transactions"; import { onSocketConnection } from "./index.js"; import { addWebRoutes } from "./web.js"; +import { populateGameMessageProcessors, populatePortToMessageTypes, portToMessageTypes, gameMessageProcessors } from "rusty-motors-nps"; /** * Options for the GatewayServer. @@ -255,6 +256,9 @@ export class Gateway { state.save(); + populatePortToMessageTypes(portToMessageTypes); + populateGameMessageProcessors(gameMessageProcessors); + this.log.debug("GatewayServer initialized"); } diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 156229d3e..82fb623db 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -31,6 +31,7 @@ import { getServerLogger } from "rusty-motors-shared"; import { Socket } from "node:net"; import type { Logger } from "pino"; import { getGatewayServer } from "./GatewayServer.js"; +import { getPortMessageType, UserStatusManager } from "rusty-motors-nps"; /** * @typedef {object} OnDataHandlerArgs @@ -132,6 +133,42 @@ export function onSocketConnection({ // Add the socket to the global state addSocket(fetchStateFromDatabase(), wrappedSocket).save(); + // ======================= + // Handle incoming socket in shadow mode + // ======================= + + try { + // Get expected message type + const messageType = getPortMessageType(localPort); + log.debug(`[${newConnectionId}] Expected message type: ${messageType}`); + + switch (messageType) { + case "Game": { + // Handle game messages + // Create a new user status + const userStatus = UserStatusManager.newUserStatus(); + log.debug(`[${newConnectionId}] Created new user status`); + + UserStatusManager.addUserStatus(userStatus); + log.debug(`[${newConnectionId}] Added user status to manager`); + + break; + } + + case "Server": { + // Handle server messages + break; + } + + default: { + log.warn(`[${newConnectionId}] No message type found`); + break; + } + } + } catch (error) { + log.error(`[${newConnectionId}] Error handling socket: ${error}`); + } + // This is a new TCP socket, so it's probably not using HTTP // Let's look for a port onData handler /** @type {OnDataHandler | undefined} */ @@ -154,7 +191,11 @@ export function onSocketConnection({ incomingSocket.on( "data", function socketDataHandler(incomingDataAsBuffer: Buffer) { - log.trace(`Incoming data on port ${localPort}: ${incomingDataAsBuffer.toString("hex")}`); + log.trace( + `Incoming data on port ${localPort}: ${incomingDataAsBuffer.toString( + "hex", + )}`, + ); // Deserialize the raw message const rawMessage = new SerializedBufferOld()._doDeserialize( @@ -170,34 +211,28 @@ export function onSocketConnection({ connectionId: newConnectionId, message: rawMessage, }) - .then( - ( - response: ServiceResponse, - ) => { - log.debug("onData handler returned"); - const { messages } = response; - - // Log the messages - log.trace( - `Messages: ${messages.map((m) => m.toString())}`, - ); - - // Serialize the messages - const serializedMessages = messages.map((m) => - m.serialize(), - ); - - try { - // Send the messages - serializedMessages.forEach((m) => { - incomingSocket.write(m); - log.trace(`Sent data: ${m.toString("hex")}`); - }); - } catch (error) { - log.error(`Error sending data: ${String(error)}`); - } - }, - ) + .then((response: ServiceResponse) => { + log.debug("onData handler returned"); + const { messages } = response; + + // Log the messages + log.trace(`Messages: ${messages.map((m) => m.toString())}`); + + // Serialize the messages + const serializedMessages = messages.map((m) => + m.serialize(), + ); + + try { + // Send the messages + serializedMessages.forEach((m) => { + incomingSocket.write(m); + log.trace(`Sent data: ${m.toString("hex")}`); + }); + } catch (error) { + log.error(`Error sending data: ${String(error)}`); + } + }) .catch((/** @type {Error} */ error: Error) => { log.error(`Error handling data: ${String(error)}`); diff --git a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts index e77cda129..f82f058a9 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniRiffList.ts @@ -6,14 +6,14 @@ import { } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; -const log = getServerLogger(); +const log = getServerLogger({}); // Command id: 0x30c export async function getLobMiniRiffList( commandId: number, data: Buffer, ): Promise { - log.setName("nps:getLobMiniRiffList"); + log.debug("getLobMiniRiffList called"); log.info(`Processing getLobMiniRiffList command: ${getAsHex(data)}`); const riffList = new MiniRiffList(); diff --git a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts index d1962707f..25c24072d 100644 --- a/packages/nps/gameMessageProcessors/getLobMiniUserList.ts +++ b/packages/nps/gameMessageProcessors/getLobMiniUserList.ts @@ -6,14 +6,14 @@ import { } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; -const log = getServerLogger(); +const log = getServerLogger({}); // Command id: 0x128 export async function getLobMiniUserList( commandId: number, data: Buffer, ): Promise { - log.setName("nps:getLobMiniUserList"); + log.debug("getLobMiniUserList called"); log.info(`Processing getLobMiniUserList command: ${getAsHex(data)}`); const miniUserList = new MiniUserList(0); diff --git a/packages/nps/gameMessageProcessors/processCheckPlateText.ts b/packages/nps/gameMessageProcessors/processCheckPlateText.ts index 74a723387..6369d9f0a 100644 --- a/packages/nps/gameMessageProcessors/processCheckPlateText.ts +++ b/packages/nps/gameMessageProcessors/processCheckPlateText.ts @@ -5,7 +5,7 @@ import { getLenString } from "../src/utils/pureGet.js"; import { sendNPSAck } from "../src/utils/sendNPSAck.js"; import type { GameSocketCallback } from "./index.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function processCheckPlateText( connectionId: string, @@ -13,8 +13,7 @@ export async function processCheckPlateText( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processCheckPlateText"); - + log.info("processCheckPlateText called"); const plateType = message.getDataAsBuffer().readUInt32BE(0); const requestedPlateText = getLenString(message.getDataAsBuffer(), 4, false); @@ -24,6 +23,5 @@ export async function processCheckPlateText( ); sendNPSAck(socketCallback); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processCheckProfileName.ts b/packages/nps/gameMessageProcessors/processCheckProfileName.ts index 116d78d37..da7b9a36d 100644 --- a/packages/nps/gameMessageProcessors/processCheckProfileName.ts +++ b/packages/nps/gameMessageProcessors/processCheckProfileName.ts @@ -5,7 +5,7 @@ import type { GameSocketCallback } from "./index.js"; import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function processCheckProfileName( connectionId: string, @@ -13,7 +13,7 @@ export async function processCheckProfileName( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processCheckProfileName"); + log.info("processCheckProfileName called"); const customerId = message.serialize().readUInt32BE(8); const requestedPersonaName = getLenString(message.serialize(), 12, false); @@ -28,6 +28,5 @@ export async function processCheckProfileName( const responseBytes = response.serialize(); socketCallback([responseBytes]); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processDeleteProfile.ts b/packages/nps/gameMessageProcessors/processDeleteProfile.ts index 8f819fa48..5e6a42e68 100644 --- a/packages/nps/gameMessageProcessors/processDeleteProfile.ts +++ b/packages/nps/gameMessageProcessors/processDeleteProfile.ts @@ -8,7 +8,7 @@ import type { GameSocketCallback } from "./index.js"; import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export function loadPrivateKey(path: string): string { const privateKey = fs.readFileSync(path); @@ -92,7 +92,7 @@ export async function processDeleteProfile( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processDeleteProfile"); + log.debug("processDeleteProfile called"); // Log the message log.info(`Delete profile request: ${message.toString()}`); @@ -104,6 +104,5 @@ export async function processDeleteProfile( // Send the ack socketCallback([loginACK.serialize()]); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts index ccccfb0bb..e08d125d6 100644 --- a/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts +++ b/packages/nps/gameMessageProcessors/processEncryptedGameCommand.ts @@ -15,7 +15,7 @@ import { lobbyCommandMap } from "./lobbyCommands.js"; import { getServerLogger } from "rusty-motors-shared"; import type { UserStatus } from "../messageStructs/UserStatus.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function processEncryptedGameCommand( connectionId: string, @@ -23,7 +23,7 @@ export async function processEncryptedGameCommand( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processEncryptedGameCommand"); + log.debug("processEncryptedGameCommand called"); log.info(`Attempting to decrypt message: ${message.toString()}`); // Get the encryption session @@ -109,6 +109,5 @@ export async function processEncryptedGameCommand( const responseBytes = responsePacket.serialize(); socketCallback([responseBytes]); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGameLogin.ts b/packages/nps/gameMessageProcessors/processGameLogin.ts index 5ea562915..9a533eeca 100644 --- a/packages/nps/gameMessageProcessors/processGameLogin.ts +++ b/packages/nps/gameMessageProcessors/processGameLogin.ts @@ -11,7 +11,7 @@ import { getAsHex, getLenString } from "../src/utils/pureGet.js"; import type { ISerializable } from "../types.js"; import type { GameSocketCallback } from "./index.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export function loadPrivateKey(path: string): string { const privateKey = fs.readFileSync(path); @@ -36,7 +36,7 @@ export function unpackUserLoginMessage(message: ISerializable): { gameId: string; contextToken: string; } { - log.setName("nps:unpackUserLoginMessage"); + log.debug("unpackUserLoginMessage called"); log.info(`Unpacking user login message: ${getAsHex(message.serialize())}`); // Get the context token @@ -90,7 +90,6 @@ export function unpackUserLoginMessage(message: ISerializable): { // Update the data offset dataOffset += 2 + nextDataLength2; - log.resetName(); // Return the session key, game id, and context token return { @@ -115,7 +114,7 @@ export async function processGameLogin( op: "processLogin", }, () => { - log.setName("nps:processLogin"); + log.debug("processGameLogin called"); log.info(`Login: ${message.toString()}`); @@ -206,6 +205,5 @@ export async function processGameLogin( } }, ); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts index fd435c9af..0e75b0c73 100644 --- a/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts +++ b/packages/nps/gameMessageProcessors/processGetFirstBuddy.ts @@ -10,7 +10,7 @@ import type { GameSocketCallback } from "./index.js"; import type { UserStatus } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function processFirstBuddy( connectionId: string, @@ -18,7 +18,7 @@ export async function processFirstBuddy( message: GameMessage, socketCallback: GameSocketCallback, ): Promise { - log.setName("nps:processFirstBuddy"); + log.info("processFirstBuddy called"); const profileId = getDWord(message.getDataAsBuffer(), 0, false); log.info(`GetFirstBuddy profile: ${profileId}`); @@ -39,6 +39,5 @@ export async function processFirstBuddy( log.info("==========================================="); socketCallback([outMessage.serialize()]); - log.resetName(); return Promise.resolve(); } diff --git a/packages/nps/messageStructs/NPSList.ts b/packages/nps/messageStructs/NPSList.ts new file mode 100644 index 000000000..91e7f1bd3 --- /dev/null +++ b/packages/nps/messageStructs/NPSList.ts @@ -0,0 +1,34 @@ +import type { ISerializable, IMessage } from "../types.ts"; + +export class NPSList implements ISerializable { + serialize(): Buffer { + throw new Error("Method not implemented."); + } + deserialize(_data: Buffer): void { + throw new Error("Method not implemented."); + } + getByteSize(): number { + throw new Error("Method not implemented."); + } + private list: IMessage[] = []; + + toBytes(): Buffer { + throw new Error("Method not implemented."); + } + toString(): string { + throw new Error("Method not implemented."); + } + toHex(): string { + throw new Error("Method not implemented."); + } + setData(_data: Buffer): void { + throw new Error("Method not implemented."); + } + getData(): Buffer { + throw new Error("Method not implemented."); + } + + getSize(): number { + return 0; + } +} \ No newline at end of file diff --git a/packages/nps/messageStructs/SessionKey.ts b/packages/nps/messageStructs/SessionKey.ts index c1b1a2298..c1e3d018a 100644 --- a/packages/nps/messageStructs/SessionKey.ts +++ b/packages/nps/messageStructs/SessionKey.ts @@ -2,7 +2,7 @@ import { getAsHex, isOnlyOneSet } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; import { BaseSerializable } from "./BaseSerializable.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export class SessionKey extends BaseSerializable { private key: Buffer = Buffer.alloc(0); @@ -11,7 +11,7 @@ export class SessionKey extends BaseSerializable { constructor({ key, timestamp }: { key?: Buffer; timestamp?: number }) { super(); - log.setName("SessionKey"); + log.debug("SessionKey.constructor"); if (isOnlyOneSet(key, timestamp)) { throw new Error("Both key and timestamp must be set if one is set"); } @@ -22,20 +22,19 @@ export class SessionKey extends BaseSerializable { this.timestamp = timestamp; this._isSet = true; } - log.resetName(); } - serialize(): Buffer { + override serialize(): Buffer { return this.toBytes(); } - deserialize(data: Buffer): void { + override deserialize(data: Buffer): void { SessionKey.fromBytes(data); } - getByteSize(): number { + override getByteSize(): number { throw new Error("Method not implemented."); } static fromBytes(bytes: Buffer): SessionKey { - log.setName("SessionKey.fromBytes"); + log.debug("SessionKey.fromBytes"); const keyLength = bytes.readUInt16BE(0); // Set the data offset @@ -48,7 +47,6 @@ export class SessionKey extends BaseSerializable { // Get the timestamp const timestamp = bytes.readUInt32BE(dataOffset); - log.resetName(); return new SessionKey({ key, @@ -69,7 +67,7 @@ export class SessionKey extends BaseSerializable { return this.key.toString("hex"); } - toString(): string { + override toString(): string { return `SessionKey(key=${this.getKey()}, timestamp=${this.timestamp})`; } diff --git a/packages/nps/messageStructs/UserAction.ts b/packages/nps/messageStructs/UserAction.ts index 19723c520..67b1de4da 100644 --- a/packages/nps/messageStructs/UserAction.ts +++ b/packages/nps/messageStructs/UserAction.ts @@ -2,7 +2,7 @@ import type { ISerializable } from "rusty-motors-nps"; import { getAsHex } from "rusty-motors-nps"; import { getServerLogger } from "rusty-motors-shared"; -const log = getServerLogger(); +const log = getServerLogger({}); export class UserAction implements ISerializable { private name: string; diff --git a/packages/shared/src/log.ts b/packages/shared/src/log.ts index 82653ab8f..a70430338 100644 --- a/packages/shared/src/log.ts +++ b/packages/shared/src/log.ts @@ -1,9 +1,9 @@ import { type Logger, type LoggerOptions, pino } from "pino"; type ServerLoggerOptions = { - level?: string; - module?: string; - name?: string; + level?: string; + module?: string; + name?: string; }; /** @@ -11,74 +11,74 @@ type ServerLoggerOptions = { * @property {ServerLogger} instance */ export class ServerLogger { - logger: any; - static instance: ServerLogger | undefined; - /** - * Creates an instance of ServerLogger. - * @param {ServerLoggerOptions} options - */ - constructor(options: ServerLoggerOptions) { - this.logger = pino(options); - this.logger.level = options.level ?? "info"; - ServerLogger.instance = this; - } + logger: Logger; + static instance: ServerLogger | undefined; + /** + * Creates an instance of ServerLogger. + * @param {ServerLoggerOptions} options + */ + constructor(options: ServerLoggerOptions) { + this.logger = pino(options); + this.logger.level = options.level ?? "info"; + ServerLogger.instance = this; + } - /** - * @param {string} message - */ - fatal(message: string) { - this.logger.fatal(message); - } + /** + * @param {string} message + */ + fatal(message: string) { + this.logger.fatal(message); + } - /** - * @param {string} message - */ - error(message: string) { - this.logger.error(message); - } + /** + * @param {string} message + */ + error(message: string) { + this.logger.error(message); + } - /** - * @param {string} message - */ - warn(message: string) { - this.logger.warn(message); - } + /** + * @param {string} message + */ + warn(message: string) { + this.logger.warn(message); + } - /** - * @param {string} message - */ - info(message: string) { - this.logger.info(message); - } + /** + * @param {string} message + */ + info(message: string) { + this.logger.info(message); + } - /** - * @param {string} message - */ - debug(message: string) { - this.logger.debug(message); - } + /** + * @param {string} message + */ + debug(message: string) { + this.logger.debug(message); + } - /** - * @param {string} message - */ - trace(message: string) { - this.logger.trace(message); - } + /** + * @param {string} message + */ + trace(message: string) { + this.logger.trace(message); + } - /** - * @global - * @external pino - * @see {@link https://www.npmjs.com/package/pino} - */ + /** + * @global + * @external pino + * @see {@link https://www.npmjs.com/package/pino} + */ - /** - * @param {module:pino.LoggerOptions} options - * @returns {module:pino.Logger} - */ - child(options: LoggerOptions): Logger { - const child = this.logger.child(options); - return child; - } + /** + * @param {module:pino.LoggerOptions} _options + * @returns {module:pino.Logger} + */ + child(_options: LoggerOptions): Logger { + const child = this.logger; + return child; + } } /** @@ -88,17 +88,17 @@ export class ServerLogger { * @return {module:pino.Logger} */ export function getServerLogger(options: ServerLoggerOptions): Logger { - const logLevel = options.level ?? "info"; - const moduleName = options.module ?? "core"; - if (typeof ServerLogger.instance === "undefined") { - ServerLogger.instance = new ServerLogger({ - name: "mcos", - level: logLevel, // This isn't used by the logger, but it's used by the constructor - module: moduleName, - }); - } + const logLevel = options && options.level ? options.level : "info"; + const moduleName = options && options.module ? options.module : "unknown"; + if (typeof ServerLogger.instance === "undefined") { + ServerLogger.instance = new ServerLogger({ + name: "mcos", + level: logLevel, // This isn't used by the logger, but it's used by the constructor + module: moduleName, + }); + } - const child = ServerLogger.instance.child(options); - child.level = logLevel; - return child; + const child = ServerLogger.instance.child(options); + child.level = logLevel; + return child; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9e4f71bbb..7ea753d78 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: ^2.29.4 version: 2.30.1 pino: - specifier: ^8.17.1 - version: 8.21.0 + specifier: ^9.3.2 + version: 9.3.2 rusty-motors-cli: specifier: link:packages/cli version: link:packages/cli @@ -4601,16 +4601,9 @@ packages: resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} hasBin: true - pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - pino-std-serializers@7.0.0: resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - pino@8.21.0: - resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} - hasBin: true - pino@9.3.2: resolution: {integrity: sha512-WtARBjgZ7LNEkrGWxMBN/jvlFiE17LTbBoH0konmBU684Kd0uIiDwBXlcTCW7iJnA6HfIKwUssS/2AC6cDEanw==} hasBin: true @@ -5238,9 +5231,6 @@ packages: resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} engines: {node: '>=18'} - sonic-boom@3.8.1: - resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} - sonic-boom@4.0.1: resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} @@ -5421,9 +5411,6 @@ packages: thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - thread-stream@2.7.0: - resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} - thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -10576,24 +10563,8 @@ snapshots: sonic-boom: 4.0.1 strip-json-comments: 3.1.1 - pino-std-serializers@6.2.2: {} - pino-std-serializers@7.0.0: {} - pino@8.21.0: - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.5.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.2.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.1 - thread-stream: 2.7.0 - pino@9.3.2: dependencies: atomic-sleep: 1.0.0 @@ -11269,10 +11240,6 @@ snapshots: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - sonic-boom@3.8.1: - dependencies: - atomic-sleep: 1.0.0 - sonic-boom@4.0.1: dependencies: atomic-sleep: 1.0.0 @@ -11480,10 +11447,6 @@ snapshots: dependencies: any-promise: 1.3.0 - thread-stream@2.7.0: - dependencies: - real-require: 0.2.0 - thread-stream@3.1.0: dependencies: real-require: 0.2.0 From 524bb6263142bad0281c05156fc57a8fba001d2e Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 13:55:14 -0400 Subject: [PATCH 79/84] refactor: Update import paths for shared modules in gateway, lobby, and login packages --- packages/gateway/src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/gateway/src/index.ts b/packages/gateway/src/index.ts index 82fb623db..a2d65e9b7 100644 --- a/packages/gateway/src/index.ts +++ b/packages/gateway/src/index.ts @@ -92,7 +92,7 @@ export function socketEndHandler({ }), }: { connectionId: string; - log?: import("pino").Logger; + log?: Logger; }) { log.debug(`Connection ${connectionId} ended`); @@ -104,8 +104,8 @@ export function socketEndHandler({ * Handle incoming TCP connections * * @param {object} options - * @param {module:net.Socket} options.incomingSocket The incoming socket - * @param {import("pino").Logger} [options.log=getServerLogger({ module: "onDataHandler" })] The logger to use + * @param {Socket} options.incomingSocket The incoming socket + * @param {Logger} [options.log=getServerLogger({ module: "onDataHandler" })] The logger to use * */ export function onSocketConnection({ @@ -115,7 +115,7 @@ export function onSocketConnection({ }), }: { incomingSocket: Socket; - log?: import("pino").Logger; + log?: Logger; }) { // Get the local port and remote address const { localPort, remoteAddress } = incomingSocket; From 159b0ea90ddbb9dd560049886e9168b93ebbddd2 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 13:55:46 -0400 Subject: [PATCH 80/84] refactor: Update user status handling in game login This commit refactors the `processGameLogin` function in the `gameMessageProcessors` module. It removes the creation of a new `UserStatus` message and instead updates the existing `userStatus` object with the customer ID, persona ID, and ban information. This change improves the efficiency and readability of the code by eliminating unnecessary object creation. start works, lobby loads, new toon dupe --- packages/nps/gameMessageProcessors/processGameLogin.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/nps/gameMessageProcessors/processGameLogin.ts b/packages/nps/gameMessageProcessors/processGameLogin.ts index 9a533eeca..701c51814 100644 --- a/packages/nps/gameMessageProcessors/processGameLogin.ts +++ b/packages/nps/gameMessageProcessors/processGameLogin.ts @@ -174,8 +174,7 @@ export async function processGameLogin( // Send the ack socketCallback([loginACK.serialize()]); - // Create a new UserStatus message - const userStatus = UserStatus.new(); + // Update the user status userStatus.setCustomerId(user.customerId); userStatus.setPersonaId(0); userStatus.ban.set({ @@ -185,7 +184,6 @@ export async function processGameLogin( userStatus.setSessionKey(SessionKey.fromKeyString(sessionKey)); UserStatusManager.addUserStatus(userStatus); - // Create a new message - UserStatus const userStatusMessage = new GameMessage(257); userStatusMessage.header.setId(0x601); From f0192c3a974196e5f1a2b34fe1d1524377480567 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 14:09:22 -0400 Subject: [PATCH 81/84] refactor: Update import paths for shared modules in connection, gateway, lobby, login, and mcots packages states, lobby loads, new toon dupe --- package.json | 2 + packages/connection/index.ts | 7 + packages/connection/package.json | 28 ++ packages/connection/src/Connection.ts | 369 ++++++++++++++++++ packages/connection/test/Connection.test.ts | 72 ++++ packages/connection/tsconfig.json | 11 + packages/connection/vite.config.ts | 22 ++ packages/gateway/src/GatewayServer.ts | 1 + packages/mcots/index.ts | 10 +- packages/mcots/messageProcessors/index.ts | 39 -- .../{ => src}/ClientConnectionManager.ts | 0 packages/mcots/{ => src}/errors/ErrorNoKey.ts | 0 packages/mcots/src/messageProcessors/index.ts | 60 +++ .../messageProcessors/processClientConnect.ts | 0 .../processClientTracking.ts | 0 .../messageProcessors/processServerLogin.ts | 0 .../messageProcessors/processSetOptions.ts | 0 .../messageProcessors/processStockCarInfo.ts | 0 .../messageProcessors/sendSuccess.ts | 0 .../payloads/ClientConnectMessage.test.ts | 0 .../payloads/ClientConnectMessage.ts | 0 .../payloads/ClientTrackingMessage.ts | 0 .../payloads/LoginCompleteMessage.ts | 0 .../mcots/{ => src}/payloads/LoginMessage.ts | 0 .../{ => src}/payloads/SetOptionsMessage.ts | 0 packages/mcots/{ => src}/payloads/StockCar.ts | 0 packages/mcots/{ => src}/payloads/index.ts | 0 .../mcots/{ => src}/payloads/utils.test.ts | 0 packages/mcots/{ => src}/payloads/utils.ts | 0 packages/mcots/{ => src}/types.ts | 0 packages/mcots/test/ErrorNoKey.test.ts | 2 +- pnpm-lock.yaml | 275 +++++++++++++ 32 files changed, 853 insertions(+), 45 deletions(-) create mode 100644 packages/connection/index.ts create mode 100644 packages/connection/package.json create mode 100644 packages/connection/src/Connection.ts create mode 100644 packages/connection/test/Connection.test.ts create mode 100644 packages/connection/tsconfig.json create mode 100644 packages/connection/vite.config.ts delete mode 100644 packages/mcots/messageProcessors/index.ts rename packages/mcots/{ => src}/ClientConnectionManager.ts (100%) rename packages/mcots/{ => src}/errors/ErrorNoKey.ts (100%) create mode 100644 packages/mcots/src/messageProcessors/index.ts rename packages/mcots/{ => src}/messageProcessors/processClientConnect.ts (100%) rename packages/mcots/{ => src}/messageProcessors/processClientTracking.ts (100%) rename packages/mcots/{ => src}/messageProcessors/processServerLogin.ts (100%) rename packages/mcots/{ => src}/messageProcessors/processSetOptions.ts (100%) rename packages/mcots/{ => src}/messageProcessors/processStockCarInfo.ts (100%) rename packages/mcots/{ => src}/messageProcessors/sendSuccess.ts (100%) rename packages/mcots/{ => src}/payloads/ClientConnectMessage.test.ts (100%) rename packages/mcots/{ => src}/payloads/ClientConnectMessage.ts (100%) rename packages/mcots/{ => src}/payloads/ClientTrackingMessage.ts (100%) rename packages/mcots/{ => src}/payloads/LoginCompleteMessage.ts (100%) rename packages/mcots/{ => src}/payloads/LoginMessage.ts (100%) rename packages/mcots/{ => src}/payloads/SetOptionsMessage.ts (100%) rename packages/mcots/{ => src}/payloads/StockCar.ts (100%) rename packages/mcots/{ => src}/payloads/index.ts (100%) rename packages/mcots/{ => src}/payloads/utils.test.ts (100%) rename packages/mcots/{ => src}/payloads/utils.ts (100%) rename packages/mcots/{ => src}/types.ts (100%) diff --git a/package.json b/package.json index 6f96b87e9..96a805b57 100644 --- a/package.json +++ b/package.json @@ -40,10 +40,12 @@ "moment": "^2.29.4", "pino": "^9.3.2", "rusty-motors-cli": "link:packages/cli", + "rusty-motors-connection": "link:packages/connection", "rusty-motors-database": "link:packages/database", "rusty-motors-gateway": "link:packages/gateway", "rusty-motors-lobby": "link:packages/lobby", "rusty-motors-login": "link:packages/login", + "rusty-motors-mcots": "link:packages/mcots", "rusty-motors-nps": "link:packages/nps", "rusty-motors-shared": "link:packages/shared", "rusty-motors-shared-packets": "link:packages/shared-packets", diff --git a/packages/connection/index.ts b/packages/connection/index.ts new file mode 100644 index 000000000..0e82a9d53 --- /dev/null +++ b/packages/connection/index.ts @@ -0,0 +1,7 @@ +export { + Connection, + createCommandEncryptionPair, + createDataEncryptionPair, + handleServerSocketError, + verifyLegacyCipherSupport, +} from './src/Connection.js'; diff --git a/packages/connection/package.json b/packages/connection/package.json new file mode 100644 index 000000000..6518bd1d3 --- /dev/null +++ b/packages/connection/package.json @@ -0,0 +1,28 @@ +{ + "name": "rusty-motors-connection", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "vitest": "^1.6.0" + }, + "directories": { + "test": "test" + }, + "description": "" +} diff --git a/packages/connection/src/Connection.ts b/packages/connection/src/Connection.ts new file mode 100644 index 000000000..eff262825 --- /dev/null +++ b/packages/connection/src/Connection.ts @@ -0,0 +1,369 @@ +// mcos is a game server, written from scratch, for an old game +// Copyright (C) <2017> +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published +// by the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +import type { Socket } from "node:net"; +import { ServerMessage } from "rusty-motors-shared-packets"; +import { getServerMessageProcessor } from "rusty-motors-mcots"; +import type { TServerLogger } from "rusty-motors-shared"; +import * as Sentry from "@sentry/node"; +import { db } from "rusty-motors-database"; +import { createCipheriv, createDecipheriv, getCiphers } from "node:crypto"; +import { McosEncryptionPair } from "rusty-motors-shared"; +import { ClientConnectionManager } from "rusty-motors-mcots"; +import { getServerLogger } from "rusty-motors-shared"; +import { ErrorNoKey } from "rusty-motors-mcots"; + +const log = getServerLogger({}); + +/** + * This function creates a new encryption pair for use with the game server + * + * @param {string} key The key to use for encryption + * @returns {McosEncryptionPair} The encryption pair + */ +export function createCommandEncryptionPair(key: string): McosEncryptionPair { + if (key.length < 16) { + log.error(`Key too short: length ${key.length}, value ${key}`); + throw Error(`Key too short: length ${key.length}, value ${key}`); + } + + const sKey = key.slice(0, 16); + + // Deepcode ignore HardcodedSecret: This uses an empty IV + const desIV = Buffer.alloc(8); + + const gsCipher = createCipheriv("des-cbc", Buffer.from(sKey, "hex"), desIV); + gsCipher.setAutoPadding(false); + + const gsDecipher = createDecipheriv( + "des-cbc", + Buffer.from(sKey, "hex"), + desIV, + ); + gsDecipher.setAutoPadding(false); + + return new McosEncryptionPair(gsCipher, gsDecipher); +} + +/** + * This function creates a new encryption pair for use with the database server + * + * @param {string} key The key to use for encryption + * @returns {McosEncryptionPair} The encryption pair + * @throws Error if the key is too short + */ +export function createDataEncryptionPair(key: string): McosEncryptionPair { + if (key.length === 0) { + log.error(`Key is empty: ${key}`); + throw new ErrorNoKey(`Key is empty: ${key}`); + } + + if (key.length < 16) { + log.error(`Key too short: length ${key.length}, value ${key}`); + throw Error(`Key too short: length ${key.length}, value ${key}`); + } + + const stringKey = Buffer.from(key, "hex"); + + // File deepcode ignore InsecureCipher: RC4 is the encryption algorithum used here, file deepcode ignore HardcodedSecret: A blank IV is used here + const tsCipher = createCipheriv("rc4", stringKey.subarray(0, 16), ""); + const tsDecipher = createDecipheriv("rc4", stringKey.subarray(0, 16), ""); + + return new McosEncryptionPair(tsCipher, tsDecipher); +} + +/** + * This function checks if the server supports the legacy ciphers + * + * @returns void + * @throws Error if the server does not support the legacy ciphers + */ +export function verifyLegacyCipherSupport() { + const cipherList = getCiphers(); + if (!cipherList.includes("des-cbc")) { + throw Error("DES-CBC cipher not available"); + } + if (!cipherList.includes("rc4")) { + throw Error("RC4 cipher not available"); + } +} + +export class Connection { + private _socket: Socket; + private _connectionId: string; + private _logger: TServerLogger; + private _personaId: number | null = null; + private _cipherPair: McosEncryptionPair | null = null; + private _channelSecure: boolean = false; + + getConnectionId() { + return this._connectionId; + } + + constructor(socket: Socket, connectionId: string, logger: TServerLogger) { + this._socket = socket; + this._connectionId = connectionId; + this._logger = logger; + + this._socket.on("data", (data) => this.handleServerSocketData(data)); + this._socket.on("error", (error) => + handleServerSocketError(this, error), + ); + this._socket.on("close", () => this.close()); + + this._logger.debug(`Connection ${this._connectionId} created`); + } + + get id(): string { + return this._connectionId; + } + + isChannelSecure(): boolean { + return this._channelSecure; + } + + setChannelSecure(channelSecure: boolean): void { + if (channelSecure && this._cipherPair === null) { + this._logger.error( + `Tried to set channel secure without a cipher pair for connection ${this._connectionId}`, + ); + throw new Error( + `Tried to set channel secure without a cipher pair for connection ${this._connectionId}`, + ); + } + + this._channelSecure = channelSecure; + log.debug( + `Channel secure set to ${this._channelSecure} for connection ${this._connectionId}`, + ); + } + + private async _getCiperKeyFromDatabase() { + this._logger.setName("Connection:_getCiperKeyFromDatabase"); + if (this._cipherPair !== null) { + return; + } + + if (typeof this._personaId !== "number") { + this._logger.error( + `Tried to get cipher key from database without a persona ID`, + ); + throw new Error( + `Tried to get cipher key from database without a persona ID`, + ); + } + + // Get the cipher key from the database + const session_key = await getDatabase() + .select() + .from(keySchema) + .where(eq(keySchema.userId, this._personaId)) + .then((rows) => { + if (rows.length < 1 || typeof rows[0] === "undefined") { + this._logger.error( + `Error getting cipher key from database for persona ID ${this._personaId}`, + ); + throw new Error( + `Error getting cipher key from database for persona ID ${this._personaId}`, + ); + } + + return rows[0].sessionKey; + }); + + // Set the cipher key + this._cipherPair = createDataEncryptionPair(session_key); + + this._logger.debug( + `Got cipher key from database for persona ID ${this._personaId}`, + ); + + this._logger.resetName(); + } + + setCipherPair(cipherPair: McosEncryptionPair) { + this._cipherPair = cipherPair; + } + + handleServerSocketData(data: Buffer): void { + this._logger.setName("Connection:handleSocketData"); + try { + const message = new ServerMessage(0).deserialize(data); + log.debug( + `Received server message with ID ${message.getId()} for connection ${this._connectionId}`, + ); + this.processServerMessage(message); + } catch (error) { + this._logger.error( + `Error handling socket data for connectionId ${this._connectionId}: ${(error as Error).message}`, + ); + Sentry.captureException(error); + } + this._logger.resetName(); + } + + processServerMessage(message: ServerMessage) { + this._logger.setName("Connection:processMessage"); + if (message.isEncrypted() && this._cipherPair === null) { + this._getCiperKeyFromDatabase().catch((error) => { + this._logger.error( + `Error getting cipher key from database for persona ID ${this._personaId}: ${error as string}`, + ); + Sentry.captureException(error); + }); + } + + this._logger.debug(`Raw message header: ${message.header.toString()}`); + this._logger.debug(`Raw message: ${message.toHexString()}`); + + message = this.decryptIfNecessary(message); + + + // Lookup the message processor + const processor = getServerMessageProcessor(message.getId()); + + if (processor === undefined) { + this._logger.error( + `No server message processor found for message ID ${message.getId()}`, + ); + return; + } + + // Process the message + this._logger.debug( + `Processing server message with message ID ${message.getId()}, using processor ${processor.name}`, + ); + processor( + this._connectionId, + message, + this.sendServerMessage.bind(this), + ).catch((error) => { + this._logger.error( + `Error processing message for connectionId ${this._connectionId}: ${error as string}`, + ); + Sentry.captureException(error); + }); + + this._logger.resetName(); + } + + sendServerMessage(messages: ServerMessage[]) { + this._logger.setName("Connection:sendMessage"); + this._logger.debug( + `Sending ${messages.length} messages for connection ${this._connectionId}`, + ); + try { + messages.forEach((message) => { + this._logger.debug( + `Sending server message header: ${message.header.toString()}`, + ); + this._logger.debug(`Server Message: ${message.toHexString()}`); + + message = this.encryptIfNecessary(message); + + if (message.isEncrypted()) { + this._logger.debug( + `Encrypted Message: ${message.toHexString()}`, + ); + } + + this._socket.write(message.serialize()); + if (message.getId() === 0x101) { + this.setChannelSecure(true); + } + }); + } catch (error) { + this._logger.error( + `Error sending server message for connectionId ${this._connectionId}: ${error as string}`, + ); + Sentry.captureException(error); + } + + this._logger.debug( + `Sent ${messages.length} server messages for connection ${this._connectionId}`, + ); + + this._logger.resetName(); + } + encryptIfNecessary(message: ServerMessage): ServerMessage { + this._logger.setName("Connection:encryptIfNecessary"); + if (this._channelSecure && !message.isEncrypted()) { + if (this._cipherPair === null) { + this._logger.error( + `Message should be encrypted but no cipher pair is available for connection ${this._connectionId}`, + ); + throw new Error( + `Message should be encrypted but no cipher pair is available for connection ${this._connectionId}`, + ); + } + message = message.encrypt(this._cipherPair); + message.header.setPayloadEncryption(true); + this._logger.debug( + `Encrypted message: message ID ${message.getId()}, prior messsage ID ${message.getPreDecryptedMessageId()}`, + ); + } + this._logger.resetName(); + return message; + } + + close() { + this._socket.end(() => { + this._logger.debug(`Connection ${this._connectionId} closed`); + this._socket.destroy(); + ClientConnectionManager.removeConnection(this._connectionId); + }); + } + + + decryptIfNecessary(message: ServerMessage): ServerMessage { + this._logger.setName("Connection:decryptIfNecessary"); + if (message.isEncrypted()) { + if (this._cipherPair === null) { + this._logger.error( + `Message is encrypted but no cipher pair is available for connection ${this._connectionId}`, + ); + throw new Error( + `Message is encrypted but no cipher pair is available for connection ${this._connectionId}`, + ); + } + message = message.decrypt(this._cipherPair); + this._logger.debug( + `Decrypted message: message ID ${message.getId()}, prior messsage ID ${message.getPreDecryptedMessageId()}`, + ); + this._logger.debug(`Decrypted message: ${message.toHexString()}`); + } + this._logger.resetName(); + return message; + } + + toString(): string { + return `Connection ${this._connectionId}, persona ID ${this._personaId}, channel secure ${this._channelSecure}`; + } +} + +export function handleServerSocketError(connection: Connection, error: Error) { + log.setName("Connection:handleSocketError"); + if (error.message === "ECONNRESET") { + log.debug(`Connection ${connection.getConnectionId()} reset`); + return; + } + log.error( + `Socket error: ${error.message} on connection ${connection.getConnectionId()}`, + ); + Sentry.captureException(error); + connection.close(); + log.resetName(); +} diff --git a/packages/connection/test/Connection.test.ts b/packages/connection/test/Connection.test.ts new file mode 100644 index 000000000..632f132e3 --- /dev/null +++ b/packages/connection/test/Connection.test.ts @@ -0,0 +1,72 @@ +import { describe, expect, it, vi } from "vitest"; +import { + createCommandEncryptionPair, + verifyLegacyCipherSupport, +} from "rusty-motors-connection"; +import { McosEncryptionPair } from "rusty-motors-shared"; + +vi.mock("@sentry/node", () => ({ + captureException: vi.fn(), +})); + +describe("createCommandEncryptionPair", () => { + it("should create an encryption pair with a valid key", () => { + const validKey = "1234567890abcdef1234567890abcdef"; + const encryptionPair = createCommandEncryptionPair(validKey); + expect(encryptionPair).toBeInstanceOf(McosEncryptionPair); + expect(encryptionPair._cipher).toBeDefined(); + expect(encryptionPair._decipher).toBeDefined(); + }); + it("should throw an error if the key is too short", () => { + const shortKey = "short"; + expect(() => createCommandEncryptionPair(shortKey)).toThrow( + "Key too short: length 5, value short", + ); + }); +}); + +vi.mock("node:crypto", async (importOriginal) => { + return { + ...(await importOriginal()), + getCiphers: vi + .fn() + .mockReturnValueOnce(["rc4"]) + .mockReturnValueOnce(["des-cbc"]) + .mockReturnValueOnce(["rc4", "des-cbc"]), + }; +}); + +vi.mock("node:net", async (importOriginal) => { + return { + ...(await importOriginal()), + Socket: class { + end = vi.fn(); + destroy = vi.fn(); + on = vi.fn((event, callback: () => void) => { + if (event === "error") { + callback(); + } + }); + }, + }; +}); + +describe("verifyLegacyCipherSupport", () => { + it("should throw an error if DES-CBC cipher is not available", () => { + expect(() => verifyLegacyCipherSupport()).toThrowError( + "DES-CBC cipher not available", + ); + }); + + it("should throw an error if RC4 cipher is not available", () => { + expect(verifyLegacyCipherSupport).toThrowError( + "RC4 cipher not available", + ); + }); + + it("should not throw an error if both DES-CBC and RC4 ciphers are available", () => { + expect(verifyLegacyCipherSupport).not.toThrow(); + + vi.resetAllMocks(); + }); +}); diff --git a/packages/connection/tsconfig.json b/packages/connection/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/connection/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/connection/vite.config.ts b/packages/connection/vite.config.ts new file mode 100644 index 000000000..fb851b55a --- /dev/null +++ b/packages/connection/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/packages/gateway/src/GatewayServer.ts b/packages/gateway/src/GatewayServer.ts index 31e613860..0764ff45d 100644 --- a/packages/gateway/src/GatewayServer.ts +++ b/packages/gateway/src/GatewayServer.ts @@ -18,6 +18,7 @@ import { receiveTransactionsData } from "rusty-motors-transactions"; import { onSocketConnection } from "./index.js"; import { addWebRoutes } from "./web.js"; import { populateGameMessageProcessors, populatePortToMessageTypes, portToMessageTypes, gameMessageProcessors } from "rusty-motors-nps"; +import { populateServerMessageProcessors } from "rusty-motors-mcots"; /** * Options for the GatewayServer. diff --git a/packages/mcots/index.ts b/packages/mcots/index.ts index bb44ca9ab..a79b9283c 100644 --- a/packages/mcots/index.ts +++ b/packages/mcots/index.ts @@ -1,10 +1,10 @@ -export { ClientConnectionManager } from "./ClientConnectionManager.js"; -export { ErrorNoKey } from "./errors/ErrorNoKey.js"; +export { ClientConnectionManager } from "./src/ClientConnectionManager.js"; +export { ErrorNoKey } from "./src/errors/ErrorNoKey.js"; export { getServerMessageProcessor, populateServerMessageProcessors, -} from "./messageProcessors/index.js"; -export type { ServerSocketCallback } from "./messageProcessors/index.js"; +} from "./src/messageProcessors/index.js"; +export type { ServerSocketCallback } from "./src/messageProcessors/index.js"; export { ClientConnectionMessage, ClientTrackingMessage, @@ -13,6 +13,6 @@ export { SetOptionsMessage, StockCarInfo, StockCar, -} from "./payloads/index.js"; +} from "./src/payloads/index.js"; // Path: packages/mcots/index.ts diff --git a/packages/mcots/messageProcessors/index.ts b/packages/mcots/messageProcessors/index.ts deleted file mode 100644 index 9eec46af9..000000000 --- a/packages/mcots/messageProcessors/index.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { ServerMessage } from "rusty-motors-shared-packets"; -import { processClientConnect } from "./processClientConnect.js"; -import { processClientTracking } from "./processClientTracking.js"; -import { processServerLogin } from "./processServerLogin.js"; -import { processSetOptions } from "./processSetOptions.js"; -import { processStockCarInfo } from "./processStockCarInfo.js"; - -export type ServerSocketCallback = (messages: ServerMessage[]) => void; - -export type ServerMessageProcessor = ( - connectionId: string, - message: ServerMessage, - socketCallback: ServerSocketCallback, -) => Promise; - -const serverMessageProcessors = new Map([]); - -export function addServerMessageProcessor( - messageId: number, - processor: ServerMessageProcessor, -) { - serverMessageProcessors.set(messageId, processor); -} - -export function populateServerMessageProcessors() { - addServerMessageProcessor(105, processServerLogin); - addServerMessageProcessor(109, processSetOptions); - addServerMessageProcessor(141, processStockCarInfo); - addServerMessageProcessor(440, processClientTracking); - addServerMessageProcessor(438, processClientConnect); -} - -export function getServerMessageProcessor(messageId: number) { - return serverMessageProcessors.get(messageId); -} - -export function getServerMessageProcessors() { - return serverMessageProcessors; -} diff --git a/packages/mcots/ClientConnectionManager.ts b/packages/mcots/src/ClientConnectionManager.ts similarity index 100% rename from packages/mcots/ClientConnectionManager.ts rename to packages/mcots/src/ClientConnectionManager.ts diff --git a/packages/mcots/errors/ErrorNoKey.ts b/packages/mcots/src/errors/ErrorNoKey.ts similarity index 100% rename from packages/mcots/errors/ErrorNoKey.ts rename to packages/mcots/src/errors/ErrorNoKey.ts diff --git a/packages/mcots/src/messageProcessors/index.ts b/packages/mcots/src/messageProcessors/index.ts new file mode 100644 index 000000000..586105967 --- /dev/null +++ b/packages/mcots/src/messageProcessors/index.ts @@ -0,0 +1,60 @@ +import type { ServerMessage } from "rusty-motors-shared-packets"; +import { processClientConnect } from "./processClientConnect.js"; +import { processClientTracking } from "./processClientTracking.js"; +import { processServerLogin } from "./processServerLogin.js"; +import { processSetOptions } from "./processSetOptions.js"; +import { processStockCarInfo } from "./processStockCarInfo.js"; + +export type ServerSocketCallback = (messages: ServerMessage[]) => void; + +export type ServerMessageProcessor = ( + connectionId: string, + message: ServerMessage, + socketCallback: ServerSocketCallback, +) => Promise; + +const serverMessageProcessors = new Map([]); + +export function addServerMessageProcessor( + messageId: number, + processor: ServerMessageProcessor, +) { + serverMessageProcessors.set(messageId, processor); +} + +/** + * Populates the server message processors. + * + * This function adds various server message processors to handle different types of messages. + * Each server message processor is associated with a specific message ID and a corresponding processing function. + * + * @remarks + * The server message processors are used to process incoming messages from the server and perform the necessary actions based on the message type. + * + * @example + * // Add server message processors + * populateServerMessageProcessors(); + */ +export function populateServerMessageProcessors() { + addServerMessageProcessor(105, processServerLogin); + addServerMessageProcessor(109, processSetOptions); + addServerMessageProcessor(141, processStockCarInfo); + addServerMessageProcessor(440, processClientTracking); + addServerMessageProcessor(438, processClientConnect); +} + +/** + * Retrieves the server message processor for the given message ID. + * + * @param messageId - The ID of the message. + * @returns The server message processor associated with the given message ID, or `undefined` if no processor is found. + */ +export function getServerMessageProcessor( + messageId: number, +): ServerMessageProcessor | undefined { + return serverMessageProcessors.get(messageId); +} + +export function getServerMessageProcessors() { + return serverMessageProcessors; +} diff --git a/packages/mcots/messageProcessors/processClientConnect.ts b/packages/mcots/src/messageProcessors/processClientConnect.ts similarity index 100% rename from packages/mcots/messageProcessors/processClientConnect.ts rename to packages/mcots/src/messageProcessors/processClientConnect.ts diff --git a/packages/mcots/messageProcessors/processClientTracking.ts b/packages/mcots/src/messageProcessors/processClientTracking.ts similarity index 100% rename from packages/mcots/messageProcessors/processClientTracking.ts rename to packages/mcots/src/messageProcessors/processClientTracking.ts diff --git a/packages/mcots/messageProcessors/processServerLogin.ts b/packages/mcots/src/messageProcessors/processServerLogin.ts similarity index 100% rename from packages/mcots/messageProcessors/processServerLogin.ts rename to packages/mcots/src/messageProcessors/processServerLogin.ts diff --git a/packages/mcots/messageProcessors/processSetOptions.ts b/packages/mcots/src/messageProcessors/processSetOptions.ts similarity index 100% rename from packages/mcots/messageProcessors/processSetOptions.ts rename to packages/mcots/src/messageProcessors/processSetOptions.ts diff --git a/packages/mcots/messageProcessors/processStockCarInfo.ts b/packages/mcots/src/messageProcessors/processStockCarInfo.ts similarity index 100% rename from packages/mcots/messageProcessors/processStockCarInfo.ts rename to packages/mcots/src/messageProcessors/processStockCarInfo.ts diff --git a/packages/mcots/messageProcessors/sendSuccess.ts b/packages/mcots/src/messageProcessors/sendSuccess.ts similarity index 100% rename from packages/mcots/messageProcessors/sendSuccess.ts rename to packages/mcots/src/messageProcessors/sendSuccess.ts diff --git a/packages/mcots/payloads/ClientConnectMessage.test.ts b/packages/mcots/src/payloads/ClientConnectMessage.test.ts similarity index 100% rename from packages/mcots/payloads/ClientConnectMessage.test.ts rename to packages/mcots/src/payloads/ClientConnectMessage.test.ts diff --git a/packages/mcots/payloads/ClientConnectMessage.ts b/packages/mcots/src/payloads/ClientConnectMessage.ts similarity index 100% rename from packages/mcots/payloads/ClientConnectMessage.ts rename to packages/mcots/src/payloads/ClientConnectMessage.ts diff --git a/packages/mcots/payloads/ClientTrackingMessage.ts b/packages/mcots/src/payloads/ClientTrackingMessage.ts similarity index 100% rename from packages/mcots/payloads/ClientTrackingMessage.ts rename to packages/mcots/src/payloads/ClientTrackingMessage.ts diff --git a/packages/mcots/payloads/LoginCompleteMessage.ts b/packages/mcots/src/payloads/LoginCompleteMessage.ts similarity index 100% rename from packages/mcots/payloads/LoginCompleteMessage.ts rename to packages/mcots/src/payloads/LoginCompleteMessage.ts diff --git a/packages/mcots/payloads/LoginMessage.ts b/packages/mcots/src/payloads/LoginMessage.ts similarity index 100% rename from packages/mcots/payloads/LoginMessage.ts rename to packages/mcots/src/payloads/LoginMessage.ts diff --git a/packages/mcots/payloads/SetOptionsMessage.ts b/packages/mcots/src/payloads/SetOptionsMessage.ts similarity index 100% rename from packages/mcots/payloads/SetOptionsMessage.ts rename to packages/mcots/src/payloads/SetOptionsMessage.ts diff --git a/packages/mcots/payloads/StockCar.ts b/packages/mcots/src/payloads/StockCar.ts similarity index 100% rename from packages/mcots/payloads/StockCar.ts rename to packages/mcots/src/payloads/StockCar.ts diff --git a/packages/mcots/payloads/index.ts b/packages/mcots/src/payloads/index.ts similarity index 100% rename from packages/mcots/payloads/index.ts rename to packages/mcots/src/payloads/index.ts diff --git a/packages/mcots/payloads/utils.test.ts b/packages/mcots/src/payloads/utils.test.ts similarity index 100% rename from packages/mcots/payloads/utils.test.ts rename to packages/mcots/src/payloads/utils.test.ts diff --git a/packages/mcots/payloads/utils.ts b/packages/mcots/src/payloads/utils.ts similarity index 100% rename from packages/mcots/payloads/utils.ts rename to packages/mcots/src/payloads/utils.ts diff --git a/packages/mcots/types.ts b/packages/mcots/src/types.ts similarity index 100% rename from packages/mcots/types.ts rename to packages/mcots/src/types.ts diff --git a/packages/mcots/test/ErrorNoKey.test.ts b/packages/mcots/test/ErrorNoKey.test.ts index 185aad170..71c68fe3d 100644 --- a/packages/mcots/test/ErrorNoKey.test.ts +++ b/packages/mcots/test/ErrorNoKey.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { ErrorNoKey } from '../errors/ErrorNoKey'; +import { ErrorNoKey } from '../src/errors/ErrorNoKey'; describe('ErrorNoKey', () => { it('should have default message "No key provided" when no message is given', () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ea753d78..3699804b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,6 +44,9 @@ importers: rusty-motors-cli: specifier: link:packages/cli version: link:packages/cli + rusty-motors-connection: + specifier: link:packages/connection + version: link:packages/connection rusty-motors-database: specifier: link:packages/database version: link:packages/database @@ -56,6 +59,9 @@ importers: rusty-motors-login: specifier: link:packages/login version: link:packages/login + rusty-motors-mcots: + specifier: link:packages/mcots + version: link:packages/mcots rusty-motors-nps: specifier: link:packages/nps version: link:packages/nps @@ -176,6 +182,15 @@ importers: specifier: ^2.0.5 version: 2.0.5(@types/node@22.5.0) + packages/connection: + dependencies: + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@22.5.0) + packages/database: dependencies: '@databases/pg': @@ -2593,21 +2608,36 @@ packages: peerDependencies: vitest: 2.0.5 + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.5': resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==} '@vitest/pretty-format@2.0.5': resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==} + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/runner@2.0.5': resolution: {integrity: sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==} + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/snapshot@2.0.5': resolution: {integrity: sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==} + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/spy@2.0.5': resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==} + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.5': resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==} @@ -2751,6 +2781,9 @@ packages: assert-never@1.3.0: resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -2877,6 +2910,10 @@ packages: resolution: {integrity: sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A==} engines: {node: '>= 10'} + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + chai@5.1.1: resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} engines: {node: '>=12'} @@ -2900,6 +2937,9 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} @@ -3001,6 +3041,9 @@ packages: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + conventional-changelog-angular@5.0.13: resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} engines: {node: '>=10'} @@ -3164,6 +3207,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-eql@5.0.2: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} @@ -3215,6 +3262,10 @@ packages: engines: {node: '>= 4.0.0'} hasBin: true + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} @@ -3984,6 +4035,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -4084,6 +4138,10 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + locate-path@2.0.0: resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} engines: {node: '>=4'} @@ -4144,6 +4202,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -4277,6 +4338,9 @@ packages: engines: {node: '>=10'} hasBin: true + mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + modern-spawn@1.0.0: resolution: {integrity: sha512-VYCaPqxfHcbUndhf3ucm8ntIPqTbVDgcF5QRtZyB4AUYVx+y5ZfU5wRBiYyjzPW6vLvOHm3mdW/X9boZPnSLlQ==} @@ -4427,6 +4491,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -4511,6 +4579,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -4616,6 +4687,9 @@ packages: resolution: {integrity: sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==} engines: {node: '>=6'} + pkg-types@1.2.0: + resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -5351,6 +5425,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + styled-components@5.3.9: resolution: {integrity: sha512-Aj3kb13B75DQBo2oRwRa/APdB5rSmwUfN5exyarpX+x/tlM/rwZA2vVk2vQgVSP6WKaZJHWwiFrzgHt+CLtB4A==} engines: {node: '>=10'} @@ -5435,6 +5512,10 @@ packages: tinymce@6.8.4: resolution: {integrity: sha512-okoJyxuPv1gzASxQDNgQbnUXOdAIyoOSXcXcZZu7tiW0PSKEdf3SdASxPBupRj+64/E3elHwVRnzSdo82Emqbg==} + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + tinypool@1.0.1: resolution: {integrity: sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5443,6 +5524,10 @@ packages: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + tinyspy@3.0.0: resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} @@ -5518,6 +5603,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + type-fest@0.18.1: resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} engines: {node: '>=10'} @@ -5560,6 +5649,9 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uglify-js@3.19.2: resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} engines: {node: '>=0.8.0'} @@ -5644,6 +5736,11 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + vite-node@2.0.5: resolution: {integrity: sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5680,6 +5777,31 @@ packages: terser: optional: true + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + vitest@2.0.5: resolution: {integrity: sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -5836,6 +5958,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} engines: {node: '>=18'} @@ -8356,6 +8482,12 @@ snapshots: transitivePeerDependencies: - supports-color + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.5.0 + '@vitest/expect@2.0.5': dependencies: '@vitest/spy': 2.0.5 @@ -8367,21 +8499,44 @@ snapshots: dependencies: tinyrainbow: 1.2.0 + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + '@vitest/runner@2.0.5': dependencies: '@vitest/utils': 2.0.5 pathe: 1.1.2 + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.11 + pathe: 1.1.2 + pretty-format: 29.7.0 + '@vitest/snapshot@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 magic-string: 0.30.11 pathe: 1.1.2 + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + '@vitest/spy@2.0.5': dependencies: tinyspy: 3.0.0 + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + '@vitest/utils@2.0.5': dependencies: '@vitest/pretty-format': 2.0.5 @@ -8552,6 +8707,8 @@ snapshots: assert-never@1.3.0: {} + assertion-error@1.1.0: {} + assertion-error@2.0.1: {} asynckit@0.4.0: {} @@ -8701,6 +8858,16 @@ snapshots: dependencies: lodash: 4.17.21 + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + chai@5.1.1: dependencies: assertion-error: 2.0.1 @@ -8732,6 +8899,10 @@ snapshots: chardet@0.7.0: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + check-error@2.1.1: {} cjs-module-lexer@1.3.1: {} @@ -8819,6 +8990,8 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 + confbox@0.1.7: {} + conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 @@ -9023,6 +9196,10 @@ snapshots: decamelize@1.2.0: {} + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + deep-eql@5.0.2: {} deep-equal@2.2.3: @@ -9083,6 +9260,8 @@ snapshots: transitivePeerDependencies: - supports-color + diff-sequences@29.6.3: {} + diff@4.0.2: {} dir-glob@3.0.1: @@ -9942,6 +10121,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.0: {} + js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -10058,6 +10239,11 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + local-pkg@0.5.0: + dependencies: + mlly: 1.7.1 + pkg-types: 1.2.0 + locate-path@2.0.0: dependencies: p-locate: 2.0.0 @@ -10119,6 +10305,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -10245,6 +10435,13 @@ snapshots: mkdirp@1.0.4: {} + mlly@1.7.1: + dependencies: + acorn: 8.12.1 + pathe: 1.1.2 + pkg-types: 1.2.0 + ufo: 1.5.4 + modern-spawn@1.0.0: dependencies: cross-spawn: 7.0.3 @@ -10403,6 +10600,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-limit@5.0.0: + dependencies: + yocto-queue: 1.1.1 + p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -10470,6 +10671,8 @@ snapshots: pathe@1.1.2: {} + pathval@1.1.1: {} + pathval@2.0.0: {} pg-cloudflare@1.1.1: @@ -10585,6 +10788,12 @@ snapshots: dependencies: find-up: 3.0.0 + pkg-types@1.2.0: + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + pluralize@8.0.0: {} polished@4.3.1: @@ -11364,6 +11573,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + styled-components@5.3.9(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) @@ -11470,10 +11683,14 @@ snapshots: tinymce@6.8.4: {} + tinypool@0.8.4: {} + tinypool@1.0.1: {} tinyrainbow@1.2.0: {} + tinyspy@2.2.1: {} + tinyspy@3.0.0: {} tippy.js@6.3.7: @@ -11539,6 +11756,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-detect@4.1.0: {} + type-fest@0.18.1: {} type-fest@0.20.2: {} @@ -11566,6 +11785,8 @@ snapshots: uc.micro@2.1.0: {} + ufo@1.5.4: {} + uglify-js@3.19.2: optional: true @@ -11629,6 +11850,24 @@ snapshots: vary@1.1.2: {} + vite-node@1.6.0(@types/node@22.5.0): + dependencies: + cac: 6.7.14 + debug: 4.3.6(supports-color@5.5.0) + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.4.2(@types/node@22.5.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vite-node@2.0.5(@types/node@22.5.0): dependencies: cac: 6.7.14 @@ -11656,6 +11895,40 @@ snapshots: '@types/node': 22.5.0 fsevents: 2.3.3 + vitest@1.6.0(@types/node@22.5.0): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.3 + chai: 4.5.0 + debug: 4.3.6(supports-color@5.5.0) + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.11 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.9.0 + tinypool: 0.8.4 + vite: 5.4.2(@types/node@22.5.0) + vite-node: 1.6.0(@types/node@22.5.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/node': 22.5.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + vitest@2.0.5(@types/node@22.5.0): dependencies: '@ampproject/remapping': 2.3.0 @@ -11830,4 +12103,6 @@ snapshots: yocto-queue@0.1.0: {} + yocto-queue@1.1.1: {} + yoctocolors-cjs@2.1.2: {} From 3aec526a6ad0bcc22f51a1c02de9f55a82ea9f90 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 19:39:49 -0400 Subject: [PATCH 82/84] refactor: Update import paths for shared modules in connection, gateway, lobby, login, and mcots packages starts, lobby loads, new toon dupe --- packages/connection/package.json | 4 +++- packages/connection/src/Connection.ts | 16 ++++++---------- .../messageProcessors/processClientConnect.ts | 4 ++-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/connection/package.json b/packages/connection/package.json index 6518bd1d3..2a50ae116 100644 --- a/packages/connection/package.json +++ b/packages/connection/package.json @@ -12,7 +12,9 @@ "check": "tsc", "lint": "eslint .", "format": "npm prettier --write .", - "test": "vitest run --coverage" + "test:db": "vitest run --coverage", + "test:diabled": "dotenvx run -f ../../.env -- pnpm run test:db", + "test": "echo 'No tests yet' && exit 0" }, "keywords": [], "author": "", diff --git a/packages/connection/src/Connection.ts b/packages/connection/src/Connection.ts index eff262825..ea585199d 100644 --- a/packages/connection/src/Connection.ts +++ b/packages/connection/src/Connection.ts @@ -17,9 +17,7 @@ import type { Socket } from "node:net"; import { ServerMessage } from "rusty-motors-shared-packets"; import { getServerMessageProcessor } from "rusty-motors-mcots"; -import type { TServerLogger } from "rusty-motors-shared"; import * as Sentry from "@sentry/node"; -import { db } from "rusty-motors-database"; import { createCipheriv, createDecipheriv, getCiphers } from "node:crypto"; import { McosEncryptionPair } from "rusty-motors-shared"; import { ClientConnectionManager } from "rusty-motors-mcots"; @@ -104,7 +102,6 @@ export function verifyLegacyCipherSupport() { export class Connection { private _socket: Socket; private _connectionId: string; - private _logger: TServerLogger; private _personaId: number | null = null; private _cipherPair: McosEncryptionPair | null = null; private _channelSecure: boolean = false; @@ -113,10 +110,9 @@ export class Connection { return this._connectionId; } - constructor(socket: Socket, connectionId: string, logger: TServerLogger) { + constructor(socket: Socket, connectionId: string) { this._socket = socket; this._connectionId = connectionId; - this._logger = logger; this._socket.on("data", (data) => this.handleServerSocketData(data)); this._socket.on("error", (error) => @@ -124,7 +120,7 @@ export class Connection { ); this._socket.on("close", () => this.close()); - this._logger.debug(`Connection ${this._connectionId} created`); + log.debug(`Connection ${this._connectionId} created`); } get id(): string { @@ -137,7 +133,7 @@ export class Connection { setChannelSecure(channelSecure: boolean): void { if (channelSecure && this._cipherPair === null) { - this._logger.error( + log.error( `Tried to set channel secure without a cipher pair for connection ${this._connectionId}`, ); throw new Error( @@ -152,13 +148,13 @@ export class Connection { } private async _getCiperKeyFromDatabase() { - this._logger.setName("Connection:_getCiperKeyFromDatabase"); + log.debug(`Getting cipher key from database for persona ID ${this._personaId}`); if (this._cipherPair !== null) { return; } if (typeof this._personaId !== "number") { - this._logger.error( + log.error( `Tried to get cipher key from database without a persona ID`, ); throw new Error( @@ -167,7 +163,7 @@ export class Connection { } // Get the cipher key from the database - const session_key = await getDatabase() + const session_key = await db .select() .from(keySchema) .where(eq(keySchema.userId, this._personaId)) diff --git a/packages/mcots/src/messageProcessors/processClientConnect.ts b/packages/mcots/src/messageProcessors/processClientConnect.ts index ad7c65600..6b90674ae 100644 --- a/packages/mcots/src/messageProcessors/processClientConnect.ts +++ b/packages/mcots/src/messageProcessors/processClientConnect.ts @@ -10,14 +10,14 @@ import { getServerLogger } from "rusty-motors-shared"; import { ServerMessage } from "rusty-motors-shared-packets"; import { sendSuccess } from "./sendSuccess.js"; -const log = getServerLogger(); +const log = getServerLogger({}); export async function processClientConnect( connectionId: string, message: ServerMessage, socketCallback: ServerSocketCallback, ): Promise { - log.setName("processClientConnect"); + log.debug(`Processing client connect request: ${message.toString()}`); try { log.debug(`Processing client connect request: ${message.toString()}`); From e2ecbf1f360b1d80d29569f0599cb8f5eaddc0cf Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Sun, 25 Aug 2024 19:40:27 -0400 Subject: [PATCH 83/84] refactor: create sessions module starts, lobby loads, new toon dupe --- package.json | 1 + packages/sessions/index.ts | 8 ++ packages/sessions/package.json | 29 +++++ packages/sessions/src/index.ts | 166 +++++++++++++++++++++++++++ packages/sessions/test/index.test.ts | 87 ++++++++++++++ packages/sessions/tsconfig.json | 11 ++ packages/sessions/vite.config.ts | 23 ++++ pnpm-lock.yaml | 19 +++ 8 files changed, 344 insertions(+) create mode 100644 packages/sessions/index.ts create mode 100644 packages/sessions/package.json create mode 100644 packages/sessions/src/index.ts create mode 100644 packages/sessions/test/index.test.ts create mode 100644 packages/sessions/tsconfig.json create mode 100644 packages/sessions/vite.config.ts diff --git a/package.json b/package.json index 96a805b57..02206dd7a 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "rusty-motors-login": "link:packages/login", "rusty-motors-mcots": "link:packages/mcots", "rusty-motors-nps": "link:packages/nps", + "rusty-motors-sessions": "link:packages/sessions", "rusty-motors-shared": "link:packages/shared", "rusty-motors-shared-packets": "link:packages/shared-packets", "rusty-motors-transactions": "link:packages/transactions", diff --git a/packages/sessions/index.ts b/packages/sessions/index.ts new file mode 100644 index 000000000..82dfb4fc0 --- /dev/null +++ b/packages/sessions/index.ts @@ -0,0 +1,8 @@ +export { + saveClientConnection, + findClientByCustomerId, + hasClientEncryptionPair, + newClientConnection, + setClientEncryption, + clearConnectedClients, +} from "./src/index.js"; diff --git a/packages/sessions/package.json b/packages/sessions/package.json new file mode 100644 index 000000000..ad2d1f282 --- /dev/null +++ b/packages/sessions/package.json @@ -0,0 +1,29 @@ +{ + "name": "rusty-motors-sessions", + "version": "1.0.0", + "exports": { + ".": { + "import": "./index.js", + "require": "./index.js" + } + }, + "type": "module", + "scripts": { + "check": "tsc", + "lint": "eslint .", + "format": "npm prettier --write .", + "test": "vitest run --coverage" + }, + "keywords": [], + "author": "", + "license": "AGPL-3.0", + "dependencies": { + "@sentry/node": "^8.0.0", + "short-unique-id": "^5.0.3" + }, + "description": "", + "devDependencies": { + "@vitest/coverage-v8": "2", + "vitest": "^2.0.5" + } +} diff --git a/packages/sessions/src/index.ts b/packages/sessions/src/index.ts new file mode 100644 index 000000000..a21dfcce5 --- /dev/null +++ b/packages/sessions/src/index.ts @@ -0,0 +1,166 @@ +import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto"; + +/** + * Represents a pair of encryption and decryption functions. + */ +type CipherPair = { + /** The encryption function */ + encrypt: (data: Buffer) => Buffer; + /** The decryption function */ + decrypt: (data: Buffer) => Buffer; +}; + +/** + * Generates a pair of cipher and decipher functions for game encryption. + * @returns The cipher and decipher functions. + */ +function createGameEncryptionPair(): CipherPair { + const key = randomBytes(32); + const iv = randomBytes(16); + const cipher = createCipheriv("aes-256-cbc", key, iv); + const decipher = createDecipheriv("aes-256-cbc", key, iv); + return { + encrypt: cipher.update.bind(cipher), + decrypt: decipher.update.bind(decipher), + }; +} + +/** + * Generates a pair of encryption and decryption functions for the server. + * + * @returns {CipherPair} The encryption and decryption functions. + */ +function createServerEncryptionPair(): CipherPair { + const key = randomBytes(32); + const iv = randomBytes(16); + const cipher = createCipheriv("aes-256-cbc", key, iv); + const decipher = createDecipheriv("aes-256-cbc", key, iv); + return { + encrypt: cipher.update.bind(cipher), + decrypt: decipher.update.bind(decipher), + }; +} + +type ConnectedClient = { + /** The connection ID for the client */ + connectionId: string; + /** The customer ID for the client */ + customerId: number; + /** The session key for the client */ + sessionKey?: string; + /** The game encryption pair for the client, if known */ + gameEncryptionPair?: ReturnType; + /** The server encryption pair for the client, if known */ + serverEncryptionPair?: ReturnType; + /** Whether the game encryption handshake is complete */ + gameEncryptionHandshakeComplete: boolean; + /** Whether the server encryption handshake is complete */ + serverEncryptionHandshakeComplete: boolean; +}; + + + +/** + * Sets the client encryption for a connected client. + * + * @param client - The connected client to set the encryption for. + * @param sessionKey - The session key to associate with the client. + * @returns The updated connected client with the encryption set. + */ +export function setClientEncryption(client: ConnectedClient, sessionKey: string): ConnectedClient { + const gameEncryptionPair = createGameEncryptionPair(); + const serverEncryptionPair = createServerEncryptionPair(); + client.sessionKey = sessionKey; + client.gameEncryptionPair = gameEncryptionPair; + client.serverEncryptionPair = serverEncryptionPair; + return client; +} + +/** + * Represents a record of connected clients. + * The key is the connection ID. + * The value is the connected client. + */ +const connectedClients: Record = {}; + +/** + * Finds a connected client by their customer ID. + * + * @param customerId - The customer ID to search for. + * @returns The connected client with the specified customer ID. + * @throws Error if no client is found with the given customer ID. + */ +export function findClientByCustomerId( + customerId: number, +): ConnectedClient { + const client = Object.values(connectedClients).find( + (client) => client.customerId === customerId, + ); + if (typeof client === "undefined") { + throw new Error(`Client with customer ID ${customerId} not found`); + } + return client; +} + +type connectionType = "game" | "server"; + +/** + * Checks if a client has an encryption pair based on the connection type. + * @param client - The connected client. + * @param connectionType - The type of connection ("game" or "server"). + * @returns A boolean indicating whether the client has an encryption pair. + */ +export function hasClientEncryptionPair( + client: ConnectedClient, + connectionType: connectionType, +): boolean { + if (connectionType === "game") { + return !!client.gameEncryptionPair; + } else { + return !!client.serverEncryptionPair; + } +} + +/** + * Creates a new client connection. + * + * @param connectionId - The ID of the connection. + * @param customerId - The ID of the customer. + * @param sessionKey - The session key (optional). + * @returns A ConnectedClient object representing the new client connection. + */ +export function newClientConnection( + connectionId: string, + customerId: number, + sessionKey?: string, +): ConnectedClient { + return { + connectionId, + customerId, + sessionKey, + gameEncryptionHandshakeComplete: false, + serverEncryptionHandshakeComplete: false, + }; +} + +/** + * Saves the client connection with the specified connection ID. + * + * @param connectionId - The ID of the connection. + * @param client - The connected client to be saved. + */ +export function saveClientConnection( + connectionId: string, + client: ConnectedClient, +): void { + connectedClients[connectionId] = client; +} + +/** + * Clears all connected clients. + */ +export function clearConnectedClients(): void { + for (const connectionId in connectedClients) { + delete connectedClients[connectionId]; + } +} diff --git a/packages/sessions/test/index.test.ts b/packages/sessions/test/index.test.ts new file mode 100644 index 000000000..e353cf14d --- /dev/null +++ b/packages/sessions/test/index.test.ts @@ -0,0 +1,87 @@ +import { beforeEach, describe, expect, it } from "vitest"; +import { saveClientConnection, clearConnectedClients, findClientByCustomerId, hasClientEncryptionPair, newClientConnection, setClientEncryption } from "../index.js" + +describe("Client connections", () => { + describe("newClientConnection", () => { + it("should create a new client connection", () => { + const connectionId = "123"; + const customerId = 456; + + const client = newClientConnection(connectionId, customerId); + + expect(client.connectionId).toBe(connectionId); + expect(client.customerId).toBe(customerId); + expect(client.gameEncryptionHandshakeComplete).toBe(false); + expect(client.serverEncryptionHandshakeComplete).toBe(false); + }); + }); + + describe("saveClientConnection", () => { + it("should save a client connection", () => { + const connectionId = "123"; + const customerId = 456; + const client = newClientConnection(connectionId, customerId); + + saveClientConnection(connectionId, client); + + expect(findClientByCustomerId(customerId)).toBe(client); + }); + }); + + describe("findClientByCustomerId", () => { + + beforeEach(() => { + clearConnectedClients(); + }); + + it("should find a client by customer ID", () => { + const connectionId = "123"; + const customerId = 456; + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + expect(findClientByCustomerId(customerId)).toBe(client); + }); + + it("should throw an error if the client is not found", () => { + const customerId = 456; + + expect(() => findClientByCustomerId(customerId)).toThrow( + `Client with customer ID ${customerId} not found`, + ); + }); + }); + + describe("hasClientEncryptionPair", () => { + it("should return true if the client has an encryption pair", () => { + const connectionId = "123"; + const customerId = 456; + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + expect(hasClientEncryptionPair(client, "game")).toBe(false); + expect(hasClientEncryptionPair(client, "server")).toBe(false); + + setClientEncryption(client, "sessionKey"); + + expect(hasClientEncryptionPair(client, "game")).toBe(true); + expect(hasClientEncryptionPair(client, "server")).toBe(true); + }); + }); + + describe("clearConnectedClients", () => { + it("should clear all connected clients", () => { + const connectionId = "123"; + const customerId = 456; + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + clearConnectedClients(); + + expect(() => findClientByCustomerId(customerId)).toThrow( + `Client with customer ID ${customerId} not found`, + ); + }); + }); +}); + \ No newline at end of file diff --git a/packages/sessions/tsconfig.json b/packages/sessions/tsconfig.json new file mode 100644 index 000000000..751b5710c --- /dev/null +++ b/packages/sessions/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "./../../tsconfig.base.json", + "compilerOptions": { + "incremental": true, + "composite": true + }, + "include": [ + "index.ts", + "src" + ] +} \ No newline at end of file diff --git a/packages/sessions/vite.config.ts b/packages/sessions/vite.config.ts new file mode 100644 index 000000000..efe0ba0db --- /dev/null +++ b/packages/sessions/vite.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + coverage: { + enabled: true, + all: true, + exclude: [ + "src/**/*.spec.ts", + "src/**/*.test.ts", + "bin/**/*.ts", + "ecosystem.config.js", + "migrate.ts", + "packages/**/*.d.ts", + "vite.config.ts" + ], + reporter: ["lcov", "text", "cobertura"], + }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3699804b5..e2fe60c41 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,6 +65,9 @@ importers: rusty-motors-nps: specifier: link:packages/nps version: link:packages/nps + rusty-motors-sessions: + specifier: link:packages/sessions + version: link:packages/sessions rusty-motors-shared: specifier: link:packages/shared version: link:packages/shared @@ -320,6 +323,22 @@ importers: specifier: ^2.0.5 version: 2.0.5(@types/node@22.5.0) + packages/sessions: + dependencies: + '@sentry/node': + specifier: ^8.0.0 + version: 8.26.0 + short-unique-id: + specifier: ^5.0.3 + version: 5.2.0 + devDependencies: + '@vitest/coverage-v8': + specifier: '2' + version: 2.0.5(vitest@2.0.5(@types/node@22.5.0)) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.0) + packages/shard: devDependencies: '@vitest/coverage-v8': From bf8bd2b410727e74e66c2cf939ee25d8ae3b9860 Mon Sep 17 00:00:00 2001 From: Molly Draven Date: Mon, 26 Aug 2024 11:11:11 -0400 Subject: [PATCH 84/84] refactor: Add test directory to tsconfig.json The tsconfig.json file in the sessions package has been updated to include the "test" directory in the "include" section. This change ensures that the test files are included in the TypeScript compilation process. --- packages/sessions/src/index.ts | 133 ++++++++++++++++++++------- packages/sessions/test/index.test.ts | 57 ++++++++++-- packages/sessions/tsconfig.json | 3 +- 3 files changed, 151 insertions(+), 42 deletions(-) diff --git a/packages/sessions/src/index.ts b/packages/sessions/src/index.ts index a21dfcce5..736f95608 100644 --- a/packages/sessions/src/index.ts +++ b/packages/sessions/src/index.ts @@ -1,4 +1,4 @@ -import { createCipheriv, createDecipheriv, randomBytes } from "node:crypto"; +import { createCipheriv, createDecipheriv } from "node:crypto"; /** * Represents a pair of encryption and decryption functions. @@ -14,31 +14,75 @@ type CipherPair = { * Generates a pair of cipher and decipher functions for game encryption. * @returns The cipher and decipher functions. */ -function createGameEncryptionPair(): CipherPair { - const key = randomBytes(32); - const iv = randomBytes(16); - const cipher = createCipheriv("aes-256-cbc", key, iv); - const decipher = createDecipheriv("aes-256-cbc", key, iv); - return { - encrypt: cipher.update.bind(cipher), - decrypt: decipher.update.bind(decipher), - }; +function createGameEncryptionPair(key: string): CipherPair { + try { + assertStringIsHex(key); + if (key.length !== 16) { + throw Error( + `Invalid game key length: ${key.length}. The key must be 16 bytes long.`, + ); + } + + // The key used by the game 8 bytes long. + // Since the key is in hex format, we need to slice it to 16 characters. + key = key.slice(0, 16); + + // The IV is intentionally required to be all zeros. + const iv = Buffer.alloc(8); + const keyBuffer = Buffer.from(key, "hex"); + + // The algorithm is intentionally set to "des-cbc". + // This is because the game uses this insecure algorithm. + // We are intentionally using an insecure algorithm here to match the game. + const cipher = createCipheriv("des-cbc", keyBuffer, iv); + const decipher = createDecipheriv("des-cbc", keyBuffer, iv); + + return { + encrypt: cipher.update.bind(cipher), + decrypt: decipher.update.bind(decipher), + }; + } catch (error: unknown) { + const err = new Error(`Failed to create game encryption pair`); + err.cause = error; + throw err; + } } /** * Generates a pair of encryption and decryption functions for the server. - * + * + * @param key - The key to use for encryption and decryption. Must be 16 hex characters. * @returns {CipherPair} The encryption and decryption functions. */ -function createServerEncryptionPair(): CipherPair { - const key = randomBytes(32); - const iv = randomBytes(16); - const cipher = createCipheriv("aes-256-cbc", key, iv); - const decipher = createDecipheriv("aes-256-cbc", key, iv); - return { - encrypt: cipher.update.bind(cipher), - decrypt: decipher.update.bind(decipher), - }; +function createServerEncryptionPair(key: string): CipherPair { + try { + assertStringExists(key); + assertStringIsHex(key); + if (key.length !== 16) { + throw Error( + `Invalid server key length: ${key.length}. The key must be 16 bytes long.`, + ); + } + + // The IV is intentionally required to be empty. + const iv = Buffer.alloc(0); + const keyBuffer = Buffer.from(key, "hex"); + + // The algorithm is intentionally set to "rc4". + // This is because the game uses this insecure algorithm. + // We are intentionally using an insecure algorithm here to match the game. + const cipher = createCipheriv("rc4", keyBuffer, iv); + const decipher = createDecipheriv("rc4", keyBuffer, iv); + + return { + encrypt: cipher.update.bind(cipher), + decrypt: decipher.update.bind(decipher), + }; + } catch (error: unknown) { + const err = new Error(`Failed to create server encryption pair`); + err.cause = error; + throw err; + } } type ConnectedClient = { @@ -58,21 +102,28 @@ type ConnectedClient = { serverEncryptionHandshakeComplete: boolean; }; - - /** * Sets the client encryption for a connected client. - * + * * @param client - The connected client to set the encryption for. * @param sessionKey - The session key to associate with the client. * @returns The updated connected client with the encryption set. */ -export function setClientEncryption(client: ConnectedClient, sessionKey: string): ConnectedClient { - const gameEncryptionPair = createGameEncryptionPair(); - const serverEncryptionPair = createServerEncryptionPair(); - client.sessionKey = sessionKey; - client.gameEncryptionPair = gameEncryptionPair; - client.serverEncryptionPair = serverEncryptionPair; +export function setClientEncryption( + client: ConnectedClient, + sessionKey: string, +): ConnectedClient { + try { + const gameEncryptionPair = createGameEncryptionPair(sessionKey); + const serverEncryptionPair = createServerEncryptionPair(sessionKey); + client.sessionKey = sessionKey; + client.gameEncryptionPair = gameEncryptionPair; + client.serverEncryptionPair = serverEncryptionPair; + } catch (error: unknown) { + const err = new Error(`Failed to set client encryption`); + err.cause = error; + throw err; + } return client; } @@ -90,9 +141,7 @@ const connectedClients: Record = {}; * @returns The connected client with the specified customer ID. * @throws Error if no client is found with the given customer ID. */ -export function findClientByCustomerId( - customerId: number, -): ConnectedClient { +export function findClientByCustomerId(customerId: number): ConnectedClient { const client = Object.values(connectedClients).find( (client) => client.customerId === customerId, ); @@ -145,7 +194,7 @@ export function newClientConnection( /** * Saves the client connection with the specified connection ID. - * + * * @param connectionId - The ID of the connection. * @param client - The connected client to be saved. */ @@ -164,3 +213,21 @@ export function clearConnectedClients(): void { delete connectedClients[connectionId]; } } + +function assertStringExists(str: string): void { + if (str === "" || typeof str === "undefined") { + throw new Error("String not provided"); + } +} + +/** + * Asserts that a given string is a valid hexadecimal string. + * + * @param str - The string to be validated. + * @throws {Error} If the string is not a valid hexadecimal string. + */ +function assertStringIsHex(str: string): void { + if (!/^[0-9a-fA-F]+$/.test(str)) { + throw new Error(`Invalid hex string: ${str}`); + } +} diff --git a/packages/sessions/test/index.test.ts b/packages/sessions/test/index.test.ts index e353cf14d..fb95ff18c 100644 --- a/packages/sessions/test/index.test.ts +++ b/packages/sessions/test/index.test.ts @@ -1,7 +1,18 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { saveClientConnection, clearConnectedClients, findClientByCustomerId, hasClientEncryptionPair, newClientConnection, setClientEncryption } from "../index.js" +import { + saveClientConnection, + clearConnectedClients, + findClientByCustomerId, + hasClientEncryptionPair, + newClientConnection, + setClientEncryption, +} from "../index.js"; describe("Client connections", () => { + beforeEach(() => { + clearConnectedClients(); + }); + describe("newClientConnection", () => { it("should create a new client connection", () => { const connectionId = "123"; @@ -29,11 +40,6 @@ describe("Client connections", () => { }); describe("findClientByCustomerId", () => { - - beforeEach(() => { - clearConnectedClients(); - }); - it("should find a client by customer ID", () => { const connectionId = "123"; const customerId = 456; @@ -52,17 +58,53 @@ describe("Client connections", () => { }); }); + describe("setClientEncryption", () => { + it("should set the client encryption pair", () => { + const connectionId = "123"; + const customerId = 456; + const sessionKey = "ea25e21a2a022d71"; + + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + setClientEncryption(client, sessionKey); + + expect(client.sessionKey).toBe(sessionKey); + }); + + it("should throw an error if the session key is not provided", () => { + const connectionId = "123"; + const customerId = 456; + + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + expect(() => setClientEncryption(client, "")).toThrow(); + }); + + it("should throw an error if the session key is invalid", () => { + const connectionId = "123"; + const customerId = 456; + + const client = newClientConnection(connectionId, customerId); + saveClientConnection(connectionId, client); + + expect(() => setClientEncryption(client, "invalid")).toThrow(); + }); + }); + describe("hasClientEncryptionPair", () => { it("should return true if the client has an encryption pair", () => { const connectionId = "123"; const customerId = 456; + const sessionKey = "ea25e21a2a022d71"; const client = newClientConnection(connectionId, customerId); saveClientConnection(connectionId, client); expect(hasClientEncryptionPair(client, "game")).toBe(false); expect(hasClientEncryptionPair(client, "server")).toBe(false); - setClientEncryption(client, "sessionKey"); + setClientEncryption(client, sessionKey); expect(hasClientEncryptionPair(client, "game")).toBe(true); expect(hasClientEncryptionPair(client, "server")).toBe(true); @@ -84,4 +126,3 @@ describe("Client connections", () => { }); }); }); - \ No newline at end of file diff --git a/packages/sessions/tsconfig.json b/packages/sessions/tsconfig.json index 751b5710c..e6cbe5160 100644 --- a/packages/sessions/tsconfig.json +++ b/packages/sessions/tsconfig.json @@ -6,6 +6,7 @@ }, "include": [ "index.ts", - "src" + "src", + "test" ] } \ No newline at end of file